4 Oracle Big Data Applianceと併用するためのOracle Exadata Database Machineの構成

この章では、Oracle Exadata Database MachineとOracle Big Data Applianceの間での通信の最適化に関する情報を提供します。ここでは、インフィニバンド単体、あるいはSDP overインフィニバンドを使用してOracle Big Data Applianceと通信するようOracle Exadata Database Machineを構成する方法を説明しています。

この章は次の項で構成されています:

4.1 通信の最適化について

Oracle Exadata Database MachineとOracle Big Data Applianceはデフォルトではイーサネットを使用しますが、通常はインフィニバンド・ネットワークでも接続されます。イーサネットは、通信速度がインフィニバンドよりはるかに落ちます。Oracle Exadata Database Machineはインフィニバンドを使用して通信するよう構成すると、Oracle Big Data Applianceからデータをこれまでより何倍も速く取り込むことができるようになります。

さらに、Oracle Big Data Appliance上で動作してデータをOracle Databaseへプッシュするクライアント・アプリケーションは、Sockets Direct Protocol (SDP)を使用することでさらにパフォーマンスを向上させることができます。SDPは、クラスタ化されたサーバー環境用の標準の通信プロトコルで、ネットワーク・インタフェース・カードとアプリケーション間のインタフェースを提供します。SDPを使用すると、アプリケーションがメッセージング処理の大部分をネットワーク・インタフェース・カード上に配置できるようになるため、CPUを他のタスクに開放できます。結果として、SDPによりネットワーク・レイテンシとCPU使用率を減らし、パフォーマンスを改善できます。

4.1.1 Oracle Exadata Database Machineにデータをプルするアプリケーションについて

Oracle SQL Connector for Hadoop Distributed File System (HDFS)は、Oracle Exadata Database Machineにデータをプルするアプリケーションの例です。このコネクタにより、Oracle外部表はHDFSファイルかHive表に格納されたデータにアクセスできるようになります。

外部表で、HDFSデータへのアクセスが可能になります。外部表を使用することで、HDFSデータを問い合せたりOracleデータベース表にロードしたりすることができます。

Oracle SQL Connector for HDFSは、Oracle Exadata Database Machineのデータベース・サーバー上で実行されるHadoopクライアントとして機能します。

Oracle SQL Connector for HDFS、あるいはデータをOracle Exadata Database Machineにプルする他のツールを使用する場合は、パフォーマンスを最適にするために、システムでインフィニバンドを使用するよう構成してください。「Oracle Big Data Applianceへのインフィニバンド接続の指定」を参照してください。

関連項目:

『Oracle Big Data Connectorsユーザーズ・ガイド』のOracle SQL Connector for HDFSに関する詳細

4.1.2 Oracle Exadata Database Machineにデータをプッシュするアプリケーションについて

Oracle Loader for Hadoopは、Oracle Exadata Database Machineにデータをプッシュするアプリケーションの例です。このコネクタは、HadoopクラスタからOracle Databaseの表にデータをすばやく移動するための効率的でパフォーマンスのよいローダーです。このコネクタを使用して、Oracle Big Data ApplianceからOracle Exadata Database Machineにデータをロードできます。

Oracle Loader for Hadoopは、Oracle Big Data Appliance上で実行されるデータベース・クライアントとして機能します。Oracle Big Data ApplianceからOracle Exadata Database Machineへのデータベース接続をインフィニバンド・ネットワーク上で確立する必要があります。これらのデータベース接続にSockets Direct Protocol (SDP)を使用することで、パフォーマンスがさらに向上します。

Oracle Loader for Hadoop、あるいはデータをOracle Exadata Database Machineにプッシュする他のツールを使用する場合は、パフォーマンスを最適にするために、システムでSDP overインフィニバンドを使用するよう、この章の説明に従って構成してください。

関連項目:

『Oracle Big Data Connectorsユーザーズ・ガイド』のOracle Loader for Hadoopに関する詳細

4.2 通信の最適化の前提条件

Oracle Big Data ApplianceとOracle Exadata Database Machineのラックは、インフィニバンド・ケーブルを使用して接続する必要があります。IPアドレスは、すべてのラックにわたって一意であり、かつインフィニバンド・ネットワーク用に同じサブネットを使用する必要があります。

関連項目:

4.3 Oracle Big Data Applianceへのインフィニバンド接続の指定

Oracle Big Data ApplianceサーバーのインフィニバンドIPアドレスを使用するようにOracle Exadata Database Machineを構成できます。構成しない場合、デフォルトのネットワークはEthernetです。インフィニバンド・ネットワークを使用することで、Oracle Big Data ApplianceとOracle Exadata Database Machineの間のすべてのデータ転送のパフォーマンスが向上します。

Oracle Big Data ApplianceのインフィニバンドIPアドレスを識別するには、次の手順に従います。

  1. まだインストールしていない場合は、Oracle Exadata Database MachineにCDHクライアントをインストールします。「CDHへのリモート・クライアント・アクセスの提供」を参照してください。

  2. すべてのOracle Big Data Applianceサーバーについて、プライベート・ホスト名とインフィニバンドIPアドレスのリストを取得します。

    1台のOracle Big Data Applianceラックには、6、12または18台のサーバーを搭載できます。

  3. root権限を使用して、Oracle Exadata Database Machineにログインします。

  4. Oracle Exadata Database Machine上で/etc/hostsを編集し、Oracle Big Data Applianceのホスト名とインフィニバンドIPアドレスを追加します。次に示すのは、連続したIPナンバリングの例です。

    192.168.8.1       bda1node01.example.com    bda1node01
    192.168.8.2       bda1node02.example.com    bda1node02
    192.168.8.3       bda1node03.example.com    bda1node03
    192.168.8.4       bda1node04.example.com    bda1node04
    192.168.8.5       bda1node05.example.com    bda1node05
    192.168.8.6       bda1node06.example.com    bda1node06
  5. /etc/nsswitch.confで、次のような行を探します。

    hosts:      files dns 

    この行で、記述の順序が逆(dns files)になっていないことを確認します。逆になっている場合、/etc/hostsに追加した記述は使用されません。必要に応じてファイルを編集します。

  6. すべてのOracle Big Data Applianceサーバーをpingします。pingが完了し、インフィニバンドIPアドレスが表示されたことを確認します。

    # ping bda1node01.example.com
    PING bda1node01.example.com (192.168.8.1) 56(84) bytes of data.
    64 bytes from bda1node01.example.com (192.168.8.1): icmp_seq=1 ttl=50 time=20.2 ms
         .
         .
         .
  7. Oracle Exadata Database Machine上でCDHをローカルに実行し、Oracle Big Data Applianceサーバーにサイズの大きいファイルをアップロードして、HDFSの機能をテストします。ネットワーク監視ツール(sarなど)で、インフィニバンド・デバイス上のI/Oアクティビティが示されることを確認します。

    ファイルをアップロードするには、次のような構文を使用します(この例では、localfile.datを、Oracle Big Data Applianceのnode05にあるHDFSのtestdirディレクトリにコピーしています)。

    hadoop fs -put localfile.dat hdfs://bda1node05.example.com/testdir/

4.4 Oracle Exadata Database Machineへのインフィニバンド接続の指定

Exadata Database MachineサーバーのインフィニバンドIPアドレスを使用するようにOracle Big Data Applianceを構成できます。この構成は、Oracle Big Data Appliance上でOracle Exadata Database Machineに接続する必要があるアプリケーションに対応します。

Oracle Exadata Database MachineのインフィニバンドIPアドレスを識別するには、次の手順を実行します。

  1. すべてのOracle Exadata Database Machineサーバーについて、プライベート・ホスト名とインフィニバンドIPアドレスのリストを取得します。

  2. root権限でOracle Big Data Applianceにログインします。

  3. Oracle Big Data Appliance上で/etc/hostsを編集し、Oracle Exadata Database Machineのホスト名とインフィニバンドIPアドレスを追加します。

  4. /etc/nsswitch.confで、次のような行を探します。

    hosts:      files dns 

    この行で、記述の順序が逆(dns files)になっていないことを確認します。逆になっている場合、/etc/hostsに追加した記述は使用されません。必要に応じてファイルを編集します。

  5. dnsmasqサービスを再起動します。

    # service dnsmasq restart
  6. すべてのOracle Exadata Database Machineサーバーをpingします。pingが完了し、インフィニバンドIPアドレスが表示されたことを確認します。

  7. サイズの大きいファイルをOracle Exadata Database Machineサーバーにダウンロードし、接続をテストします。ネットワーク監視ツール(sarなど)で、インフィニバンド・デバイス上のI/Oアクティビティが示されることを確認します。

    ファイルをダウンロードするには次のような構文を使用します。この例では、mydata.jsonという名前のファイルをdm01ce108ストレージ・サーバーにコピーします。

    $ scp mydata.json oracle@dm01cel08-priv.example.com:mybigdata.json
    oracle@dm01cel08-priv.example.com's password: password

4.5 Exadata DatabaseノードでのSDPの有効化

SDPによって、Oracle Big Data Appliance上で動作して大きなデータ・ロードをOracle Exadata Database Machine上のOracle Databaseにプッシュするクライアント・アプリケーションのパフォーマンスが向上します。

次の手順では、Oracle Linuxを実行しているOracle Exadata Database Machine内のデータベース・ノード上でSDPを有効化する方法について説明します。また、SDPを使用するジョブごとにアプリケーションを構成する必要があります。

Oracle Exadata Database Machine上でSDPを有効化するには、次の手順に従います。

  1. テキスト・エディタで/etc/infiniband/openib.confファイルを開いて、次の行を追加します。

    set: SDP_LOAD=yes
  2. これらの変更を保存し、ファイルを閉じます。

  3. SDPとTCPの両方を有効にするには、テキスト・エディタで/etc/ofed/libsdp.confを開き、use bothルールを追加します。

    use both server * : 
    use both client * : 
  4. これらの変更を保存し、ファイルを閉じます。

  5. テキスト・エディタで/etc/modprobe.confファイルを開いて、次の設定を追加します。

    options ib_sdp sdp_zcopy_thresh=0 recv_poll=0
  6. これらの変更を保存し、ファイルを閉じます。

  7. これらの変更を、Oracle Exadata Database Machineラック内のすべてのデータベース・ノードにレプリケートします。

  8. すべてのデータベース・ノードを再起動して、変更を有効化します。

  9. Oracle Exadata Database Machineラックが複数ある場合は、すべてのラックでこれらのステップを繰り返します。

次のようにして、SDPプロトコルをロード・ジョブに指定します。

  1. HADOOP_OPTS環境変数にJVMオプションを追加して、JDBC SDPエクスポートを有効にします。

    HADOOP_OPTS="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
  2. Hadoopコマンドまたはジョブの構成ファイルのいずれかで、mapred.child.java.opts構成プロパティを設定してSDPの子タスクJVMを有効にします。

    たとえば、MapReduceジョブのコマンドライン内のこれらのオプションを使用します。

    -D mapred.child.java.opts="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
  3. 標準のイーサネット通信をジョブに対して構成します。

    たとえば、Oracle Loader for Hadoopは、oracle.hadoop.loader.connection.urlプロパティの値をジョブ構成ファイルから読み込みます。この値は次の構文を使用します。

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
         (ADDRESS=(PROTOCOL=TCP)(HOST=hostName)(PORT=portNumber)))
         (CONNECT_DATA=(SERVICE_NAME=serviceName)))

    hostNameportNumberおよびserviceNameは、Oracle Exadata Database Machine上のSDPリスナーを識別するための適切な値に置き換えます。

  4. ExadataでOracleリスナーを、SDPプロトコルをサポートするように構成し、特定のポート・アドレス(1522など)にバインドします。

    たとえば、Oracle Loader for Hadoopは、oracle.hadoop.loader.connection.oci_urlプロパティの値をジョブ構成ファイルから読み込みます。この値は次の構文を使用します。

    (DESCRIPTION=(ADDRESS=(PROTOCOL=SDP)
        (HOST=hostName) (PORT=portNumber))
        (CONNECT_DATA=(SERVICE_NAME=serviceName)))

4.6 InfiniBandネットワーク上でのSDPリスナーの作成

インフィニバンド・ネットワーク上に着信するOracle Big Data Appliance接続に対するリスナーを追加するには、まず仮想IPアドレスを使用してインフィニバンド・ネットワーク用のネットワーク・リソースを追加します。

注意:

次の手順は、Oracle Linux 5を実行しているExadata V2、X2-2およびX3-2ノードに適用されます。My Oracle Supportのドキュメント1580584.1は、これらと同じシステムでの手順およびLinux 6を実行しているX4-2、X5-2およびX6-2での手順を説明しています。

次のこの例では、Oracle Exadata Database Machineクォータ・ラック用の2つのノードを列挙しています。Oracle Exadata Database Machineのハーフ・ラックまたはフル・ラックを使用している場合は、クラスタ内のノードごとにノード固有の行を繰り返す必要があります。

  1. Exadataラック内の各ノードで/etc/hostsを編集して、インフィニバンド・ネットワーク用の仮想IPアドレスを追加します。IPアドレスが使用中でないことを確認してください。次に例を示します。
    # Added for Listener over IB
    192.168.10.21 dm01db01-ibvip.example.com dm01db01-ibvip
    192.168.10.22 dm01db02-ibvip.example.com dm01db02-ibvip 
  2. rootユーザーとして、インフィニバンド・ネットワーク用に使用する1つのデータベース・ノード上にネットワーク・リソースを作成します。次に例を示します。
    # /u01/app/grid/product/12.1.0.1/bin/srvctl add network -k 2 -S 192.168.10.0/255.255.255.0/bondib0
  3. 次の例のようなコマンドを使用して、ネットワークが正しく追加されたことを確認します。
    # /u01/app/grid/product/12.1.0.1/bin/crsctl stat res -t | grep net
    ora.net1.network
    ora.net2.network -- Output indicating new Network resource 

    または

    # /u01/app/grid/product/12.1.0.1/bin/srvctl config network -k 2
    Network exists: 2/192.168.10.0/255.255.255.0/bondib0, type static -- Output indicating Network resource on the 192.168.10.0 subnet 
  4. クラスタ内の各ノードについて、ステップ2で作成したネットワーク上の仮想IPアドレスを追加します。次に例を示します。
    # srvctl add vip -n dm01db01 -A dm01db01-ibvip/255.255.255.0/bondib0 -k 2
    #
    # srvctl add vip -n dm01db02 -A dm01db02-ibvip/255.255.255.0/bondib0 -k 2
  5. oracleユーザー(Grid Infrastructureホームの所有者)として、ステップ4で作成した仮想IPアドレス用のリスナーを追加します。
    # srvctl add listener -l LISTENER_IB -k 2 -p TCP:1522,/SDP:1522
  6. 中間層からの接続を受け付ける各データベースについて、listener_networks initパラメータを変更して、複数のネットワーク(イーサネットとインフィニバンド)にまたがるロード・バランシングとフェイルオーバーを可能にします。初期化パラメータに完全なTNSNAMES構文を入力することも、$ORACLE_HOME/network/adminディレクトリ内のtnsnames.ora内にエントリを作成することもできます。TNSNAMES.ORAのエントリは、GRID_HOME内に存在している必要があります。次の例では、まずtnsnames.oraを更新します。

    クラスタ内の各ノードで、そのノードの正しいIPアドレスを使用して、このステップを実行します。LISTENER_IBREMOTEでは、クラスタ内の他のすべてのノードを列記する必要があります。DBM_IBでは、クラスタ内のすべてのノードを列記する必要があります。

    注意:

    データベース・インスタンスがTNSNAMESを読み込むのは、起動時のみです。したがって、init.oraパラメータ(LISTENER_NETWORKS)によって参照されているエントリを変更した場合は、インスタンスを再起動するか、ALTER SYSTEM SET LISTENER_NETWORKSコマンドを発行し、インスタンスによって変更を有効にする必要があります。

    DBM =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01-scan)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = dbm)
    ))
    DBM_IB =
    (DESCRIPTION =
    (LOAD_BALANCE=on)
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01db01-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01db02-ibvip)(PORT = 1522))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = dbm)
    ))
    LISTENER_IBREMOTE =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01db02-ibvip.mycompany.com)(PORT = 1522))
    ))
    LISTENER_IBLOCAL =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01db01-ibvip.mycompany.com)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = dm01db01-ibvip.mycompany.com)(PORT = 1523))
    ))
    LISTENER_IPLOCAL =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm0101-vip.mycompany.com)(PORT = 1521))
    ))
    LISTENER_IPREMOTE =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dm01-scan.mycompany.com)(PORT = 1521))
    ))
  7. sysdbaとしてデータベース・インスタンスに接続します。
  8. SQLのALTER SYSTEMコマンドを使用してlistener_networks initパラメータを変更します。
    SQL> alter system set listener_networks=
         '((NAME=network2) (LOCAL_LISTENER=LISTENER_IBLOCAL)
            (REMOTE_LISTENER=LISTENER_IBREMOTE))',
         '((NAME=network1)(LOCAL_LISTENER=LISTENER_IPLOCAL)
            (REMOTE_LISTENER=LISTENER_IPREMOTE))' scope=both;
  9. Linuxコマンドラインで、srvctlコマンドを使用してLISTENER_IBを再起動して、ステップ7の変更を実施します。
    # srvctl stop listener -l LISTENER_IB
    # srvctl start listener -l LISTENER_IB