2 Oracle Shell for Hadoop Loaders

Oracle Big Data Connectorsは、HadoopとOracle Databaseの間でデータを交換するための強力なツールセットです。Oracle Shell for Hadoop Loaders (OHSH)は、Oracle Loader for Hadoop、Oracle SQL Connector for HDFSおよびBig Data SQLのCopy to Hadoop機能を使用するための便利なツールです。

Oracle Shell for Hadoop Loadersとは

Oracle Shell for Hadoop Loadersは、Oracle Loader for Apache Hadoop、Oracle SQL Connector for HDFSおよびBig Data SQLのCopy to Hadoop機能への簡単に使用できるコマンドライン・インタフェースを提供するヘルパー・シェルです。 コマンドライン・リコール、履歴、親プロセスからの環境変数の継承、新規または既存の環境変数の設定およびコマンドラインでの環境切り替えの実行など、基本的なシェル機能を備えています。  

Oracle Shell for Hadoop Loadersのコア機能には次のようなものがあります。

  • Oracle Shell for Hadoop Loadersがロード・タスクを実行するために使用する、名前付きの外部リソースの定義。

  • ロード操作のデフォルト値の設定。

  • ロード・コマンドの実行。

  • ロード前後の簡単なタスクの、オペレーティング・システム、HDFS、HiveおよびOracleへの委任。 これらのタスクには、ロードするデータの表示およびロード後のターゲット表のデータの表示も含まれます。

関連項目:

OHSHキットのサンプルディレクトリには、Oracle Shell for Hadoop Loadersを使用してリソースを定義しデータをロードする多くの例が含まれています。OHSHのロード方式を実行する方法の例および手順の詳細は、<OHSH_KIT>/examples.zipを解凍して<OHSH_KIT>/examples/README.txtを参照してください。

ノート:

HADOOP_CLASSPATH環境変数は、Oracle Shell for Hadoop Loadersを起動する前にクリアしておく必要があります。

Oracle Shell for Hadoop Loaders (OHSH)の構成

ノート:

Oracle Big Data Serviceで実行するようにOHSHを構成する手順は、Oracle Big Data Serviceの使用Big Data ConnectorsおよびCopy to Hadoopを使用したBig Data Serviceとデータベース・インスタンスの間でのデータのコピーに関する項を参照してください。

Hadoopクラスタまたはエッジ・ノード(Oracle Database System)上のOHSHの場合は、OHSHインストールの場所を確認して、OHSH_HOMEを設定します。次に例を示します。

  1. OHSH_HOMEを設定します。
    $ export OHSH_HOME=/opt/oracle/ohsh-5.0.0 
  2. $OHSH_HOME/bin/ohsh_config.shを編集して、次の環境変数を設定します。
    1. OLH_HOME: Oracle Loader for Hadoopのインストール場所。次に例を示します。
      export OLH_HOME=/opt/oracle/oraloader-5.0.0-h2
    2. HS2_HOST_PORT: Hiveserver 2サーバーおよびポート情報。次に例を示します。
      export HS2_HOST_PORT = <server>:<port> 
    3. HADOOP_CONF_DIR: Hadoop構成ディレクトリ。次に例を示します。
      export HADOOP_CONF_DIR=/etc/hadoop/conf 
    4. HIVE_CONF_DIR: Hive構成ディレクトリ。次に例を示します。
      export HIVE_CONF_DIR=/etc/hive/conf 
    5. TNS_ADMIN: Oracle Databaseを識別するには、次のようにします。
      • SSLやOracle Walletのかわりに標準JDBC接続を使用している場合、tnsnames.oraおよびsqlnet.oraをデータベース・ホストの$TNS_ADMINからOHSHを実行する予定のシステムの<directory_location>にコピーする必要があります。
        export TNS_ADMIN=<directory_location>
      • Oracle Walletを使用してデータベース資格証明を格納している場合は、データベース・ホストにウォレット・ファイルを作成し、OHSHを実行する予定のシステムの<wallet_location>にこれをコピーします。TNS_ADMINに加えて、WALLET_LOCATION_DIRをウォレット・ファイルの場所に設定します。
        export WALLET_LOCATION=<wallet_location>

        ノート:

        sqlnet.oraでウォレットが有効化されており、正しいウォレットの場所を指定していることを確認してください。次に例を示します。
        WALLET_LOCATION=     
        (SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=<wallet_location>)))  
        sqlnet.wallet_override=true
      • SSLを使用する場合、TNS_ADMINはSSLクライアント・ウォレット・ファイルが存在するディレクトリです。次に例を示します。
        export TNS_ADMIN=/home/oracle/SSL_wallet
    6. SQLCLIENT_HOME: データベース・クライアントのインストール・ディレクトリ。次に例を示します。
      export SQLCLIENT_HOME=/usr/lib/oracle/12.1/client64 
    7. HIVE_SESS_VAR_LISTを任意の必要なHiveセッション変数に設定します。次に例を示します。
      • Kerberos認証を使用してHiveServer2に接続するには、次のようにします。
        export HIVE_SESS_VAR_LIST="principal=<The server principal of HiveServer2>"

        Hiveプリンシパルは構成プロパティhive-site.xml内のhive.server2.authentication.kerberos.principalで指定されます。

      • HTTPモードで実行しているHiveServer2に接続するには、次のようにします。
        export HIVE_SESS_VAR_LIST="transportMode=http;
        httpPath=<The HTTP endpoint>"
      • SSLが有効な場合にHiveServer2に接続するには、次のようにします。
        export HIVE_SESS_VAR_LIST="ssl=true;
        sslTrustStore=<Trust Store path>;
        trustStorePassword=<Trust Store password>"
  3. $PATH変数に$OHSH_HOME/bin/ohshを追加します。
    $ export PATH=$PATH:$OHSH_HOME/bin/ohsh

Oracle Shell for Hadoop Loadersを使用する前に

OHSH対話型セッションの開始

対話型セッションを開始するには、コマンドラインでohshを入力します。OHSHを起動する前に、HADOOP_CLASSPATHがクリアされていることを確認してください。これにより、OHSHシェルに移動します(パスにOHSHが含まれている場合)。

$ ohsh
ohsh>

このシェルでOHSHコマンドを実行できます(OHSH構文を使用)。Beeline/Hive、Hadoop、BashおよびSQL*Plusのコマンドを実行することもできます。非OHSHコマンドの場合は、コマンドの実行に使用するリソースの名前に委任演算子の接頭辞(%)を追加します。次に例を示します。

ohsh> %bash0 ls —l

OHSHのスクリプト記述

CLIで機能するのと同じコマンドをスクリプト記述することもできます。ohshコマンドには、スクリプトで使用するための3つのパラメータが用意されています。

  • ohsh —i <filename>.ohsh

    -iパラメータは、プロンプトが表示される前に、OHSHに、スクリプト内のコマンドを使用して対話型セッションを初期化するように指示します。これは、シェル内で作業を開始する前に、必要なセッション・リソースを設定し、他の準備タスクを自動化するための便利な方法です。

    $ ohsh –i initresources.ohsh
  • ohsh —f <filename>.ohsh

    -fパラメータを指定してohshコマンドを実行すると、非対話型セッションが開始され、スクリプト内のコマンドが実行されます。

    $ ohsh –f myunattendedjobs.ohsh
  • ohsh —i —f <filename>.ohsh

    -i-fを一緒に使用することで、非対話型セッションを初期化してからセッションで別のスクリプトを実行できます。

    $ ohsh -i mysetup.ohsh –f myunattendedjobs.ohsh
  • ohsh —c

    このコマンドは、OHSHセッションが起動時に継承するすべてのHadoop構成プロパティをダンプします。

OHSHリソースの使用

リソースは、OHSHがやり取りする名前付きエンティティです。例: Hadoopクラスタはリソースであり、Oracleデータベース、Hiveデータベース、OracleデータベースとのSQLセッション、およびローカルOSでのBashシェルへのJDBC接続と同様です。

OHSHは、起動時にhive0 (デフォルトHiveデータベースに接続するため)およびhadoop0という2つのデフォルト・リソースを提供します。

  • hive0リソースを使用して次のHiveコマンドを実行します。

    ohsh> %hive0 show tables

    他のHiveデータベースに接続するためにHiveリソースを追加作成できます。

  • hadoop0リソースを使用して次のHadoopコマンドを実行します。

    ohsh> %hadoop0 fs -ls

対話型またはスクリプト化セッション内で、SSL、SQLやJDBCなどの追加リソースのインスタンスを作成できます。OHSHを介してOracle Databaseに接続するには、次の3つのリソースを作成する必要があります。

  • SQLリソースの作成:
    ohsh> create sqlplus resource sql0 connectid=”bigdatalite.localdomain:1521/orcl”

    ノート:

    プロンプトで、データベースのユーザー名とパスワードを入力します。
  • JDBCリソースの作成:
    ohsh> create jdbc resource jdbc0 connectid=<database connection URL>

    ノート:

    プロンプトで、データベースのユーザー名とパスワードを入力します。
  • リソースの表示:
    ohsh> show resources

このコマンドは、デフォルトのリソース、およびセッション内で作成された追加リソースを示します。

Oracle Databaseの接続のためのJDBC SSLによるリソースの作成

SSLを介してOracle Databaseに接続するには、次のリソースを作成する必要があります。

  • SSLソースの作成。SSLクライアント・ウォレットをダウンロードして構成ステップを完了するには、「JDBC SSLの使用」を参照してください。
  • SQLリソースの作成:
    ohsh> create sqlplus resource sql_ssl connectid="<tns entry name for the SSL connection>"
    次に例を示します。
    ohsh> create sqlplus resource sql_ssl connectid="inst1_ssl"

    inst1_sslは、JDBC SSL接続のTNSエントリです

    ノート:

    プロンプトで、データベースのユーザー名とパスワードを入力します。
  • JDBCリソースの作成:
    ohsh> create jdbc resource jdbc_ssl 
    connectiondir=<SSL wallet directory location>
    connectid="<tns entry name for the SSL connection>"
    次に例を示します。
    ohsh> create jdbc resource ora_mydatabase_cs 
    connectiondir=/home/oracle/ssl_client_wallet 
    connectid="inst1_ssl"

    inst1_sslは、JDBC SSL接続のTNSエントリです

    ノート:

    プロンプトで、データベースのユーザー名とパスワードを入力します。

セキュアなJavaキーストアを使用したリソースの作成

パスワードは、セキュアなJavaキーストアに格納できます。Javaキーストアを使用している場合、ユーザー名とパスワードの入力を求められることはありません。また、データをロードするために開発するスクリプトにこれを追加することもできます。

  • Javaキーストアの作成「セキュアな外部JavaキーストアおよびHadoop資格証明コマンドの使用」を参照してください
  • Javaキーストアを使用したSQLリソースの作成:
    ohsh> create sqlplus resource sql_ssl_cs user=<username>
    passwordalias=<password alias>  
    provider="<provider_path>"
    connectid="<tns entry name for the SSL connection>"
    次に例を示します。
    ohsh> create sqlplus resource sql_ssl_cs user=oracle 
    passwordalias=oracle_passwd
    provider="jceks://file/home/oracle/passwd.jceks"
    connectid="inst1"
  • JDBC SSL接続でJavaキーストアを使用したSQLリソースの作成:
    ohsh> create sqlplus resource sql_ssl_cs user=<username> 
    passwordalias=<password alias>  
    provider="<provider_path>"
    connectiondir=<SSL wallet directory location> 
    connectid="<tns entry name for the SSL connection>
    次に例を示します。
    ohsh> create sqlplus resource sql_ssl_cs user=oracle 
    passwordalias=oracle_passwd
    provider="jceks://file/home/oracle/passwd.jceks"
    connectiondir=/home/oracle/ssl_client_wallet
    connectid="inst1_ssl"
  • Javaキーストアを使用したJDBCリソースの作成:
    ohsh> create jdbc resource jdbc_ssl_cs user=<username>     
    passwordalias=<password alias>    
    provider="<provider_path>" 
    connectid="<tns entry name for the SSL connection>"
    次に例を示します。
    ohsh> create jdbc resource jdbc_ssl_cs user=oracle 
    passwordalias=oracle_passwd
    provider="jceks://file/home/oracle/passwd.jceks"
    connectid="inst1"
  • JDBC SSL接続でJavaキーストアを使用したJDBCリソースの作成:
    ohsh> create jdbc resource jdbc_ssl_cs user=<username>     
    passwordalias=<password alias>    
    provider="<provider_path>" 
    connectiondir=<SSL wallet directory location> 
    connectid="<tns entry name for the SSL connection>"
    次に例を示します。
    ohsh> create jdbc resource jdbc_ssl_cs user=oracle 
    passwordalias=oracle_passwd
    provider="jceks://file/home/oracle/passwd.jceks"
    connectiondir=/home/oracle/ssl_client_wallet 
    connectid="inst1_ssl"

ヘルプの表示

OHSHシェルでは、すべてのコマンドに対するオンライン・ヘルプが用意されています。

すべてのOHSHコマンドのリストを表示するには、次のコマンドを実行します。

ohsh> help

特定のコマンドのヘルプを表示するには、helpと入力し、続けて次のコマンドを入力します。    

ohsh> help show

次の表に、使用可能なヘルプ・カテゴリを示します。

helpコマンド 説明
help load OracleおよびHadoopの表に対するloadコマンドを示します。
help set ロード操作のデフォルト値を設定するためのヘルプを表示します。また、特定の設定により影響を受けるロード・メソッドも示します。
help show デフォルト設定を調査するためのヘルプを表示します。
help shell シェルライクなコマンドを表示します。
help resource 指定リソースを作成および削除するためのコマンドを表示します。

Oracle Database表のロード

OHSHロード・コマンドを使用すると、HDFSまたはHiveからOracle Database表にデータをロードする(OLHまたはOSCHを使用する)ことも、Oracle Database表からHiveにデータをロードする(Copy to Hadoopを使用する)こともできます。

HDFSまたはHiveからOracle Databaseへのロードに使用可能なロード・オプションは次のとおりです。

  • jdbc (パーティション化されていないOracle表のデフォルト): OLH JDBC出力形式を使用してHDFSまたはHiveからロードします

  • directpath (パーティション化されたOracle表のデフォルト): OLH OCIダイレクト・パス出力形式を使用してHDFSまたはHiveからロードします

  • exttab - OSCHを使用してHDFSまたはHiveからロードします

  • etl - OLHとOSCHを併用してHDFSにCSVコンテンツをロードします。OLHは、HDFSファイル内のデリミタ付きコンテンツを抽出してHDFSのデータ・ポンプ・ファイルに変換します。その後、OSCHはHDFSからOracleのターゲット表にデータ・ポンプ・ファイルをロードします。

  • etl deferred - OLHを使用して、HDFSファイル内のデリミタ付きコンテンツをHDFSのデータ・ポンプ・ファイルに変換します。このデータ・ポンプ・ファイルは、今後、OSCHでロードするためにそのまま残されます。ロードを実行するOHSHスクリプトがローカルのサンプル・ディレクトリに生成され、手動で実行することでロードを完了できます

Oracle Database表からHiveへのロードに使用可能なロード・オプションは次のとおりです。

  • directcopy (デフォルト) - Oracle Big Data SQLのCopy to Hadoop機能を使用してOracle Databaseに接続し、Oracle表からHDFSに格納されているデータ・ポンプ・ファイルにデータをコピーします
  • stage - Oracle Databaseに接続し、表データおよびメタデータが含まれているデータ・ポンプ形式のファイルを生成します。データベースからHDFSにデータ・ポンプ・ファイルをコピーします。その後、Copy to Hadoop SerDesを使用して、Hiveでデータ・ポンプ・ファイルが読み取れるようにします。

Copy to HadoopにOHSHを使用する方法の詳細は、『Oracle Big Data SQLユーザーズ・ガイド』Oracle Shell for Hadoop LoadersのCopy to Hadoopとの使用に関する項を参照してください。

  1. loadコマンドを使用して、HDFSからOracleデータベース内のターゲット表にファイルをロードします。

    次のコマンドは、ダイレクト・パス・オプションを使用して、HDFSの<HDFSパス>内のデリミタ付きテキスト・ファイルからOracle Database内のターゲット表にデータをロードします。

    ohsh> load oracle table ora_mydatabase:<target table in the Oracle database> from path hadoop0:/user/<HDFS path> using directpath

    ノート:

    デフォルトのダイレクト・パス方式は、最も迅速に表をロードできる方法です。ただし、パーティション化されたターゲット表が必要です。ダイレクト・パスは必ずパーティション表とともに使用することをお薦めします。パーティション化されていないターゲット表にロードするには、JDBCオプションを使用します。

    コマンドで明示的にロード方式を示さない場合は、OHSHによって自動的に適切な方式が使用されます。ターゲットOracle表がパーティション化されている場合は、デフォルトで、OHSHによってダイレクト・パス(つまり、Oracle OCI)が使用されます。Oracle表がパーティション化されていない場合は、JDBCが使用されます。

  2. ロード後は、行数を確認します。

    OHSHのコマンドラインからこれを実行できます。

    ohsh> %sql0 select count(*) from <target table in Oracle Database>

Oracle Database表へのHive表のロード

OHSHを使用して、Hive表をOracleデータベース内のターゲット表にロードできます。次のコマンドは、ダイレクト・パス方式を使用してこれを行う方法を示します。

ohsh> load oracle table ora_mydatabase:<target table in Oracle Database> from hive table hive0:<Hive table name>

ターゲット表がパーティション化されている場合はOHSHによって自動的にダイレクト・パスが使用されることに注意してください。コマンドでusing directpathを明示的に入力する必要はありません。

ターゲット表がパーティション化されていない場合は、かわりにJDBC方式を指定します。

ohsh> load oracle table ora_mydatabase:<target table in Oracle Database> from hive table hive0:<Hive table name> using jdbc

ノート:

loadコマンドは、Hive表内とOracle Database表内の列名が一致することが前提となっています。一致しない場合は、OHSHのloadermapを使用します。

OHSHのローダー・マップの使用

この項で示す単純なロード例では、次のことが前提となっています。

  • ここでは、Hadoop内のテキスト・ファイルからOracle Database表にデータをロードします。ターゲット表内の列の宣言された順序は、ファイル内のデリミタ付きテキスト・フィールドの物理的な順序付けに正しくマップされます。

  • ここでは、Hive表をOracle Database表にロードします。HiveとOracle Databaseの列名は同じです。

ただし、列名(または、列名とデリミタ付きテキスト・フィールドの順序)が一致しない複雑なケースの場合は、OHSHのloadermapコンストラクタを使用して、これらの不一致を修正してください。

loadermapを使用して、表にロードするターゲット列のサブセットを指定することや、テキスト・ファイルからロードする場合はロード時にフィールドの書式を指定することもできます。

ローダー・マップについては、この概要では説明されていません。

OHSHでのOracle Loader for Hadoopのパフォーマンス・チューニング

ネットワーク帯域幅の他に、2つの要因がOracle Loader for Hadoopのパフォーマンスに大きく影響する可能性があります。OHSHでは両方をチューニングできます。

  • 並列度

    並列度は、HadoopでOracle Loader for Hadoopを実行するときのパフォーマンスに影響します。デフォルトの方式(ダイレクト・パス)では、並列度は、リデューサ・タスクの数によって決まります。リデューサ・タスクの数が多いほど、パフォーマンスが高速になります。デフォルト値は4です。タスクの数を設定するには、次のコマンドを実行します。

    ohsh> set reducetasks 18

    JDBCオプションの場合、並列度はマップ・タスクの数によって決まり、最適な数は自動的に決定されます。ただし、ターゲット表がパーティション化されている場合はダイレクト・パスのほうがJDBCより速いということを覚えておいてください。

  • ロード・バランシング

    パフォーマンスは、負荷がリデュース・タスク全体に均等に分散されている場合に最大になります。負荷はサンプリングによって検出されます。サンプリングは、JDBCおよびデフォルト・コピー方式を使用して、負荷についてデフォルトで有効になっています。

OHSHでのデバッグ

次のいくつかのOHSH設定によって、デバッグ情報の利用可能度が制御されます。

  • outputlevel

    outputlevelは、デフォルトでminimalに設定されます。コマンド失敗時にスタック・トレースを返すには、verboseに設定します。

    ohsh> set outputlevel verbose
  • logbadrecords

    ohsh> set logbadrecords true

    これはデフォルトでtrueに設定されます。

次のログ・ファイルはデバッグに有益です。

  • Oracle Loader for Hadoopログ・ファイル

    /user/<username>/smartloader/jobhistory/oracle/<target table schema>/<target table name>/<OHSH job ID>/_olh
  • マップ・タスクおよびリデュース・タスクによって生成されたログ・ファイル

Oracle Loader for Hadoopに役立つその他のOHSHプロパティ

OHSHのコマンドラインまたはスクリプトで、次のプロパティを設定できます。これらの値は、現在のセッションのみで保持されます。

  • dateformat

    ohsh> set dateformat “yyyy-MM-dd HH:mm:ss”

    このコマンドの構文は、Java日付書式によって指定されます。

  • rejectlimit

    デリミタ付きテキスト・ファイルのロードが失敗する前に拒否できる行の数です。

  • fieldterminator

    デリミタ付きテキスト・ファイルのロード時のフィールド終端文字です。

  • hadooptnsadmin

    Hadoopクラスタ内のOracle TNS adminディレクトリの場所です。

  • hadoopwalletlocation

    Hadoopクラスタ内のOracle Walletディレクトリの場所です。

exttab (外部表)メソッドの使用によるデータのロード

HadoopからOracle Databaseにデータをロードするための3つ目のオプションは、exttabです。

ノート:

exttabオプションは、OHSHのオンプレミス・デプロイメントでのみ使用できます。これは、Oracleクラウド・サービスでは使用できません。

exttabでは、データは外部表を介してロードされます。OHSHは、Oracle SQL Connector for HDFSを使用して外部表を作成してから、Create table as Select文を使用してデータをターゲット表にロードします。

ohsh> load oracle table ora_mydatabase:<target table in Oracle Database> from hive table hive0:<Hive table name> using exttab