ヘッダーをスキップ
Oracle® Big Data Connectorsユーザーズ・ガイド
リリース4 (4.3)
E70118-01
  目次へ移動
目次
索引へ移動
索引

前
次
 

3 Oracle Loader for Hadoop

この章では、Oracle Loader for Hadoopを使用してApache HadoopからOracle Databaseの表にデータをロードする方法について説明します。内容は次のとおりです。

同梱されているソフトウェアのサードパーティ・ライセンスについては、『Oracle Big Data Applianceライセンス情報ユーザー・マニュアル』に記載されています

3.1 Oracle Loader for Hadoopとは

Oracle Loader for Hadoopは、HadoopクラスタからOracle Databaseの表にデータをすばやくロードするための効率的でパフォーマンスのよいローダーです。これは、必要に応じてデータを事前にパーティション化し、そのデータをデータベース対応形式に変換します。また、データのロードや出力ファイルの作成の前に主キーまたはユーザー指定の列でレコードをソートすることもできます。Oracle Loader for Hadoopは、他のローダーでは一般にデータベース・サーバーでロード処理の一部として行うこれらの事前処理を、Hadoopの並列処理フレームワークを利用して行います。これらの操作をHadoopにオフロードすることによってデータベース・サーバーに必要なCPUの量を削減し、他のデータベース・タスクのパフォーマンスに与える影響を軽減します。

Oracle Loader for Hadoopは、リデューサ間のデータのバランスを調整してパフォーマンスを向上させるJava MapReduceアプリケーションです。このアプリケーションは様々な入力データ形式を扱い、フィールドを集めたレコード形式でデータを表します。レコード形式のデータが存在するソース(AvroファイルやApache Hive表など)からデータを読み取ったり、テキスト・ファイルの行をフィールドに分割できます。

Oracle Loader for Hadoopを実行するには、hadoopコマンドライン・ユーティリティを使用します。コマンドラインで、ジョブの詳細を構成設定します。通常、これらの設定はジョブ構成ファイルに指定します。

Javaプログラミングのスキルがあれば、カスタム入力形式を定義して、ローダーで処理できるデータ・タイプを拡張できます。Oracle Loader for Hadoopは、そのカスタム・コードを使用してフィールドとレコードを抽出します。

3.2 操作モードの概要

Oracle Loader for Hadoopには次の2つの動作モードがあります。

3.2.1 オンライン・データベース・モード

オンライン・データベース・モードでは、Oracle Loader for Hadoopはジョブ構成ファイルまたはOracle Walletに格納されている資格証明を使用してターゲット・データベースに接続します。ローダーはこのデータベースから表のメタデータを取得します。新規レコードは、直接ターゲット表に挿入することも、Hadoopクラスタ内のファイルに書き込むこともできます。データベースのデータが必要なとき、またはデータベース・システムが比較的空いているときには、レコードを出力ファイルからロードできます。

図3-1は、オンライン・データベース・モードの要素間の関係を示しています。

図3-1 オンライン・データベース・モード

「図3-1 オンライン・データベース・モード」の説明が続きます
「図3-1 オンライン・データベース・モード」の説明

3.2.2 オフライン・データベース・モード

オフライン・データベース・モードでは、Oracle DatabaseシステムがHadoopクラスタと異なるネットワークにあるなどの事情によってデータベースにアクセスできない場合に、Oracle Loader for Hadoopを使用できます。このモードでは、Oracle Loader for Hadoopは表のメタデータ・ファイルに指定された情報を使用します。このメタデータ・ファイルは、ユーザーが別のユーティリティで生成します。ローダーのジョブによって、出力データがHadoopクラスタ上のバイナリまたはテキスト形式の出力ファイルに保存されます。Oracle Databaseにデータをロードする手順は、Oracle SQL Connector for Hadoop Distributed File System (HDFS)やSQL*Loaderなど、別のユーティリティを使用して別途実行します。

図3-2は、オフライン・データベース・モードの要素間の関係を示しています。この図には、データをターゲット表にロードする別途の手順は示されていません。

図3-2 オフライン・データベース・モード

「図3-2 オフライン・データベース・モード」の説明が続きます
「図3-2 オフライン・データベース・モード」の説明

3.3 Oracle Loader for Hadoopを使用する前に

Oracle Loader for Hadoopを使用する場合は、次の基本的な手順に従います。

  1. 初めてOracle Loader for Hadoopを使用する場合は、ソフトウェアがインストールおよび構成されていることを確認します。

    「Oracle Loader for Hadoopの設定」を参照してください。

  2. Oracle Databaseに接続してターゲット表を作成します。

    「ターゲット表の作成」を参照してください。

  3. オフライン・データベース・モードを使用する場合、表のメタデータを生成します。
  4. HadoopクラスタのノードまたはクラスタのHadoopクライアントとして設定されているシステムにログインします。
  5. オフライン・データベース・モードを使用する場合、ログインしたHadoopシステムに表のメタデータをコピーします。
  6. 構成ファイルを作成します。このファイルは、ターゲット表のメタデータへのアクセス、データの入力形式、出力形式などの構成情報を示すXMLドキュメントです。

    「ジョブ構成ファイルの作成」を参照してください。

  7. 入力フィールドをOracleデータベース表の列にマップするXMLドキュメントを作成します。オプション。
  8. Oracle Loader for Hadoopのジョブを実行するシェル・スクリプトを作成します。

    「ローダー・ジョブの実行」を参照してください。

  9. セキュアなクラスタに接続する場合は、自分自身を認証するためにkinitを実行します。
  10. シェル・スクリプトを実行します。
  11. ジョブが失敗した場合、出力の診断メッセージを使用してエラーを特定し、修正します。

    「ジョブのレポート作成」を参照してください。

  12. ジョブが成功したら、コマンド出力を参照し、拒否されたレコード数を確認します。拒否されたレコードが多すぎる場合は、入力形式のプロパティの変更が必要になることがあります。
  13. テキスト・ファイルまたはデータ・ポンプ形式ファイルを生成した場合は、次のいずれかの方法でOracle Databaseにデータをロードします。
  14. ターゲット表の所有者としてOracle Databaseに接続します。この表に問い合せて、データが適切にロードされたことを確認します。適切にロードされなかった場合は、必要に応じて入力形式または出力形式のプロパティを変更し、問題を修正してください。
  15. OraLoaderジョブを本番環境で実行する前に、次の最適化を行います。

3.4 ターゲット表の作成

Oracle Loader for Hadoopはデータを1つのターゲット表にロードします。この表はOracleデータベース内に存在する必要があります。表は、空でも、データが格納されていてもかまいません。Oracle Loader for Hadoopは既存のデータを上書きしません。

表は、他の用途に使用する場合も同じ方法で作成します。その際は、次の制限に従う必要があります。

3.4.1 ターゲット表でサポートされるデータ型

ターゲット表の定義には次のデータ型を使用できます。

  • BINARY_DOUBLE

  • BINARY_FLOAT

  • CHAR

  • DATE

  • FLOAT

  • INTERVAL DAY TO SECOND

  • INTERVAL YEAR TO MONTH

  • NCHAR

  • NUMBER

  • NVARCHAR2

  • RAW

  • TIMESTAMP

  • TIMESTAMP WITH LOCAL TIME ZONE

  • TIMESTAMP WITH TIME ZONE

  • VARCHAR2

ターゲット表には、サポートされていないデータ型の列が含まれていてもかまいませんが、これらの列はnull値可能である必要があります。そうでない場合、値を設定します。

3.4.2 ターゲット表でサポートされるパーティション化方式

パーティション化は、非常に大規模な表の管理および効率的な問合せを行うためのデータベースの機能です。アプリケーションに対して完全に透過的な方法で、大規模な表をパーティションと呼ばれる小規模でより管理し易いサイズに分割する方法を提供します。

ターゲット表の定義には、次のシングルレベルおよびコンポジットレベルのパーティション化方式を使用できます。

  • ハッシュ

  • ハッシュ-ハッシュ

  • ハッシュ-リスト

  • ハッシュ-レンジ

  • 時間隔

  • 時間隔-ハッシュ

  • 時間隔-リスト

  • 時間隔-レンジ

  • リスト

  • リスト-ハッシュ

  • リスト-リスト

  • リスト-レンジ

  • レンジ

  • レンジ-ハッシュ

  • レンジ-リスト

  • レンジ-レンジ

Oracle Loader for Hadoopでは、参照パーティション化または仮想列ベースのパーティション化はサポートされません。

関連項目:

『Oracle Database VLDBおよびパーティショニング・ガイド』

3.4.3 圧縮

Oracle Loader for Hadoopでは、データを圧縮しません。ロード中にデータを圧縮する場合は、表およびデータベースのプロパティによって定義します。圧縮された表にデータをロードするには、表プロパティおよびデータベース・プロパティでそれぞれ定義してください。

3.5 ジョブ構成ファイルの作成

構成ファイルは、HadoopがMapReduceジョブを実行するために必要なすべての情報を格納しているXMLドキュメントです。このファイルには、Oracle Loader for Hadoopに必要なすべての情報も指定できます。「Oracle Loader for Hadoop構成プロパティ・リファレンス」を参照してください。

構成プロパティは、Oracle Loader for Hadoopのすべてのジョブに必要な次の情報を示します。

OraLoaderは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。これらの構成プロパティは、以下に示すようなファイルまたはhadoopのコマンドラインで指定できます。「ローダー・ジョブの実行」を参照してください。

ファイルの作成には任意のテキスト・エディタまたはXMLエディタを使用できます。例3-1に、ジョブ構成ファイルの例を示します。

例3-1 ジョブ構成ファイル

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
 
<!--                          Input settings                             -->
 <property>
   <name>mapreduce.job.inputformat.class</name>
   <value>oracle.hadoop.loader.lib.input.DelimitedTextInputFormat</value>
 </property>
 
 <property>
   <name>mapreduce.input.fileinputformat.inputdir</name>
   <value>/user/oracle/moviedemo/session/*00000</value>
 </property>
 
 <property>
   <name>oracle.hadoop.loader.input.fieldTerminator</name>
   <value>\u0009</value>
 </property>
 
 <property>
   <name>oracle.hadoop.loader.input.fieldNames</name>
   <value>SESSION_ID,TIME_IDDATE,CUST_ID,DURATION_SESSION,NUM_RATED,DURATION_RATED,NUM_COMPLETED,DURATION_COMPLETED,TIME_TO_FIRST_START,NUM_STARTED,NUM_BROWSED,DURATION_BROWSED,NUM_LISTED,DURATION_LISTED,NUM_INCOMPLETE,NUM_SEARCHED</value>
 </property>
 
 <property>
   <name>oracle.hadoop.loader.defaultDateFormat</name>
   <value>yyyy-MM-dd:HH:mm:ss</value>
 </property>
 

<!--                          Output settings                             -->
 <property>
   <name>mapreduce.job.outputformat.class</name>
   <value>oracle.hadoop.loader.lib.output.OCIOutputFormat</value>
 </property>
 
 <property>
   <name>mapreduce.output.fileoutputformat.outputdir</name>
   <value>temp_out_session</value>
 </property>
 
<!--                          Table information                           -->
 <property>
   <name>oracle.hadoop.loader.loaderMap.targetTable</name>
   <value>movie_sessions_tab</value>
 </property>   

 
<!--                          Connection information                      -->
 
<property>
  <name>oracle.hadoop.loader.connection.url</name>
  <value>jdbc:oracle:thin:@${HOST}:${TCPPORT}/${SERVICE_NAME}</value>
</property>
 
<property>
  <name>TCPPORT</name>
  <value>1521</value>
</property>
 
<property>
  <name>HOST</name>
  <value>myoraclehost.example.com</value>
</property>
 
<property>
 <name>SERVICE_NAME</name>
 <value>orcl</value>
</property>
 
<property>
  <name>oracle.hadoop.loader.connection.user</name>
  <value>MOVIEDEMO</value>
</property>
 
<property>
  <name>oracle.hadoop.loader.connection.password</name>
  <value>oracle</value>        
  <description> A password in clear text is NOT RECOMMENDED. Use an Oracle wallet instead.</description>
</property>
 
</configuration>

3.6 ターゲット表のメタデータの概要

ターゲット表に関する情報をOracle Loader for Hadoopに指定する必要があります。この情報の指定方法は、Oracle Loader for Hadoopをオンライン・データベース・モードまたはオフライン・データベース・モードのどちらで実行するかによって異なります。「操作モードの概要」を参照してください。

3.6.1 オンライン・データベース・モードの接続詳細の指定

Oracle Loader for HadoopはOracleデータベースの表のメタデータを使用して列名、データ型、パーティションなどを識別します。JDBC接続が確立可能な場合、ローダーでメタデータを自動的にフェッチします。

資格証明にはウォレットを使用することをお薦めします。Oracleウォレットを使用するには、次のプロパティをジョブ構成ファイルに入力します。

パスワードは、クリア・テキストには保存しないで、ウォレットを使用して資格証明を保護することをお薦めします。Oracle Walletを使用しない場合は、次のプロパティを入力します。

3.6.2 ターゲット表メタデータの生成(オフライン・データベース・モードの場合)

ローダー・ジョブでデータベースにアクセスできない場合があります。たとえば、HadoopクラスタがOracle Databaseとは別のネットワークにある場合などです。この場合、OraLoaderMetadataユーティリティを使用して、ターゲット表のメタデータをファイルに抽出し、保存します。

オフライン・データベース・モードでターゲット表のメタデータを指定するには、次の手順を実行します。

  1. Oracle Databaseシステムにログインします。

  2. 初めてオフライン・データベース・モードを使用する場合は、データベース・システムがインストールおよび構成されていることを確認します。

    「オフライン・データベース・モードのサポート」を参照してください。

  3. OraLoaderMetadataユーティリティ・プログラムを実行して、表のメタデータをエクスポートします。「OraLoaderMetadataユーティリティ」を参照してください。

  4. 表のメタデータが格納されている生成済XMLファイルをHadoopクラスタにコピーします。

  5. ジョブ構成ファイルのoracle.hadoop.loader.tableMetadataFileプロパティを使用して、Hadoopクラスタ上のXMLメタデータの場所を指定します。

    ローダー・ジョブの実行時、このXMLドキュメントがアクセスされ、ターゲット表のメタデータが検出されます。

3.6.2.1 OraLoaderMetadataユーティリティ

Oracle Databaseシステムで、次の構文を使用してOraLoaderMetadataユーティリティを実行します。javaコマンドは1行で入力する必要がありますが、以下では見やすくするために複数行に分けて示しています。

java oracle.hadoop.loader.metadata.OraLoaderMetadata
   -user userName 
   -connection_url connection
   [-schema schemaName]
   -table tableName
   -output fileName.xml

OraLoaderMetadataのヘルプ・ファイルを表示するには、このコマンドをオプションなしで使用します。

オプション

-user userName

ターゲット表を所有するOracle Databaseユーザー。ユーザーは、パスワードを要求されます。

-connection_url connection

次のようなThinスタイル・サービス名形式のデータベース接続文字列。

jdbc:oracle:thin:@//hostName:port/serviceName

サービス名が不明な場合は、特権ユーザーとして次のSQLコマンドを入力します。

show parameter service

NAME               TYPE        VALUE
------------------ ----------- ----------
service_names      string      orcl
-schema schemaName

ターゲット表を含むスキーマの名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。このオプションを省略した場合、-userオプションで指定したスキーマ内のターゲット表が検索されます。

-table tableName

ターゲット表の名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。

-output fileName.xml

メタデータ・ドキュメントの格納に使用される出力ファイルの名前。

例3-2に、ターゲット表のメタデータをXMLファイルに保存する方法を示します。

例3-2 表のメタデータの生成

OraLoaderMetadataユーティリティを実行します。

$ java -cp '/tmp/oraloader-3.5.0-h2/jlib/*' oracle.hadoop.loader.metadata.OraLoaderMetadata -user HR -connection_url jdbc:oracle:thin://@localhost:1521/orcl.example.com -table EMPLOYEES -output employee_metadata.xml

OraLoaderMetadataユーティリティを実行すると、データベース・パスワードを要求されます。

Oracle Loader for Hadoop Release 3.5.0 - Production
 
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 
[Enter Database Password:] password

XMLファイルがスクリプトと同じディレクトリに作成されます。

$ more employee_metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Oracle Loader for Hadoop Release 3.5.0 - Production
 
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 
-->
<DATABASE>
<ROWSET><ROW>
<TABLE_T>
 <VERS_MAJOR>2</VERS_MAJOR>
 <VERS_MINOR>5 </VERS_MINOR>
 <OBJ_NUM>78610</OBJ_NUM>
 <SCHEMA_OBJ>
  <OBJ_NUM>78610</OBJ_NUM>
  <DATAOBJ_NUM>78610</DATAOBJ_NUM>
  <OWNER_NUM>87</OWNER_NUM>
  <OWNER_NAME>HR</OWNER_NAME>
  <NAME>EMPLOYEES</NAME>
     .
     .
     .

3.7 入力形式の概要

入力形式は、Hadoopに保存されている特殊な種類のデータを読み取る場合に使用します。次に示す様々な入力形式を使用して、Hadoopで一般的に利用されるデータ形式を読み取ることができます。

固有のカスタム入力形式を使用することもできます。組込み形式の説明に、カスタムInputFormatクラスの開発に役立つ情報を記入します。「カスタム入力形式」を参照してください。

データベース表にロードするデータの特定の入力形式を指定するには、ジョブ構成ファイルのmapreduce.job.inputformat.class構成プロパティを使用します。

注意:

組込みテキスト形式では、引用符で囲んだ値に埋め込まれたヘッダー行や改行文字(\n)は処理されません。

3.7.1 デリミタ付きテキスト入力形式

デリミタ付きテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.DelimitedTextInputFormat

3.7.1.1 DelimitedTextInputFormatの概要

入力ファイルは次の要件に従う必要があります。

  • レコードは改行文字で区切る。

  • フィールドは、カンマやタブなどの1文字のマーカーで区切る。

空の文字列のトークンは囲まれていても囲まれていなくても、nullで置き換えられます。

DelimitedTextInputFormatは、SQL*Loaderのトークン化方式をエミュレートします。つまり、各データはtで終了し、オプションでieまたはieteで囲みます。DelimitedTextInputFormatは次の構文規則に従います。tはフィールドの終端文字、ieは開始フィールド囲み文字、teは終了フィールド囲み文字、cは1文字です。

  • Line = Token t Line | Token\n

  • Token = EnclosedToken | UnenclosedToken

  • EnclosedToken = (white-space)* ie [(non-te)* te te]* (non-te)* te (white-space)*

  • UnenclosedToken = (white-space)* (non-t)*

  • white-space = {c | Character.isWhitespace(c) and c!=t}

囲まれたトークン(データ値)の前後の空白は破棄されます。囲まれていないトークンの場合、先頭の空白は破棄されますが、末尾の空白(ある場合)は破棄されません。

この実装では、カスタム囲み文字と終端文字は許可されますが、レコード終端文字は改行、空白はJavaのCharacter.isWhitespaceにハードコードされます。空白はフィールドの終端文字として定義できますが、その文字は、あいまいになるのを防ぐために空白文字のクラスから削除されます。

圧縮テキスト・ファイルは、読取り時にHadoopによって自動的に解凍されます。

3.7.1.2 必須の構成プロパティ

なし。デフォルトの形式では、フィールドをカンマで区切り、フィールドの囲み文字は使用しません。

3.7.1.3 オプションの構成プロパティ

DelimitedTextInputFormatのフィールド・デリミタを定義するには、次のいずれかのプロパティを使用します。

入力フィールドの名前を指定するには、次のプロパティを使用します。

3.7.2 複合テキスト入力形式

DelimitedTextInputFormatで処理するには複雑すぎるテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.RegexInputFormat

たとえば、Webログのあるフィールドが引用符で区切られ、別のフィールドが角カッコで区切られている場合があります。

3.7.2.1 RegexInputFormatの概要

RegexInputFormatを使用する場合、レコードは改行文字で区切る必要があります。各テキスト行のフィールドは、正規表現のマッチングによって識別されます。

  • 正規表現はテキスト行全体が一致する必要があります。

  • フィールドの識別には正規表現のキャプチャ・グループが使用されます。

RegexInputFormatjava.util.regexの正規表現ベースのパターン・マッチング・エンジンを使用します。圧縮ファイルは、読取り時にHadoopによって自動的に解凍されます。

関連項目:

java.util.regexの詳細は、次のサイトにあるJava Platform Standard Edition 6 Javaリファレンスを参照してください。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.html

3.7.2.2 必須の構成プロパティ

データ入力ファイルを記述するには、次のプロパティを使用します。

3.7.2.3 オプションの構成プロパティ

すべての入力フィールドの名前を識別するには、次のプロパティを使用します。

大文字と小文字を区別しないマッチングを有効にするには、次のプロパティを使用します。

3.7.3 Hive表入力形式

Hive表からデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.HiveToAvroInputFormat

3.7.3.1 HiveToAvroInputFormatの概要

パーティション化されていない表の場合は、HiveToAvroInputFormatが表全体(Hive表のディレクトリ内の全ファイル)をインポートします。

パーティション化表の場合は、HiveToAvroInputFormatが1つ以上のパーティションをインポートします。パーティションはロードまたはスキップのいずれかを行うことができます。ただし、パーティションを一部ロードすることはできません。

Oracle Loader for Hadoopは、複合(非プリミティブの)列に値があるすべての行を拒否します。プリミティブ値に解決するUNIONTYPEフィールドがサポートされています。「拒否されたレコードの処理」を参照してください。

HiveToAvroInputFormatは、Hive表の行をAvroレコードに変換し、Hive表の列名を大文字に変換して、フィールド名を生成します。この自動大文字変換により、フィールド名がターゲット表の列名と一致する確率が高くなります。「ターゲット表列への入力フィールドのマッピング」を参照してください。

注意:

この入力形式では、列名に引用符で囲まれた識別子が使用されているHive表はサポートされません。「HIVE-6013」を参照してください

HiveToAvroInputFormatSQL Standard Based Hive Authorizationを実施しないことにも注意してください。詳細は、https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorizationを参照してください。

3.7.3.2 必須の構成プロパティ

次の構成プロパティを使用して、Hiveのデータベースと表の名前を指定する必要があります。

3.7.3.3 オプションの構成プロパティ

ロードする入力Hive表の行のサブセットを指定するには、次のプロパティを使用します。

3.7.4 Avro入力形式

標準的なAvro形式のレコードが格納されているバイナリAvroデータ・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.AvroInputFormat

拡張子が.avroのファイルのみを処理するには、mapreduce.input.fileinputformat.inputdir構成プロパティにリストされているディレクトリに*.avroを追加します。

3.7.4.1 構成プロパティ

なし

3.7.5 Oracle NoSQL Database入力形式

Oracle NoSQL Databaseからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.kv.hadoop.KVAvroInputFormat

この入力形式はOracle NoSQL Database 11g、リリース2以降で定義されています。

3.7.5.1 KVAvroInputFormatの概要

Oracle Loader for Hadoopでは、KVAvroInputFormatを使用してOracle NoSQL Databaseから直接データを読み取ります。

KVAvroInputFormatは、Oracle NoSQL Databaseのキーと値のペアからキーではなく値を渡します。Oracle NoSQL DatabaseのキーにAvroデータ値としてアクセスする必要がある場合(ターゲット表に格納する場合など)、oracle.kv.hadoop.AvroFormatterを実装するJavaのInputFormatクラスを作成する必要があります。その後で、Oracle Loader for Hadoop構成ファイルのoracle.kv.formatterClassプロパティを指定できます。

KVAvroInputFormatクラスはorg.apache.hadoop.mapreduce.InputFormat<oracle.kv.Key, org.apache.avro.generic.IndexedRecord>のサブクラスです。

関連項目:

次のサイトにあるKVInputFormatBaseクラスのJavadoc

http://docs.oracle.com/cd/NOSQL/html/javadoc/index.html

3.7.5.2 必須の構成プロパティ

次の構成プロパティを使用して、キーと値のストアの名前と場所を指定する必要があります。

「Oracle NoSQL Databaseの構成プロパティ」を参照してください。

3.7.6 カスタム入力形式

組込み入力形式では不十分な場合は、カスタム入力形式のJavaクラスを作成できます。以下では、Oracle Loader for Hadoopで使用できる入力形式のフレームワークについて説明します。

3.7.6.1 カスタム入力形式の実装の概要

Oracle Loader for Hadoopは、org.apache.hadoop.mapreduce.InputFormatを拡張するクラスから入力を取得します。このクラスの名前をmapreduce.job.inputformat.class構成プロパティに指定する必要があります。

この入力形式では、getCurrentValueメソッドからAvroのIndexedRecord入力オブジェクトを返すRecordReaderインスタンスを作成する必要があります。次のメソッド・シグネチャを使用します。

public org.apache.avro.generic.IndexedRecord getCurrentValue()
throws IOException, InterruptedException;

Oracle Loader for Hadoopでは、IndexedRecord入力オブジェクトのスキーマを使用して入力フィールドの名前を検出し、ターゲット表の列にマップします。

3.7.6.2 エラー処理の概要

IndexedRecordの値の処理でエラーが発生した場合、Oracle Loader for HadoopはRecordReadergetCurrentKeyメソッドで返されるオブジェクトを使用してフィードバックを提供します。また、キーのtoStringメソッドを呼び出し、結果をエラー・メッセージで書式設定します。InputFormatの開発者は、次のいずれかの情報を返すことにより、拒否されたレコードの識別でユーザーを支援できます。

  • データ・ファイルのURI

  • InputSplit情報

  • データ・ファイル名とそのファイルのレコードのオフセット

機密情報が含まれる可能性があるため、レコードをクリア・テキスト形式で返すことはお薦めできません。返された値はクラスタ全体のHadoopのログに出力できます。「拒否されたレコードの不正なファイルへのロギング」を参照してください。

レコードが失敗すると、キーがnullの場合、ローダーは識別情報を生成しません。

3.7.6.3 データ・サンプリングのサポート

Oracle Loader for Hadoopは、サンプラを使用してMapReduceジョブのパフォーマンスを向上させます。サンプラはマルチスレッド化され、各サンプラ・スレッドは、指定されたInputFormatクラスのコピーをインスタンス化します。新しいInputFormatを実装する場合は、スレッドセーフであることを確認します。「パーティション化表にデータをロードする場合のロード・バランシング」を参照してください。

3.7.6.4 InputFormatのサンプル・ソース・コード

Oracle Loader for HadoopにはInputFormatのサンプル・ソース・コードが用意されており、このソース・コードはexamples/jsrc/ディレクトリにあります。

サンプルの形式では、データを単純なカンマ区切り値(CSV)ファイルからロードします。この入力形式を使用するには、oracle.hadoop.loader.examples.CSVInputFormatをジョブ構成ファイルのmapreduce.job.inputformat.classの値として指定します。

この入力形式では、F0、F1、F2といったフィールド名が自動的に割り当てられます。構成プロパティはありません。

3.8 ターゲット表列への入力フィールドのマッピング

マッピングは、入力フィールドをターゲット表のどの列にロードするかを示します。自動マッピング機能を使用することも、常に手動で入力フィールドをターゲット列にマップすることもできます。

3.8.1 自動マッピング

Oracle Loader for Hadoopでは、入力データが次の要件に従っていれば、フィールドを適切な列に自動的にマップできます。

  • ターゲット表のすべての列をロードする。

  • IndexedRecord入力オブジェクトの入力データ・フィールド名が列名と完全に一致している。

  • DATE列にマップされるすべての入力フィールドを、同じJava日付形式を使用して解析できる。

自動マッピングの場合は、次の構成プロパティを使用します。

3.8.2 手動マッピング

自動マッピングの要件に準拠していないロードの場合は、追加のプロパティを定義する必要があります。これらのプロパティでは、次のことが可能です。

  • データをターゲット表の列のサブセットにロードする。

  • 入力フィールド名がデータベースの列名とまったく同じではない場合に、明示的なマッピングを作成する。

  • 入力フィールドごとに異なる日付形式を指定する。

手動マッピングの場合は、次のプロパティを使用します。

3.8.3 ローダー・マップ・ファイルの変換

次のユーティリティは、以前のリリースのローダー・マップ・ファイルを構成ファイルに変換します。

hadoop oracle.hadoop.loader.metadata.LoaderMap -convert map_file conf_file

オプション

map_file

ローカル・ファイル・システム(HDFSではなく)にある入力のローダー・マップ・ファイルの名前。

conf_file

ローカル・ファイル・システム(HDFSではなく)にある出力の構成ファイルの名前。

例3-3に、サンプルの変換を示します。

例3-3 ローダー・ファイルから構成プロパティへの変換

$ HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$OLH_HOME/jlib/*"
$ hadoop oracle.hadoop.loader.metadata.LoaderMap -convert loadermap.xml conf.xml
Oracle Loader for Hadoop Release 3.5.0 - Production
 
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.

入力のローダー・マップ・ファイルのloadermap.xml

<?xml version="1.0" encoding="UTF-8"?>
<LOADER_MAP>
  <SCHEMA>HR</SCHEMA>
  <TABLE>EMPLOYEES</TABLE>
  <COLUMN field="F0">EMPLOYEE_ID</COLUMN>
  <COLUMN field="F1">LAST_NAME</COLUMN>
  <COLUMN field="F2">EMAIL</COLUMN>
  <COLUMN field="F3" format="MM-dd-yyyy">HIRE_DATE</COLUMN>
  <COLUMN field="F4">JOB_ID</COLUMN>
</LOADER_MAP>

出力の構成ファイルのconf.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
    <property>
        <name>oracle.hadoop.loader.loaderMap.targetTable</name>
        <value>HR.EMPLOYEES</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.columnNames</name>
        <value>EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.EMPLOYEE_ID.field</name>
        <value>F0</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.EMPLOYEE_ID.format</name>
        <value></value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.LAST_NAME.field</name>
        <value>F1</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.LAST_NAME.format</name>
        <value></value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.EMAIL.field</name>
        <value>F2</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.EMAIL.format</name>
        <value></value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.HIRE_DATE.field</name>
        <value>F3</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.HIRE_DATE.format</name>
        <value>MM-dd-yyyy</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.JOB_ID.field</name>
        <value>F4</value>
    </property>
    <property>
        <name>oracle.hadoop.loader.loaderMap.JOB_ID.format</name>
        <value></value>
    </property>
</configuration>

3.9 出力形式の概要

オンライン・データベース・モードでは、データを直接Oracleデータベース表にロードするか、ファイルに保存するかを選択できます。オフライン・データベース・モードでは、出力データの保存先はファイルに制限され、このファイルをターゲット表に個別のプロシージャとしてロードできます。ジョブ構成ファイルに出力形式を指定するには、mapreduce.job.outputformat.classプロパティを使用します。

次の出力形式から選択します。

3.9.1 JDBC出力形式

HadoopシステムとOracle Databaseとの間のJDBC接続を利用してデータをロードできます。ローダー・ジョブの出力レコードは、タスクをオンライン・データベース・モードのOraLoaderプロセスの一部としてマップまたはリデュースすると、ターゲット表に直接ロードされます。データをロードするための追加手順は不要です。

ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のJDBC接続をオープンしている必要があります。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.JDBCOutputFormat

3.9.1.1 JDBCOutputFormatの概要

JDBCOutputFormatでは、標準のJDBCバッチを使用してパフォーマンスと効率を最適化します。バッチの実行中に制約違反などのエラーが発生した場合、JDBCドライバはただちに実行を停止します。つまり、バッチに100行あり、10行目でエラーが発生した場合、9行は挿入され、91行は挿入されません。

JDBCドライバではエラーが発生した行が特定されないため、Oracle Loader for Hadoopでは、バッチ内の各行の挿入ステータスは把握されません。バッチ内のエラーが発生したすべての行に問題があるとみなされ、行はターゲット表に挿入される場合もあれば、挿入されない場合もあります。次のバッチのロードが続けられます。バッチ・エラーの数と問題のある行の数を示すロード・レポートがジョブの最後に生成されます。

この問題に対処する方法の1つは、ターゲット表に対して一意キーを定義することです。たとえば、HR.EMPLOYEES表にEMPLOYEE_IDという名前の主キーがあるとします。この場合、データをHR.EMPLOYEESにロードした後、EMPLOYEE_IDで問合せを行って欠落している従業員IDを検出します。欠落している従業員IDが入力データに見つかったら、ロードに失敗した原因を特定し、再度ロードを試行できます。

3.9.1.2 構成プロパティ

バッチ・サイズを制御するには、次のプロパティを設定します。

oracle.hadoop.loader.connection.defaultExecuteBatch

3.9.2 Oracle OCIダイレクト・パス出力形式

Oracle Call Interface (OCI)のダイレクト・パス・インタフェースを使用して、データをターゲット表にロードします。オンライン・データベース・モードでは、各リデューサが異なるデータベース・パーティションにロードするため、並列ロードのパフォーマンス向上が可能になります。データをロードするための追加手順は不要です。

ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のOCI接続をオープンしている必要があります。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.OCIOutputFormat

3.9.2.1 OCIOutputFormatの概要

OCIOutputFormatには、次の制限があります。

  • Linux x86.64プラットフォームでのみ使用できます。

  • MapReduceジョブで1つ以上のリデューサを作成する必要があります。

  • ターゲット表は、パーティション化されている必要があります。

  • Oracle Database 11g (11.2.0.3)では、ターゲット表が、サブパーティション・キーにCHARVARCHAR2NCHARまたはNVARCHAR2列が含まれるコンポジット時間隔パーティション化表の場合、Oracle Bug#13498646を適用します。後続バージョンのOracle Databaseでは、このパッチは必要ありません。

3.9.2.2 構成プロパティ

ダイレクト・パス・ストリーム・バッファのサイズを制御するには、次のプロパティを設定します。

oracle.hadoop.loader.output.dirpathBufsize

3.9.3 デリミタ付きテキスト出力形式

Hadoopクラスタでデリミタ付きテキスト出力ファイルを作成できます。マップまたはリデュース・タスクは、ジョブ構成ファイルに指定されたフィールド・デリミタと囲み文字を使用して、デリミタ付きテキスト・ファイルを生成します。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DelimitedTextOutputFormatの概要」を参照してください。

この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続で表のメタデータを取得し、オフライン・データベース・モードの場合には、OraloaderMetadataユーティリティによって生成された表のメタデータ・ファイルを使用できます。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat

3.9.3.1 DelimitedTextOutputFormatの概要

出力タスクによって、デリミタ付きテキスト形式ファイル、1つ以上の対応するSQL*Loader制御ファイルおよび外部表を使用してロードするためのSQLスクリプトが生成されます。

ターゲット表がパーティション化されていない場合、またはoracle.hadoop.loader.loadByPartitionfalseの場合には、DelimitedTextOutputFormatによって次のファイルが生成されます。

  • データ・ファイル: oraloader-taskId-csv-0.dat

  • ジョブ全体のSQL*Loader制御ファイル: oraloader-csv.ctl

  • デリミタ付きテキスト・ファイルをターゲット表にロードするSQLスクリプト: oraloader-csv.sql

パーティション化された表の場合、複数の出力ファイルが作成されます。各ファイルの名前は次のとおりです。

  • データ・ファイル: oraloader-taskId-csv-partitionId.dat

  • SQL*Loader制御ファイル: oraloader-taskId-csv-partitionId.ctl

  • SQLスクリプト: oraloader-csv.sql

生成されたファイル名のtaskIdはマッパー(リデューサ)識別子を表し、partitionIdはパーティション識別子を表します。

HadoopクラスタがOracle Databaseシステムに接続している場合、Oracle SQL Connector for HDFSを使用してデリミタ付きテキスト・データをOracleデータベースにロードできます。「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

または、デリミタ付きテキスト・ファイルをデータベース・システムにコピーして、次のいずれかの方法でデータをターゲット表にロードすることもできます。

  • 生成された制御ファイルを使用してSQL*Loaderを実行し、デリミタ付きテキスト・ファイルからデータをロードします。

  • 生成されたSQLスクリプトを使用して、外部表をロードします。

ファイルは${mapreduce.output.fileoutputformat.outputdir}/_olhディレクトリにあります。

3.9.3.2 構成プロパティ

出力ファイル内のレコードとフィールドの形式は、次のプロパティによって制御されます。

例3-4に、出力タスクで生成されるサンプルSQL*Loader制御ファイルを示します。

例3-4 サンプルSQL*Loader制御ファイル

LOAD DATA CHARACTERSET AL32UTF8
INFILE 'oraloader-csv-1-0.dat'
BADFILE 'oraloader-csv-1-0.bad'
DISCARDFILE 'oraloader-csv-1-0.dsc'
INTO TABLE "SCOTT"."CSV_PART" PARTITION(10) APPEND
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
   "ID"      DECIMAL EXTERNAL,
   "NAME"    CHAR,
   "DOB"     DATE 'SYYYY-MM-DD HH24:MI:SS'
)

3.9.4 Oracle Data Pump出力形式

Hadoopクラスタでデータ・ポンプ形式ファイルを作成できます。データ・ポンプ・ファイルは、マップまたはリデュース・タスクによって生成されます。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DataPumpOutputFormatの概要」を参照してください。

この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続を使用し、オフライン・データベース・モードの場合には、OraloaderMetadataユーティリティによって生成された表のメタデータ・ファイルを使用できます。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.DataPumpOutputFormat

3.9.4.1 DataPumpOutputFormatの概要

DataPumpOutputFormatは、データ・ファイルを生成し、次の形式でファイル名を付けます。

oraloader-taskId-dp-partitionId.dat

生成されたファイル名のtaskIdはマッパー(リデューサ)識別子を表し、partitionIdはパーティション識別子を表します。

HadoopクラスタがOracle Databaseシステムに接続している場合、Oracle SQL Connector for HDFSを使用してデータ・ポンプ・ファイルをOracleデータベースにロードできます。「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

または、データ・ポンプ・ファイルをデータベース・システムにコピーし、Oracle Loader for Hadoopによって生成されたSQLスクリプトを使用してロードすることもできます。このスクリプトは次のタスクを実行します。

  1. ORACLE_DATAPUMPアクセス・ドライバを使用する外部表定義を作成します。バイナリ形式のOracle Data Pump出力ファイルは、外部表のLOCATION句にリストされます。

  2. 外部表によって使用されるディレクトリ・オブジェクトを作成します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。スクリプトで使用するディレクトリ名を指定するには、ジョブ構成ファイルにoracle.hadoop.loader.extTabDirectoryNameプロパティを設定します。

  3. 外部表からターゲット表に行を挿入します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。

SQLスクリプトは${mapreduce.output.fileoutputformat.outputdir}/_olhディレクトリにあります。

関連項目:

  • 外部表の作成と管理の詳細は、『Oracle Database管理者ガイド』

  • ORACLE_DATAPUMPアクセス・ドライバの詳細は、『Oracle Databaseユーティリティ』

3.10 ローダー・ジョブの実行

Oracle Loader for Hadoopでジョブを実行するには、hadoopコマンドのOraLoaderユーティリティを使用します。

基本的な構文は次のとおりです。

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf job_config.xml \
-libjars input_file_format1.jar[,input_file_format2.jar...]

任意の汎用的なhadoopコマンドライン・オプションを指定できます。OraLoaderは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。

基本オプション

-conf job_config.xml

ジョブ構成ファイルを識別します。「ジョブ構成ファイルの作成」を参照してください。

-libjars

入力形式としてJARファイルを識別します。

  • サンプル入力形式を使用する場合は、$OLH_HOME/jlib/oraloader-examples.jarを指定します。

  • HiveまたはOracle NoSQL Databaseの入力形式を使用する場合は、この項で後述する追加JARファイルを指定する必要があります。

  • カスタム入力形式を使用する場合は、JARを指定します(HADOOP_CLASSPATHにも忘れずに追加してください)。

複数のファイル名をカンマで区切り、各ファイル名を明示的にリストします。ワイルドカード文字および空白は使用できません。

Oracle Loader for Hadoopは、MapReduceタスク用に内部構成情報を準備します。また、表のメタデータ情報と従属するJavaライブラリを分散キャッシュに格納して、クラスタ全体でMapReduceタスクに使用できるようにします。

OraLoaderの起動例

次の例では、組込み入力形式を使用し、ジョブ構成ファイルの名前をMyConf.xmlとしています。

HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$OLH_HOME/jlib/*"

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf MyConf.xml -libjars $OLH_HOME/jlib/oraloader-examples.jar

関連項目:

3.10.1 Hive入力形式のJARファイルの指定

HiveToAvroInputFormatを使用する場合は、Hive構成ディレクトリをHADOOP_CLASSPATH環境変数に追加する必要があります。

HADOOP_CLASSPATH="$HADOOP_CLASSPATH:$OLH_HOME/jlib/*:hive_home/lib/*:hive_conf_dir"

次のHive JARファイルを、カンマ区切りリスト形式で、hadoopコマンドの-libjarsオプションに追加する必要もあります。アスタリスク(*)を完全なファイル名に置き換えます。

  • hive-exec-*.jar

  • hive-metastore-*.jar

  • libfb303*.jar

次の例は、Cloudera's Distribution including Apache Hadoop (CDH) 4.4の完全なファイル名を示しています。

# hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \ 
-conf MyConf.xml \
-libjars hive-exec-0.10.0-cdh4.4.0.jar,hive-metastore-0.10.0-cdh4.4.0.jar,libfb303-0.9.0.jar 

3.10.2 Oracle NoSQL Database入力形式のJARファイルの指定

Oracle NoSQL Database 11gリリース2のKVAvroInputFormatを使用する場合、HADOOP_CLASSPATH$KVHOME/lib/kvstore.jarを含め、hadoopコマンドに-libjarsオプションを含める必要があります。

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \ 
-conf MyConf.xml \
-libjars $KVHOME/lib/kvstore.jar

3.10.3 ジョブのレポート作成

Oracle Loader for Hadoopは、個々のタスクからのレポート情報をまとめて${mapreduce.output.fileoutputformat.outputdir}/_olh/oraloader-report.txtファイルを作成します。このレポートには、その他の統計とともに、各マッパーおよびリデューサのタイプとタスク別に分類されたエラーの数が表示されます。

3.11 拒否されたレコードの処理

Oracle Loader for Hadoopは、次のような様々な理由で入力レコードを拒否します。

  • マッピング・プロパティのエラー

  • 入力データ内の欠落フィールド

  • 無効な表パーティションにマップされたレコード

  • 不正な書式のレコード(たとえば、日付が日付形式に一致しない場合や、レコードが正規表現パターンに一致しない場合)

3.11.1 拒否されたレコードの不正なファイルへのロギング

デフォルトでは、Oracle Loader for Hadoopは、拒否されたレコードをHadoopログに記録せず、拒否されたレコードの識別方法のみを記録します。これにより、クラスタ全体に存在するHadoopログにユーザーの機密情報が格納されることを防ぎます。

拒否されたレコードを記録するようにOracle Loader for Hadoopを管理するには、構成プロパティoracle.hadoop.loader.logBadRecordstrueに設定します。Oracle Loader for Hadoopは、ジョブの出力ディレクトリ内にある_olh/ディレクトリの1つ以上の「不正な」ファイルに不正なレコードを記録します。

3.11.2 ジョブの拒否制限の設定

一部の問題により、Oracle Loader for Hadoopが入力のすべてのレコードを拒否することがあります。このような問題による時間とリソースの無駄を軽減するため、Oracle Loader for Hadoopは、1000レコードが拒否されると、ジョブを中止します。

拒否レコードの最大許可数を変更するには、構成プロパティoracle.hadoop.loader.rejectLimitを設定します。負の値を設定すると、拒否制限が無効になり、拒否されるレコードの数に関係なくジョブの実行が完了します。

3.12 パーティション化表にデータをロードする場合のロード・バランシング

ロード・バランシングの目標は、すべてのリデューサにほぼ同量の処理を割り当てるMapReduceパーティション化スキームを生成することです。

Oracle Loader for Hadoopのサンプリング機能を使用すると、パーティション化されたデータベース表にデータをロードするときにリデューサ間で負荷を分散できます。このサンプリング機能では、データベース・パーティションをリデューサに割り当てる効率的なMapReduceパーティション化スキームが生成されます。

リデューサの実行時間は、通常、処理するレコードの数に比例します。レコードが多いほど、実行時間は長くなります。サンプリング機能が無効の場合、特定のデータベース・パーティションのすべてのレコードが1つのリデューサに送られます。データベース・パーティションによってレコードの数が異なることがあるため、これによってリデューサの負荷は不均等になります。Hadoopジョブの実行時間は、通常、最も遅いリデューサの実行時間によって決まるため、リデューサの負荷が不均等な場合、ジョブ全体のパフォーマンスが低下します。

3.12.1 サンプリング機能の使用方法

サンプリング機能の有効/無効を切り替えるには、構成プロパティoracle.hadoop.loader.sampler.enableSamplingを設定します。サンプリング機能はデフォルトで有効になっています。

3.12.2 ロード・バランシングのチューニング

次のジョブ構成プロパティによってロード・バランシング機能の質を制御します。

サンプラは、所定のリデューサ負荷係数を使用してパーティション化スキームの質を評価します。負荷係数は、(assigned_load - ideal_load)/ideal_loadの計算で求められる各リデューサの相対的な過負荷を表します。このメトリックは、リデューサの負荷が、完全に分散されたリデューサの負荷とどの程度違っているかを示します。負荷係数1.0は、完全に分散された負荷(過負荷ではない)を表します。

負荷係数が小さい場合、負荷分散が適切であることを表します。maxLoadFactorのデフォルト0.05は、5%以上の過負荷状態になるリデューサがないことを表します。サンプラでは、loadCIの値で決まる統計的信頼度でこのmaxLoadFactorが保証されます。loadCIのデフォルト値は0.95で、maxLoadFactorを超えるリデューサの負荷係数は5%のみであることを表します。

サンプラの実行時間と負荷分散の質の間にはトレードオフがあります。maxLoadFactorの値を低くしてloadCIの値を高くすると、リデューサの負荷はより均等化されますが、サンプリング時間は長くなります。maxLoadFactor=0.05およびloadCI=0.95というデフォルト値では、負荷分散の質と実行時間の兼合いが適切にとられます。

3.12.3 サンプリング動作のチューニング

デフォルトでは、サンプラは、maxLoadFactorloadCIの基準を満たすパーティション化スキームを生成するのに十分なサンプルを収集するまで実行されます。

ただし、サンプリングする最大レコード数を指定するoracle.hadoop.loader.sampler.maxSamplesPctプロパティを設定すると、サンプラの実行時間を制限できます。

3.12.4 Oracle Loader for Hadoopがサンプラのパーティション化スキームを使用するのはどのような場合か

Oracle Loader for Hadoopでは、サンプリングが成功の場合にのみ、生成されたパーティション化スキームを使用します。統計的信頼度loadCIで保証される最大リデューサ負荷係数(1+ maxLoadFactor)のパーティション化スキームが生成される場合、サンプリングは成功です。

パーティション・レポートは、様々なマッパーに割り当てられたキーを識別します。このレポートは、サンプラで使用するためのXML形式で保存されます。ユーザーが使用するための情報は含まれません。このレポートには、${mapreduce.output.fileoutputformat.outputdir}/_balancer/orabalancer_report.xmlという名前が付けられます。サンプル化されたジョブ専用に生成されます。このxmlファイルには、マッピング出力を異なるリデューサに割り当てる方法およびサンプリング統計の説明が含まれます。

デフォルト値maxLoadFactorloadCIおよびmaxSamplesPctにより、サンプラは、様々な入力データ分布に対する質の高いパーティション化スキームを正常に生成できます。ただし、制約が厳しすぎる場合や、必要なサンプルの数が、ユーザーが指定した最大数であるmaxSamplesPctを超えている場合などには、サンプラがカスタム・プロパティ値を使用したパーティション化スキームの生成に失敗することがあります。このような場合、Oracle Loader for Hadoopは、問題を特定するログ・メッセージを生成し、データベースのパーティション化スキームを使用してレコードの分割を行い、負荷分散は保証されません。

代替策は、構成プロパティの値を緩和することです。これは、maxSamplesPctを大きくするか、maxLoadFactorまたはloadCI、あるいはその両方を小さくすることによって行えます。

3.12.5 メモリーの問題の解決

カスタム入力形式では、メモリーに収まらない入力分割が返されることがあります。このような場合、サンプラは、ローダー・ジョブが発行されるクライアント・ノードでメモリー不足エラーを返します。

この問題の解決策は、次のとおりです。

カスタム入力形式を開発する場合は、「カスタム入力形式」を参照してください。

3.12.6 サンプリング機能のプロパティの値が無効な場合

サンプリング機能の構成プロパティが、許容可能な範囲外の値に設定されている場合、例外は返されません。かわりに、サンプラは警告メッセージを出力し、プロパティをデフォルト値に設定して実行を続けます。

3.13 Oracleエンジニアド・システム間の通信の最適化

Oracle Loader for Hadoopを使用してデータをOracle Big Data ApplianceからOracle Exadata Database Machineにロードする場合、InfiniBandプライベート・ネットワーク上でSockets Direct Protocol (SDP)を使用するようにシステムを構成することによって、スループットを向上させることができます。この設定は、データのロードのみを目的としてOracle Databaseに接続するための追加接続属性を指定します。

SDPプロトコルを指定するには、次のようにします。

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

    HADOOP_OPTS="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
    
  2. 次のようにして、このHadoop構成プロパティを子タスクJVMに設定します。

    -D mapred.child.java.opts="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
    

    注意:

    このHadoop構成プロパティは、OLHコマンドラインに追加したり、構成ファイルに設定したりできます。

  3. 標準のイーサネット通信を構成します。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.urlを設定します。

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
         (ADDRESS=(PROTOCOL=TCP)(HOST=hostName)(PORT=portNumber)))
         (CONNECT_DATA=(SERVICE_NAME=serviceName)))
    
  4. ExadataでOracleリスナーを、SDPプロトコルをサポートするように構成し、特定のポート・アドレス(1522など)にバインドします。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.oci_urlの値としてリスナー・アドレスを指定します。

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

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

関連項目:

InfiniBandによる通信の構成の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

3.14 Oracle Loader for Hadoop構成プロパティ・リファレンス

OraLoaderは、構成プロパティの指定にhadoopコマンドの標準的なメソッドを使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「ローダー・ジョブの実行」を参照してください。

この項では、一般にOraLoaderジョブに設定する必要があるOraLoader構成プロパティ、Oracle NoSQL Database構成プロパティ、そしていくつかの汎用的なHadoop MapReduceプロパティについて説明します。

すべてのOraLoaderプロパティを示す構成ファイルは、$OLH_HOME/doc/oraloader-conf.xmlにあります。

関連項目:

ジョブ構成ファイルに関するHadoopのドキュメント

http://wiki.apache.org/hadoop/JobConfFile

MapReduce構成プロパティ


mapreduce.job.name

: String

デフォルト値: OraLoader

説明: Hadoopのジョブ名。一意の名前を付けることで、Hadoop JobTracker WebインタフェースやCloudera Managerなどのツールを使用してジョブを監視できます。

mapreduce.input.fileinputformat.inputdir

: String

デフォルト値: 定義されていません。

説明: 入力ディレクトリの名前のカンマ区切りリスト。

mapreduce.job.inputformat.class

: String

デフォルト値: 定義されていません。

説明: 入力データの形式を識別します。次のいずれかの組込み入力形式またはカスタムInputFormatクラスの名前を入力できます。

  • oracle.hadoop.loader.lib.input.AvroInputFormat

  • oracle.hadoop.loader.lib.input.DelimitedTextInputFormat

  • oracle.hadoop.loader.lib.input.HiveToAvroInputFormat

  • oracle.hadoop.loader.lib.input.RegexInputFormat

  • oracle.kv.hadoop.KVAvroInputFormat

組込み入力形式の詳細は、「入力形式の概要」を参照してください。

mapreduce.output.fileoutputformat.outputdir

: String

デフォルト値: 定義されていません。

説明: 出力ディレクトリのカンマ区切りリスト。ジョブを実行する前には存在しません。必須。

mapreduce.job.outputformat.class

: String

デフォルト値: 定義されていません。

説明: 出力タイプを指定します。値は次のとおりです。

  • oracle.hadoop.loader.lib.output.DataPumpOutputFormat

    外部表を使用してターゲット表にロードされるバイナリ形式ファイルにデータ・レコードを書き込みます。

  • oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat

    データ・レコードを、カンマ区切り(CSV)形式ファイルなどのデリミタ付きテキスト形式ファイルに書き込みます。

  • oracle.hadoop.loader.lib.output.JDBCOutputFormat

    JDBC接続を使用して行をターゲット表に挿入します。

  • oracle.hadoop.loader.lib.output.OCIOutputFormat

    Oracle OCIダイレクト・パス・インタフェースを使用して、行をターゲット表に挿入します。

「出力形式の概要」を参照してください。

mapreduce.job.reduces

: Integer

デフォルト値: 1

説明: Oracle Loader for Hadoopジョブで使用されるリデュース・タスクの数。デフォルト値の1ではパラレル処理がサポートされないため、複数のパラレル・データ・ロードをサポートするよう値を大きくすると、パフォーマンスが向上します。ジョブのリデュース・タスクの数には、十分であるが過剰でない値を選択してください。使用可能なリソースによって決定されるポイントでリデュース・タスクの数を過度に増やすと、向上がみられなくなる一方で、他のジョブのパフォーマンスが低下する可能性もあります。


OraLoaderの構成プロパティ


oracle.hadoop.loader.badRecordFlushInterval

: Integer

デフォルト値: 500

説明: ログ・ファイルをフラッシュするまでにタスクの試行を記録できる最大レコード数を設定します。この設定により、レコードの拒否が制限(oracle.hadoop.loader.rejectLimit)に達し、ジョブの実行が停止した場合に失われる可能性があるレコード数が制限されます。

フラッシュ間隔を有効にするには、oracle.hadoop.loader.logBadRecordsプロパティをtrueに設定する必要があります。

oracle.hadoop.loader.compressionFactors

型: Decimal

デフォルト値: BASIC=5.0,OLTP=5.0,QUERY_LOW=10.0,QUERY_HIGH=10.0,ARCHIVE_LOW=10.0,ARCHIVE_HIGH=10.0

説明: これらの値は、サンプリングが有効でターゲット表が圧縮されているときにOracle Loader for Hadoopによって使用されます。これらは、ターゲット表の圧縮係数です。最高のパフォーマンスを得るには、このプロパティの値がターゲット表の圧縮係数と一致している必要があります。値は名前=値のペアのカンマ区切りリストです。名前は次のキーワードのいずれかである必要があります。

ARCHIVE_HIGH

ARCHIVE_LOW

BASIC

OLTP

QUERY_HIGH

QUERY_LOW

oracle.hadoop.loader.connection.defaultExecuteBatch

: Integer

デフォルト値: 100

説明: データベースへのトリップごとに挿入されるレコード数。JDBCOutputFormatおよびOCIOutputFormatにのみ適用されます。

1以上の値を指定します。最大値の制限はありませんが、パフォーマンスはあまり向上せずにメモリー・フットプリントが大きくなるため、非常に大きいバッチ・サイズを使用することは推奨されません。

値が1未満の場合は、デフォルト値が設定されます。

oracle.hadoop.loader.connection.oci_url

: String

デフォルト値: oracle.hadoop.loader.connection.urlの値

説明: OCIOutputFormatで使用されるデータベース接続文字列。このプロパティを指定することによって、JDBC接続URLとは異なる接続パラメータを使用してOCIクライアントからデータベースに接続できます。

次の例では、OCI接続にソケット・ダイレクト・プロトコル(SDP)を指定しています。

(DESCRIPTION=(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=SDP)(HOST=myhost)(PORT=1521)))

(CONNECT_DATA=(SERVICE_NAME=my_db_service_name)))

この接続文字列に接頭辞"jdbc:oracle:thin:@"は不要です。最初のアット記号(@)までのすべての文字が削除されます。

oracle.hadoop.loader.connection.password

: String

デフォルト値: 定義されていません。

説明: 接続するユーザーのパスワード。パスワードの保存にはクリア・テキストを使用しないことをお薦めします。かわりにOracle Walletを使用してください。

oracle.hadoop.loader.connection.sessionTimeZone

: String

デフォルト値: LOCAL

説明: データベース接続のセッション・タイムゾーンを変更します。有効な値は次のとおりです。

  • [+|-]hh:mm: 協定世界時(UTC)との差分を表す時間数と分数(例: 東部標準時の場合は-5:00)

  • LOCAL: JVMのデフォルト・タイムゾーン

  • time_zone_region: 有効なJVMタイムゾーン・リージョン(東部標準時を表すESTやAmerica/New_Yorkなど)

このプロパティは、TIMESTAMP WITH TIME ZONEおよびTIMESTAMP WITH LOCAL TIME ZONEのデータベース列タイプにロードされる入力データに使用されるデフォルト・タイムゾーンも決定します。

oracle.hadoop.loader.connection.tns_admin

: String

デフォルト値: 定義されていません。

説明: Hadoopクラスタの各ノードにある、sqlnet.oratnsnames.oraなどのSQL*Net構成ファイルが含まれるディレクトリへのファイル・パス。データベース接続文字列でTNSエントリ名を使用できるようにこのプロパティを設定します。

Oracle Walletを外部パスワード・ストアとして使用する場合(推奨)、このプロパティを設定する必要があります。「oracle.hadoop.loader.connection.wallet_location」を参照してください。

oracle.hadoop.loader.connection.tnsEntryName

: String

デフォルト値: 定義されていません。

説明: tnsnames.oraファイルに定義されたTNSエントリ名。このプロパティは、oracle.hadoop.loader.connection.tns_adminとともに使用します。

oracle.hadoop.loader.connection.url

: String

デフォルト値: 定義されていません。

説明: データベース接続のURL。このプロパティは、他のすべての接続プロパティより優先されます。

Oracle Walletが外部パスワード・ストアとして構成されている場合(推奨)、プロパティ値は、ドライバ接頭辞jdbc:oracle:thin:@で始まる必要があり、データベース接続文字列は、ウォレットに格納されている資格証明と完全に一致する必要があります。「oracle.hadoop.loader.connection.wallet_location」を参照してください。

次の例に、接続URLの有効な値を示します。

  • Oracle Net形式:

    jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
             (ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521)))
             (CONNECT_DATA=(SERVICE_NAME=example_service_name)))
  • TNSエントリ形式:

    jdbc:oracle:thin:@myTNSEntryName
    
  • Thinスタイル:

    jdbc:oracle:thin:@//myhost:1521/my_db_service_name

oracle.hadoop.loader.connection.user

: String

デフォルト値: 定義されていません。

説明: データベース・ユーザー名。このプロパティではoracle.hadoop.loader.connection.passwordも設定する必要があります。ただし、パスワードの格納にはOracleウォレットを使用することをお薦めします。クリア・テキスト形式では格納しないでください。

オンライン・データベース・モードを使用する場合は、このプロパティまたはoracle.hadoop.loader.connection.wallet_locationを設定する必要があります。

oracle.hadoop.loader.connection.wallet_location

: String

デフォルト値: 定義されていません。

説明: Hadoopクラスタの各ノードにある、接続資格証明が格納されているOracle Walletディレクトリへのファイル・パス。

Oracle Walletを使用する場合、次のプロパティも設定する必要があります。

oracle.hadoop.loader.defaultDateFormat

: String

デフォルト値: yyyy-MM-dd HH:mm:ss

説明: java.text.SimpleDateformatパターンとデフォルトのロケールを使用して、入力フィールドをDATE列に解析します。入力ファイルのフィールドごとに異なるパターンが必要な場合は、手動マッピング・プロパティを使用します。「手動マッピング」を参照してください。

oracle.hadoop.loader.enableSorting

: Boolean

デフォルト値: true

説明: 各リデューサ・グループ内の出力レコードをソートするかどうかを制御します。ターゲット表のソート・キーとなる列を指定するには、oracle.hadoop.loader.sortKeyプロパティを使用します。このプロパティを指定しなければ、レコードは主キーでソートされます。

oracle.hadoop.loader.extTabDirectoryName

: String

デフォルト値: OLH_EXTTAB_DIR

説明: 外部表のLOCATIONデータ・ファイルのデータベース・ディレクトリ・オブジェクトの名前。Oracle Loader for Hadoopがこのディレクトリにデータ・ファイルをコピーするのではなく、外部表のDDLを格納しているSQLファイルがファイル出力形式によって生成され、このファイルにディレクトリ名が記録されます。

このプロパティはDelimitedTextOutputFormatおよびDataPumpOutputFormatのみに適用されます。

oracle.hadoop.loader.input.fieldNames

: String

デフォルト値: F0,F1,F2,...

説明: 入力フィールドの名前のカンマ区切りリスト。

組込み入力形式の場合は、目的のフィールドだけではなく、データ内のすべてのフィールドの名前を指定します。入力行のフィールド数がこのプロパティに指定されたフィールド名の数より多い場合、余分なフィールドは破棄されます。行のフィールド数がこのプロパティに指定されたフィールド名の数より少ない場合、余分なフィールドにはnullが設定されます。選択したフィールドのみをロードする場合は、「ターゲット表列への入力フィールドのマッピング」を参照してください。

名前は、レコードのAvroスキーマの作成に使用されるため、有効なJSON名文字列である必要があります。

oracle.hadoop.loader.input.fieldTerminator

: String

デフォルト値: , (カンマ)

説明: DelimitedTextInputFormatの入力フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。

oracle.hadoop.loader.input.hive.databaseName

: String

デフォルト値: 定義されていません。

説明: 入力表が格納されているHiveデータベースの名前

oracle.hadoop.loader.input.hive.partitionFilter

注意:

このプロパティは非推奨です。かわりにoracle.hadoop.loader.hive.rowFilterを使用します。

: String

デフォルト値: 定義されていません。

説明: HiveToAvroInputFormatのソースHive表パーティションをフィルタするのに使用される有効なHiveQL式。式にはパーティション列のみを含む必要があります。他の列を含めてもエラーは発生しませんが、意図しない結果となる可能性があります。他の列は含めないことをお薦めします。値が設定されていない場合、Oracle Loader for HadoopはソースHive表のすべてのパーティションからデータをロードします。表がパーティション化されていない場合、このプロパティは無視されます。これは、oracle.hadoop.loader.hive.rowFilterが設定されている場合も無視されます。

式は次の制限に従う必要があります。

  • パーティション内にある個々のレコードではなく、パーティションを選択します。

  • 意図しない結果をもたらす可能性があるため、表をパーティション化するのに使用されない列は含めません。

  • 副問合せは含めません。

  • ユーザー定義関数(UDF)は含めません(サポートされていません)。組込み関数はサポートされています。

  • すべての変数の拡張をHadoopレベルで解決します。Hive変数ネームスペース(env:system:hiveconf:およびhivevar:など)に意味はありません。Oracle Loader for Hadoopはhive.variable.substitutefalseに設定し、これによりHive変数の拡張は無効になります。次の拡張方法の中から選択できます。

    すべての変数を拡張してから、このプロパティを設定します。Hive CLIでは、次のコマンドを使用します。

    CREATE VIEW view_name AS SELECT * from database.table_name WHERE expression;
    DESCRIBE FORMATTED view_name;

    「View Original Text」フィールドには、すべての変数が拡張された問合せが含まれます。whereから始まるwhere句をコピーします。

    Oracle Loader for Hadoopにあるすべての変数を定義します。Oracle Loader for Hadoopを実行するhadoopコマンドでは、汎用オプション(-Dおよび-conf)を使用します。

Hive CLIを使用して式をテストし、所定の結果が返されることを確認できます。

次の例では、このコマンドでソース表が定義されていることを前提としています。

CREATE TABLE t(c string)
   PARTITIONED BY (p1 string, p2 int, p3 boolean, p4 string, p5 timestamp);

例1: ネストされた式

p1 like 'abc%' or (p5 >= '2010-06-20' and p5 <= '2010-07-03')

例2: 組込み関数

year(p5) = 2014

例3: 悪い使用例: 表のパーティション化に使用されていない列

この例では、cを使用することで、表のパーティション化に使用されていない列は不要で、予期しない結果を引き起こす可能性があることを示します。

次の例はp2 > 35と同じ結果になります。

p2 > 35 and c like 'abc%'

次の例は、すべてのパーティションをロードします。すべてのパーティションはc like 'abc%を含む可能性があるため、パーティションはフィルタで除外されます。

p2 > 35 or c like 'abc%'

oracle.hadoop.loader.input.hive.rowFilter

: String

デフォルト値: 定義されていません。

説明: HiveToAvroInputFormatのソースHive表の行をフィルタするために使用される有効なHiveQL式。この値が設定されていない場合(デフォルト)、Oracle Loader for Hadoopはoracle.hadoop.loader.input.hive.partitionFilterの値の使用を試みます(表がパーティション化されている場合)。それ以外の場合は、Oracle Loader for HadoopはソースHive表全体をロードします。

式は次の制限に従う必要があります。

  • 副問合せは含めません。

  • ユーザー定義関数(UDF)は含めません(サポートされていません)。組込み関数はサポートされています。

  • すべての変数の拡張をHadoopレベルで解決します。Hive変数ネームスペース(env:、system:、hiveconf:およびhivevar:など)に意味はありません。Oracle Loader for Hadoopはhive.variable.substituteをfalseに設定し、これによりHive変数の拡張は無効になります。次の拡張方法の中から選択できます。

    • すべての変数を拡張してから、このプロパティを設定します。Hive CLIでは、次のコマンドを使用します。

      CREATE VIEW view_name AS SELECT * from database.table_name WHERE expression;
      DESCRIBE FORMATTED view_name;

      「View Original Text」フィールドには、すべての変数が拡張された問合せが含まれます。WHERE句にある式をコピーします。(WHEREキーワード自体は含めないでください。)

    • Oracle Loader for Hadoopですべての変数を定義します。Oracle Loader for Hadoopを実行するためのHadoopコマンドで、汎用オプション(-Dおよび-conf)を使用します。

いずれの場合も、Hive CLIを使用して式をテストし、期待される結果が返されることを確認できます。次の例では、このコマンドでソース表が定義されていることを前提としています。

CREATE TABLE t(c string)
   PARTITIONED BY (p1 string, p2 int, p3 boolean, p4 string, p5 timestamp);

例#1: ネストされた式

c like 'abc%' and (p5 <= '2010-06-20' and p5 <= '2010-07-03')

例 #2: 組込み関数

year(p5) = 2013)

Oracleでは、ネイティブHive表(ストレージ・ハンドラによって管理されない表)から行のサブセットをインポートするときにはhive.optimize.index.filterをオンにすることをお薦めします。これはORCおよびPARQUETなどの入力形式に役立つと知られていますが、いくつかの注意点があります。

  • このプロパティは、-Dを使用して設定する必要があります(-confを使用しても機能しません)。または、このプロパティをhive-site.xmlで設定することもできます。

  • これは、Hive 0.12のORC表の場合に機能します。

oracle.hadoop.loader.input.hive.tableName

: String

デフォルト値: 定義されていません。

説明: 入力データが格納されているHive表の名前。

oracle.hadoop.loader.input.initialFieldEncloser

: String

デフォルト値: 定義されていません。

説明: フィールドの開始を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。デフォルト設定(囲み文字なし)に戻すには、長さが0の値を入力します。フィールドの囲み文字には、入力形式に定義された終端文字および空白文字とは異なる文字を使用する必要があります。

このプロパティが設定されている場合、パーサーは、各フィールドを囲まれていないトークン(値)として読み取る前にまず、囲まれたトークンとして読み取ります。フィールド囲み文字が設定されていない場合、パーサーは各フィールドを囲まれていないトークンとして読み取ります。

このプロパティを設定し、oracle.hadoop.loader.input.trailingFieldEncloserを設定していない場合は、両方のプロパティに同じ値が使用されます。

oracle.hadoop.loader.input.regexCaseInsensitive

: Boolean

デフォルト値: false

説明: パターンの照合時に大文字と小文字を区別するかどうかを制御します。trueに設定すると、大文字と小文字の違いは無視され、"string"は"String"、"STRING"、"string"、"StRiNg"などと一致します。デフォルトでは、"string"は"string"のみと一致します。

このプロパティはorg.apache.hadoop.hive.contrib.serde2.RegexSerDeinput.regex.case.insensitiveプロパティと同じです。

oracle.hadoop.loader.input.regexPattern

型: Text

デフォルト値: 定義されていません。

説明: 正規表現のパターン文字列

正規表現はテキスト行全体が一致する必要があります。たとえば、入力行"a,b,c,"の正しい正規表現パターンは"([^,]*),([^,]*),([^,]*),"ですが、"([^,]*),"は無効です。その理由は、この表現は入力テキストの行に反復して適用されていないためです。

RegexInputFormatでは、正規表現の一致による取得グループをフィールドとして使用します。特殊なグループのゼロは、入力行全体を表すため無視されます。

このプロパティはorg.apache.hadoop.hive.contrib.serde2.RegexSerDeinput.regexプロパティと同じです。

関連項目:

正規表現と取得グループの詳細は、次のサイトにあるJava Platform Standard Edition 6 API仕様java.util.regexのエントリを参照してください。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

oracle.hadoop.loader.input.trailingFieldEncloser

: String

デフォルト値: oracle.hadoop.loader.input.initialFieldEncloserの値

説明: フィールドの終了を示す文字を表します。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。終了囲み文字がない場合は、長さが0の値を入力します。

フィールドの囲み文字には、入力形式に定義された終端文字および空白文字とは異なる文字を使用する必要があります。

終了フィールド囲み文字が入力フィールドに組み込まれている場合、リテラル・テキストとして解析されるようにするには、二重にする必要があります。たとえば、'(1つの単一引用符)をロードするには、入力フィールドに''(2つの単一引用符)を指定する必要があります。

このプロパティを設定する場合、oracle.hadoop.loader.input.initialFieldEncloserも設定する必要があります。

oracle.hadoop.loader.loadByPartition

: Boolean

デフォルト値: true

説明: パーティションを認識するロードを指定します。Oracle Loader for Hadoopは、Hadoopクラスタ上のすべての出力形式の出力をパーティション別に整理します。このタスクはデータベース・システムのリソースには影響しません。

DelimitedTextOutputFormatおよびDataPumpOutputFormatでは複数のファイルが生成され、各ファイルに1つのパーティションのレコードが格納されます。DelimitedTextOutputFormatでは、このプロパティによって、SQL*Loader用に生成された制御ファイルにPARTITIONキーワードを含めるかどうかも制御されます。

OCIOutputFormatにはパーティション化表が必要です。このプロパティをfalseに設定すると、OCIOutputFormatが有効になります。その他の出力形式では、loadByPartitionfalseに設定すると、Oracle Loader for Hadoopはパーティション化表がパーティション化されていない表と同様に処理されます。

oracle.hadoop.loader.loaderMap.columnNames

: String

デフォルト値: 定義されていません。

説明: ターゲット表の列名を任意の順序で示したカンマ区切りリスト。名前は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。

このプロパティは、oracle.hadoop.loader.loaderMap.targetTableを設定しないと無視されます。オプションで、oracle.hadoop.loader.loaderMap.column_name.fieldおよびoracle.hadoop.loader.loaderMap.column_name.formatを設定できます。

oracle.hadoop.loader.loaderMap.column_name.field

: String

デフォルト値: 正規化された列名

説明: Avroレコードを含むフィールドの名前で、このプロパティ名で識別される列にマップされます。列名は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。オプション。

このプロパティは、oracle.hadoop.loader.loaderMap.columnNamesを設定しないと無視されます。

oracle.hadoop.loader.loaderMap.column_name.format

: String

デフォルト値: 定義されていません。

説明: このプロパティ名で識別される列にロードするデータのデータ形式を指定します。日付形式にはjava.text.SimpleDateformatパターンを、テキストには正規表現パターンを使用します。オプション。

このプロパティは、oracle.hadoop.loader.loaderMap.columnNamesを設定しないと無視されます。

oracle.hadoop.loader.loaderMap.targetTable

: String

デフォルト値: 定義されていません。

説明: ロード先の表のスキーマで修飾された名前。このプロパティは、oracle.hadoop.loader.loaderMapFileよりも優先されます。

列のサブセットをロードするには、oracle.hadoop.loader.loaderMap.columnNamesプロパティを設定します。columnNamesに関しては、オプションで、oracle.hadoop.loader.loaderMap.column_name.fieldを設定して列にマップするフィールドの名前を指定したり、oracle.hadoop.loader.loaderMap.column_name.formatを設定してそれらのフィールドのデータの形式を指定できます。表のすべての列をロードし、入力フィールド名がデータベース列名と一致している場合、columnNamesを設定する必要はありません。

oracle.hadoop.loader.loaderMapFile

ローダー・マップは、リリース2.3以降で非推奨になりました。ローダー・マップ・ファイルは、oracle.hadoop.loader.loaderMap.*構成プロパティに置き換えられています。「手動マッピング」を参照してください。

oracle.hadoop.loader.logBadRecords

: Boolean

デフォルト値: false

説明: Oracle Loader for Hadoopが不正なレコードをファイルにログ記録するかどうかを制御します。

このプロパティは、入力形式とマッパーで拒否されるレコードのみに適用されます。出力形式またはサンプリング機能で発生したエラーには適用されません。

oracle.hadoop.loader.log4j.propertyPrefix

: String

デフォルト値: log4j.logger.oracle.hadoop.loader

説明: 構成ファイルからロードされたApache log4jプロパティで使用する接頭辞を識別します。

Oracle Loader for Hadoopでlog4jのプロパティを指定するには、hadoopコマンドに-confオプションおよび-Dオプションを使用します。次に例を示します。

-D log4j.logger.oracle.hadoop.loader.OraLoader=DEBUG
-D log4j.logger.oracle.hadoop.loader.metadata=INFO

この接頭辞で始まるすべての構成プロパティがlog4jにロードされます。これらのプロパティは、log4j${log4j.configuration}からロードされたものと同じプロパティの設定をオーバーライドします。このオーバーライドは、Oracle Loader for Hadoopのジョブ・ドライバおよびそのマップとリデュースのタスクに適用されます。

構成プロパティはRAW値とともにlog4jにコピーされます。変数の拡張はすべてlog4jに対して実行されます。拡張に使用する構成変数もこの接頭辞で始まる必要があります。

oracle.hadoop.loader.olh_home

: String

デフォルト値: OLH_HOME環境変数の値

説明: OraLoaderジョブを開始するノード上のOracle Loader for Hadoopのホーム・ディレクトリのパス。このパスは、必要なライブラリの場所を示します。

oracle.hadoop.loader.olhcachePath

: String

デフォルト値: ${mapreduce.output.fileoutputformat.outputdir}/../olhcache

説明: Oracle Loader for HadoopがMapReduceの分散キャッシュにロードするファイルを作成できるHDFSディレクトリのフル・パスを識別します。

この分散キャッシュは、大規模なアプリケーション固有ファイルをキャッシュし、クラスタ内のノード間に効率的に分散する機能です。

関連項目:

次のサイトにあるJavaドキュメントのorg.apache.hadoop.filecache.DistributedCacheの説明

http://hadoop.apache.org/

oracle.hadoop.loader.output.dirpathBufsize

: Integer

デフォルト値: 131072 (128 KB)

説明: OCIOutputFormatのダイレクト・パス・ストリーム・バッファのサイズをバイト単位で設定します。値は8KBの倍数に切り上げられます。

oracle.hadoop.loader.output.escapeEnclosers

: Boolean

デフォルト値: false

説明: 埋込みの終了囲み文字をリテラル・テキストとして処理するかどうか(つまり、エスケープするかどうか)を制御します。このプロパティをtrueに設定すると、フィールドにデータ値の一部として終了囲み文字を含めることができます。「oracle.hadoop.loader.output.trailingFieldEncloser」を参照してください。

oracle.hadoop.loader.output.fieldTerminator

: String

デフォルト値: , (カンマ)

説明: DelimitedTextInputFormatの出力フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。

oracle.hadoop.loader.output.granuleSize

: Integer

デフォルト値: 10240000

説明: 生成されたデータ・ポンプ・ファイルのグラニュル・サイズ(バイト)。

グラニュルは、ORACLE_DATAPUMPアクセス・ドライバを使用してファイルをロードする場合の並列処理(PQスレーブ)の作業負荷を決定します。

関連項目:

ORACLE_DATAPUMPアクセス・ドライバの詳細は、『Oracle Databaseユーティリティ』を参照してください。

oracle.hadoop.loader.output.initialFieldEncloser

: String

デフォルト値: 定義されていません。

説明: 出力で生成される、フィールドの開始を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定する必要があります。長さが0の値は、出力で囲み文字が生成されないことを表します(デフォルト値)。

フィールドにoracle.hadoop.loader.output.fieldTerminatorの値を含める場合は、このプロパティを使用します。フィールドにoracle.hadoop.loader.output.trailingFieldEncloserの値も含めることができるようにするには、oracle.hadoop.loader.output.escapeEncloserstrueに設定します。

このプロパティを設定する場合、oracle.hadoop.loader.output.trailingFieldEncloserも設定する必要があります。

oracle.hadoop.loader.output.trailingFieldEncloser

: String

デフォルト値: oracle.hadoop.loader.output.initialFieldEncloserの値

説明: 出力で生成される、フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定する必要があります。ゼロ長値は囲み文字がないことを表します(デフォルト値)。

フィールドにoracle.hadoop.loader.output.fieldTerminatorの値を含める場合は、このプロパティを使用します。フィールドにoracle.hadoop.loader.output.trailingFieldEncloserの値も含めることができるようにするには、oracle.hadoop.loader.output.escapeEncloserstrueに設定します。

このプロパティを設定する場合、oracle.hadoop.loader.output.initialFieldEncloserも設定する必要があります。

oracle.hadoop.loader.rejectLimit

: Integer

デフォルト値: 1000

説明: ジョブの実行が停止するまでに拒否またはスキップできるレコードの最大数。負の値を設定すると、拒否制限が無効になり、ジョブの実行が完了します。

mapreduce.map.speculativetrueの場合(デフォルト)、拒否されるレコードの数が一時的に増加して、ジョブが未完了の状態で停止することがあります。

入力形式のエラーは、修復不可能でマップ・タスクが中止になるため、拒否制限に反映されません。サンプリング機能またはオンライン出力形式で発生したエラーも拒否制限に反映されません。

oracle.hadoop.loader.sampler.enableSampling

: Boolean

デフォルト値: true

説明: サンプリング機能が有効かどうかを制御します。サンプリングを無効にするには、このプロパティをfalseに設定します。

enableSamplingプロパティがtrueに設定されている場合でも、サンプリングが不要な場合、または適切なサンプルを作成できないとローダーが判断した場合、ローダーによってサンプリングが自動的に無効になります。たとえば、表がパーティション化されていない場合、リデューサ・タスクの数が2未満の場合、または入力データが少なすぎて適切なロード・バランシングの計算ができない場合、サンプリングは無効になります。このような場合、ローダーは情報メッセージを返します。

oracle.hadoop.loader.sampler.hintMaxSplitSize

: Integer

デフォルト値: 1048576 (1 MB)

説明: サンプリング・プロセスにHadoopのmapred.max.split.sizeプロパティを設定します。ジョブ構成のmapred.max.split.sizeの値は変わりません。1未満の値は無視されます。

一部の入力形式(FileInputFormatなど)では、getSplitsによって返される分割の数を判断するヒントとしてこのプロパティを使用します。値が小さいほど、ランダムにサンプリングされるデータ・チャンクが多いことを意味し、サンプリング性能が高くなります。

データセットのデータ量が数十TB単位に上る場合や、入力形式のgetSplitsメソッドからメモリー不足エラーが返される場合には、この値を増やします。

分割サイズが大きいほど、I/Oパフォーマンスは高くなりますが、サンプリング性能は必ずしも高くなりません。この値を、適切なサンプリング性能を得られるような小さい値(ただし、小さすぎない値)に設定します。極度に小さい値を設定すると、I/Oパフォーマンスが非効率になり、返される分割数が多すぎてgetSplitsでメモリー不足が発生する可能性があります。

org.apache.hadoop.mapreduce.lib.input.FileInputFormatメソッドでは、このプロパティの値に関係なく、常に最小分割サイズの設定以上の大きさの分割が返されます。

oracle.hadoop.loader.sampler.hintNumMapTasks

: Integer

デフォルト値: 100

説明: サンプリング・プロセスにHadoopのmapred.map.tasks構成プロパティを設定します。ジョブ構成のmapred.map.tasksの値は変わりません。1未満の値は無視されます。

一部の入力形式(DBInputFormatなど)では、getSplitsメソッドによって返される分割の数を判断するヒントとしてこのプロパティを使用します。値が高いほど、ランダムにサンプリングされるデータ・チャンクが多いことを意味し、サンプリング性能が高くなります。

データセットに対して、この値を100万行より大きい値に増やします。ただし、極度に大きい値を設定すると、返される分割数が多すぎてgetSplitsでメモリー不足が発生する可能性があります。

oracle.hadoop.loader.sampler.loadCI

型: Decimal

デフォルト値: 0.95

説明: リデューサの最大負荷係数に対する統計的信頼性インジケータ。

このプロパティは0.5以上1未満の値(0.5 <= < 1)を受け入れます。値が0.5未満の場合、プロパティはデフォルト値にリセットされます。一般的な値は0.900.95および0.99です。

「oracle.hadoop.loader.sampler.maxLoadFactor」を参照してください。

oracle.hadoop.loader.sampler.maxHeapBytes

: Integer

デフォルト値: -1

説明: サンプラが使用可能なメモリーの最大容量をバイト単位で指定します。

次のいずれかの条件が真になった場合、サンプリングは中止されます。

  • サンプラがロード・バランシングに必要な最低数のサンプルを収集した。

  • サンプリングされたデータの割合(パーセント)がoracle.hadoop.loader.sampler.maxSamplesPctの値を超えている。

  • サンプリングされたバイト数がoracle.hadoop.loader.sampler.maxHeapBytesの値を超えている。プロパティに負の値が設定されている場合、この条件は適用されません。

oracle.hadoop.loader.sampler.maxLoadFactor

: Float

デフォルト値: 0.05 (5%)

説明: リデューサに対する最大許容負荷係数。値が0.05の場合、リデューサは最適な負荷より最大5%多くのデータを割当て可能であることを表します。

このプロパティは0より大きい値を受け入れます。値が0以下の場合、プロパティはデフォルト値にリセットされます。一般的な値は0.05および0.1です。

負荷が完全に分散された状態では、各リデューサに均等な作業量(負荷)が割り当てられています。負荷係数は、(assigned_load - ideal_load)/ideal_loadの計算で求められる各リデューサの相対的な過負荷を表します。ロード・バランシングが成功した場合、ジョブは指定した信頼度の最大負荷係数の範囲内で実行されます。

「oracle.hadoop.loader.sampler.loadCI」を参照してください。

oracle.hadoop.loader.sampler.maxSamplesPct

: Float

デフォルト値: 0.01 (1%)

説明: 最大サンプル・サイズ(入力データ内のレコード数の割合)を設定します。値0.05は、サンプラがサンプリングするのはレコードの総数の5%以下であることを示します。

このプロパティは0~1の範囲の値(0~100%)を受け入れます。負の値を設定すると、このプロパティは無効になります。

次のいずれかの条件が真になった場合、サンプリングは中止されます。

  • サンプラがロード・バランシングに必要な最低数のサンプルを収集した。このサンプル数は、このプロパティで設定した値より小さい場合があります。

  • サンプリングされたデータの割合(パーセント)がoracle.hadoop.loader.sampler.maxSamplesPctの値を超えている。

  • サンプリングされたバイト数がoracle.hadoop.loader.sampler.maxHeapBytesの値を超えている。プロパティに負の値が設定されている場合、この条件は適用されません。

oracle.hadoop.loader.sampler.minSplits

: Integer

デフォルト値: 5

説明: サンプラが中止条件を評価するまでに読み取る入力分割の最小数。入力分割の合計数がminSplitsより少ない場合、サンプラはすべての入力分割から読み取ります。

0以下の数値は1として扱われます。

oracle.hadoop.loader.sampler.numThreads

: Integer

デフォルト値: 5

説明: サンプラのスレッド数。スレッド数が多いほど、サンプリングの同時実行性が高くなります。値が1の場合、サンプラのマルチスレッドが無効になります。

Oracle Loader for Hadoopのジョブを開始するノード上のプロセッサおよびメモリー・リソースに基づいて値を設定します。

oracle.hadoop.loader.sortKey

: String

デフォルト値: 定義されていません。

説明: リデューサ・グループ内の出力レコードのソート・キーを構成する列名のカンマ区切りリスト。

引用符で囲まれている識別子または引用符で囲まれていない識別子を列名にすることができます。

  • 引用符で囲まれている識別子の開始と終了には二重引用符(")を使用します。

  • 引用符で囲まれていない識別子は、使用する前に大文字に変換されます。

oracle.hadoop.loader.tableMetadataFile

: String

デフォルト値: 定義されていません。

説明: ターゲット表のメタデータ・ファイルへのパス。このプロパティは、オフライン・データベース・モードで実行する場合に設定します。

ローカル・ファイルを指定するには、次の例のようにfile://の構文を使用します。

file:///home/jdoe/metadata.xml

表のメタデータ・ファイルを作成するには、OraLoaderMetadataユーティリティを実行します。「OraLoaderMetadataユーティリティ」を参照してください。

oracle.hadoop.loader.targetTable

非推奨。oracle.hadoop.loader.loaderMap.targetTableを使用します。


Oracle NoSQL Databaseの構成プロパティ


oracle.kv.kvstore

: String

デフォルト値: 定義されていません。

説明: ソース・データがあるKVストアの名前。

oracle.kv.hosts

: String

デフォルト値: 定義されていません。

説明: ソース・データがあるKVストア内のホストを識別する、1つ以上のhostname:portペアの配列。複数のペアはカンマで区切ります。

oracle.kv.batchSize

: Key

デフォルト値: 定義されていません。

説明: 各ネットワーク・ラウンドトリップ中、KVAvroInputFormatがフェッチに必要とするキー数。ゼロ(0)値は、プロパティをデフォルト値に設定します。

oracle.kv.parentKey

: String

デフォルト値: 定義されていません。

説明: 返される値を、指定されたキーの子のキーと値のペアのみに制限します。メジャー・キー・パスを部分パスとし、マイナー・キー・パスを空にする必要があります。null値(デフォルト)は出力を制限しないため、KVAvroInputFormatがストア内のすべてのキーを返します。

oracle.kv.subRange

: KeyRange

デフォルト値: 定義されていません。

説明: 返される値を、oracle.kv.parentKeyにより指定された親キーの下の特定の子へ、さらに制限します。

oracle.kv.depth

: Depth

デフォルト値: PARENT_AND_DESCENDENTS

説明: 返される値を、oracle.kv.parentKeyの値の下の、特定の階層の深さに制限します。次のキーワードは有効な値です。

  • CHILDREN_ONLY: 子を返します。指定された親は返しません。

  • DESCENDANTS_ONLY: すべての子孫を返します。指定された親は返しません。

  • PARENT_AND_CHILDREN: 子および親を返します。

  • PARENT_AND_DESCENDANTS: すべての子孫と親を返します。

oracle.kv.consistency

: Consistency

デフォルト値: NONE_REQUIRED

説明: 子のキーと値のペアを読み取る際の一貫性保証です。次のキーワードは有効な値です。

  • ABSOLUTE: 一貫性が絶対的となるよう、マスターがトランザクションを提供する必要があります。

  • NONE_REQUIRED: レプリカが、マスターと比較したレプリカの状態に関係なく、トランザクションを提供することが可能です。

oracle.kv.timeout

: Long

デフォルト値:

説明: 選択したキーと値のペアを取得する場合の最大時間間隔(ミリ秒)を設定します。ゼロ(0)値は、プロパティをデフォルト値に設定します。

oracle.kv.formatterClass

: String

デフォルト値: 定義されていません。

説明: KeyValueVersionインスタンスをAvro IndexedRecord文字列に書式設定するAvroFormatterインタフェースを実装するクラスの名前を指定します。

Oracle NoSQL DatabaseのAvroレコードは直接Oracle Loader for Hadoopに移るため、NoSQLキーはターゲットのOracle Database表へのマッピングに使用できません。しかし、フォーマッタ・クラスはNoSQLのキーと値の両方を受け取るので、値とキーの両方を含む新しいAvroレコードを作成して返すことができ、これをOracle Loader for Hadoopに渡すことが可能になります。


3.15 同梱されているソフトウェアのサードパーティ・ライセンス

Oracle Loader for Hadoopは、次のサードパーティ製品をインストールします。

  • Apache Avro 1.7.3

  • Apache Commons Mathematics Library 2.2

  • Jackson JSON 1.8.8

これらのサードパーティ製品ライセンスについては、『Oracle Big Data Applianceライセンス情報ユーザー・マニュアル』を参照してください。

Oracle Loader for Hadoopには、Oracle 12cリリース1(12.1)クライアント・ライブラリが含まれます。Oracle Database 12cリリース1 (12.1)に含まれるサードパーティ製品の詳細は、『Oracle Databaseライセンス情報』を参照してください。

Oracle Loader for HadoopはHadoop 0.20.2で構築され、テストされます。

特に断りがないかぎり、あるいは、サードパーティ・ライセンス(LGPLなど)の条項で求められている場合、Apache Licensed Codeに関連するすべてのステートメントを含めた、この項のライセンスとステートメントは、告知のみを目的とするものです。