この章では、Oracle Loader for Hadoopを使用してApache HadoopからOracle Databaseの表にデータをロードする方法について説明します。内容は次のとおりです。
Oracle Loader for Hadoopは、HadoopクラスタからOracle Databaseの表にデータをすばやくロードするための効率的でパフォーマンスのよいローダーです。これは、必要に応じてデータを事前にパーティション化し、そのデータをデータベース対応形式に変換します。また、データのロードや出力ファイルの作成の前に主キーまたはユーザー指定の列でレコードをソートすることもできます。Oracle Loader for Hadoopは、他のローダーでは一般にデータベース・サーバーでロード処理の一部として行うこれらの事前処理を、Hadoopの並列処理フレームワークを利用して行います。これらの操作をHadoopにオフロードすることによってデータベース・サーバーに必要なCPUの量を削減し、他のデータベース・タスクのパフォーマンスに与える影響を軽減します。
Oracle Loader for Hadoopは、リデューサ間のデータのバランスを調整してパフォーマンスを向上させるJava MapReduceアプリケーションです。このアプリケーションは様々な入力データ形式を扱い、フィールドを集めたレコード形式でデータを表します。レコード形式のデータが存在するソース(AvroファイルやApache Hive表など)からデータを読み取ったり、テキスト・ファイルの行をフィールドに分割できます。
Javaプログラミングのスキルがあれば、カスタム入力形式を定義して、ローダーで処理できるデータ・タイプを拡張できます。Oracle Loader for Hadoopは、そのカスタム・コードを使用してフィールドとレコードを抽出します。
Oracle Loader For Hadoopのインタフェース
Oracle Loader for Hadoopには次の2つの使用方法があります。hadoop
コマンドライン・ユーティリティ。
コマンドラインで、ジョブの詳細を構成設定します。通常、これらの設定はジョブ構成ファイルに指定します
Oracle SQL Developerの使用。
Oracle SQL Developerは、多くの製品の中でも特にOracle DatabaseおよびOracle Big Data Connectorsとの統合を実現した無償のグラフィカルIDEです。これには、Oracle Big Data Connectorsへのアクセスとその使用を支援するウィザードが付属しています。Oracle SQL DeveloperをダウンロードしてOracle Big Data Connectorsと併用するためにそれを構成する方法の詳細は、このガイドの「Oracle SQL DeveloperとOracle Big Data Connectorsの併用」を参照してください。
Oracle Loader for Hadoopには次の2つの動作モードがあります。
オンライン・データベース・モードでは、Oracle Loader for Hadoopはジョブ構成ファイルまたはOracle Walletに格納されている資格証明を使用してターゲット・データベースに接続します。ローダーはこのデータベースから表のメタデータを取得します。新規レコードは、直接ターゲット表に挿入することも、Hadoopクラスタ内のファイルに書き込むこともできます。データベースのデータが必要なとき、またはデータベース・システムが比較的空いているときには、レコードを出力ファイルからロードできます。
次の図は、オンライン・データベース・モードの要素間の関係を示しています。
オフライン・データベース・モードでは、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など、別のユーティリティを使用して別途実行します。
次の図は、オフライン・データベース・モードの要素間の関係を示しています。この図には、データをターゲット表にロードする別途の手順は示されていません。
Oracle Loader for Hadoopはデータを1つのターゲット表にロードします。この表はOracleデータベース内に存在する必要があります。表は、空でも、データが格納されていてもかまいません。Oracle Loader for Hadoopは既存のデータを上書きしません。
表は、他の用途に使用する場合も同じ方法で作成します。その際は、次の制限に従う必要があります。
パーティション化は、非常に大規模な表の管理および効率的な問合せを行うためのデータベースの機能です。アプリケーションに対して完全に透過的な方法で、大規模な表をパーティションと呼ばれる小規模でより管理し易いサイズに分割する方法を提供します。
ターゲット表の定義には、次のシングルレベルおよびコンポジットレベルのパーティション化方式を使用できます。
ハッシュ
ハッシュ-ハッシュ
ハッシュ-リスト
ハッシュ-レンジ
時間隔
時間隔-ハッシュ
時間隔-リスト
時間隔-レンジ
リスト
リスト-ハッシュ
リスト-リスト
リスト-レンジ
レンジ
レンジ-ハッシュ
レンジ-リスト
レンジ-レンジ
Oracle Loader for Hadoopでは、参照パーティション化または仮想列ベースのパーティション化はサポートされません。
関連項目:
『Oracle Database VLDBおよびパーティショニング・ガイド』
構成ファイルは、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 ジョブ構成ファイル
<?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>
ターゲット表に関する情報をOracle Loader for Hadoopに指定する必要があります。この情報の指定方法は、Oracle Loader for Hadoopをオンライン・データベース・モードまたはオフライン・データベース・モードのどちらで実行するかによって異なります。「操作モードの概要」を参照してください。
Oracle Loader for HadoopはOracleデータベースの表のメタデータを使用して列名、データ型、パーティションなどを識別します。JDBC接続が確立可能な場合、ローダーでメタデータを自動的にフェッチします。
資格証明にはウォレットを使用することをお薦めします。Oracleウォレットを使用するには、次のプロパティをジョブ構成ファイルに入力します。
パスワードは、クリア・テキストには保存しないで、ウォレットを使用して資格証明を保護することをお薦めします。Oracle Walletを使用しない場合は、次のプロパティを入力します。
ローダー・ジョブでデータベースにアクセスできない場合があります。たとえば、HadoopクラスタがOracle Databaseとは別のネットワークにある場合などです。この場合、OraLoaderMetadataユーティリティを使用して、ターゲット表のメタデータをファイルに抽出し、保存します。
オフライン・データベース・モードでターゲット表のメタデータを指定するには、次の手順を実行します。
Oracle Databaseシステムにログインします。
初めてオフライン・データベース・モードを使用する場合は、データベース・システムがインストールおよび構成されていることを確認します。
「オフライン・データベース・モードのサポート」を参照してください。
OraLoaderMetadata
ユーティリティ・プログラムを実行して、表のメタデータをエクスポートします。「OraLoaderMetadataユーティリティ」を参照してください。
表のメタデータが格納されている生成済XMLファイルをHadoopクラスタにコピーします。
ジョブ構成ファイルのoracle.hadoop.loader.tableMetadataFile
プロパティを使用して、Hadoopクラスタ上のXMLメタデータの場所を指定します。
ローダー・ジョブの実行時、このXMLドキュメントがアクセスされ、ターゲット表のメタデータが検出されます。
Oracle Databaseシステムで、次の構文を使用してOraLoaderMetadata
ユーティリティを実行します。java
コマンドは1行で入力する必要がありますが、以下では見やすくするために複数行に分けて示しています。
java oracle.hadoop.loader.metadata.OraLoaderMetadata -user userName -connection_url connection [-schema schemaName] -table tableName -output fileName.xml
OraLoaderMetadataのヘルプ・ファイルを表示するには、このコマンドをオプションなしで使用します。
オプション
ターゲット表を所有するOracle Databaseユーザー。ユーザーは、パスワードを要求されます。
次のようなThinスタイル・サービス名形式のデータベース接続文字列。
jdbc:oracle:thin:@//hostName:port/serviceName
サービス名が不明な場合は、特権ユーザーとして次のSQLコマンドを入力します。
show parameter service
NAME TYPE VALUE ------------------ ----------- ---------- service_names string orcl
ターゲット表を含むスキーマの名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。このオプションを省略した場合、-user
オプションで指定したスキーマ内のターゲット表が検索されます。
ターゲット表の名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。
メタデータ・ドキュメントの格納に使用される出力ファイルの名前。
次の例に、ターゲット表のメタデータをXMLファイルに保存する方法を示します。
例3-2 表のメタデータの生成
OraLoaderMetadataユーティリティを実行します。
$ java -cp '/tmp/oraloader-<version>-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 <version> - 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 <version> - Production
Copyright (c) 2011, 2016, 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>
.
.
.
入力形式は、Hadoopに保存されている特殊な種類のデータを読み取る場合に使用します。次に示す様々な入力形式を使用して、Hadoopで一般的に利用されるデータ形式を読み取ることができます。
固有のカスタム入力形式を使用することもできます。組込み形式の説明に、カスタムInputFormat
クラスの開発に役立つ情報を記入します。「カスタム入力形式」を参照してください。
データベース表にロードするデータの特定の入力形式を指定するには、ジョブ構成ファイルのmapreduce.job.inputformat.class
構成プロパティを使用します。
注意:
組込みテキスト形式では、引用符で囲んだ値に埋め込まれたヘッダー行や改行文字(\n
)は処理されません。
デリミタ付きテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.class
を次のように設定します
oracle.hadoop.loader.lib.input.DelimitedTextInputFormat
入力ファイルは次の要件に従う必要があります。
レコードは改行文字で区切る。
フィールドは、カンマやタブなどの1文字のマーカーで区切る。
空の文字列のトークンは囲まれていても囲まれていなくても、nullで置き換えられます。
DelimitedTextInputFormat
は、SQL*Loaderのトークン化方式をエミュレートします。つまり、各データはtで終了し、オプションでieまたはieとteで囲みます。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によって自動的に解凍されます。
DelimitedTextInputFormat
で処理するには複雑すぎるテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.class
を次のように設定します
oracle.hadoop.loader.lib.input.RegexInputFormat
たとえば、Webログのあるフィールドが引用符で区切られ、別のフィールドが角カッコで区切られている場合があります。
RegexInputFormat
を使用する場合、レコードは改行文字で区切る必要があります。各テキスト行のフィールドは、正規表現のマッチングによって識別されます。
正規表現はテキスト行全体が一致する必要があります。
フィールドの識別には正規表現のキャプチャ・グループが使用されます。
RegexInputFormat
はjava.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
Hive表からデータをロードするには、mapreduce.job.inputformat.class
を次のように設定します
oracle.hadoop.loader.lib.input.HiveToAvroInputFormat
パーティション化されていない表の場合は、HiveToAvroInputFormat
が表全体(Hive表のディレクトリ内の全ファイル)をインポートします。
パーティション化表の場合は、HiveToAvroInputFormat
が1つ以上のパーティションをインポートします。パーティションはロードまたはスキップのいずれかを行うことができます。ただし、パーティションを一部ロードすることはできません。
Oracle Loader for Hadoopは、複合(非プリミティブの)列に値があるすべての行を拒否します。プリミティブ値に解決するUNIONTYPE
フィールドがサポートされています。「拒否されたレコードの処理」を参照してください。
HiveToAvroInputFormat
は、Hive表の行をAvroレコードに変換し、Hive表の列名を大文字に変換して、フィールド名を生成します。この自動大文字変換により、フィールド名がターゲット表の列名と一致する確率が高くなります。「ターゲット表列への入力フィールドのマッピング」を参照してください。
注意:
この入力形式では、列名に引用符で囲まれた識別子が使用されているHive表はサポートされません。「HIVE-6013」を参照してください
HiveToAvroInputFormat
はSQL Standard Based Hive Authorizationを実施しないことにも注意してください。詳細は、https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization
を参照してください。
標準的なAvro形式のレコードが格納されているバイナリAvroデータ・ファイルからデータをロードするには、mapreduce.job.inputformat.class
を次のように設定します
oracle.hadoop.loader.lib.input.AvroInputFormat
拡張子が.avroのファイルのみを処理するには、mapreduce.input.fileinputformat.inputdir
構成プロパティにリストされているディレクトリに*.avro
を追加します。
Oracle NoSQL Databaseからデータをロードするには、mapreduce.job.inputformat.class
を次のように設定します
oracle.kv.hadoop.KVAvroInputFormat
この入力形式はOracle NoSQL Database 11g、リリース2以降で定義されています。
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>
のサブクラスです。
次の構成プロパティを使用して、キーと値のストアの名前と場所を指定する必要があります。
「Oracle NoSQL Databaseの構成プロパティ」を参照してください。
組込み入力形式では不十分な場合は、カスタム入力形式のJavaクラスを作成できます。以下では、Oracle Loader for Hadoopで使用できる入力形式のフレームワークについて説明します。
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
入力オブジェクトのスキーマを使用して入力フィールドの名前を検出し、ターゲット表の列にマップします。
IndexedRecord
の値の処理でエラーが発生した場合、Oracle Loader for HadoopはRecordReader
のgetCurrentKey
メソッドで返されるオブジェクトを使用してフィードバックを提供します。また、キーのtoString
メソッドを呼び出し、結果をエラー・メッセージで書式設定します。InputFormat
の開発者は、次のいずれかの情報を返すことにより、拒否されたレコードの識別でユーザーを支援できます。
データ・ファイルのURI
InputSplit
情報
データ・ファイル名とそのファイルのレコードのオフセット
機密情報が含まれる可能性があるため、レコードをクリア・テキスト形式で返すことはお薦めできません。返された値はクラスタ全体のHadoopのログに出力できます。「拒否されたレコードの不正なファイルへのロギング」を参照してください。
レコードが失敗すると、キーがnullの場合、ローダーは識別情報を生成しません。
Oracle Loader for Hadoopは、サンプラを使用してMapReduceジョブのパフォーマンスを向上させます。サンプラはマルチスレッド化され、各サンプラ・スレッドは、指定されたInputFormat
クラスのコピーをインスタンス化します。新しいInputFormat
を実装する場合は、スレッドセーフであることを確認します。「パーティション化表にデータをロードする場合のロード・バランシング」を参照してください。
Oracle Loader for HadoopにはInputFormat
のサンプル・ソース・コードが用意されており、このソース・コードはexamples/jsrc/
ディレクトリにあります。
サンプルの形式では、データを単純なカンマ区切り値(CSV)ファイルからロードします。この入力形式を使用するには、oracle.hadoop.loader.examples.CSVInputFormat
をジョブ構成ファイルのmapreduce.job.inputformat.class
の値として指定します。
この入力形式では、F0、F1、F2といったフィールド名が自動的に割り当てられます。構成プロパティはありません。
マッピングは、入力フィールドをターゲット表のどの列にロードするかを示します。自動マッピング機能を使用することも、常に手動で入力フィールドをターゲット列にマップすることもできます。
Oracle Loader for Hadoopでは、入力データが次の要件に従っていれば、フィールドを適切な列に自動的にマップできます。
ターゲット表のすべての列をロードする。
IndexedRecord
入力オブジェクトの入力データ・フィールド名が列名と完全に一致している。
DATE
列にマップされるすべての入力フィールドを、同じJava日付形式を使用して解析できる。
自動マッピングの場合は、次の構成プロパティを使用します。
oracle.hadoop.loader.loaderMap.targetTable
: ターゲット表を識別します。
oracle.hadoop.loader.defaultDateFormat
: すべてのDATE
フィールドに適用するデフォルトの日付形式を指定します。
自動マッピングの要件に準拠していないロードの場合は、追加のプロパティを定義する必要があります。これらのプロパティでは、次のことが可能です。
データをターゲット表の列のサブセットにロードする。
入力フィールド名がデータベースの列名とまったく同じではない場合に、明示的なマッピングを作成する。
入力フィールドごとに異なる日付形式を指定する。
手動マッピングの場合は、次のプロパティを使用します。
oracle.hadoop.loader.loaderMap.targetTable
構成プロパティは、ターゲット表を識別します。必須。
oracle.hadoop.loader.loaderMap.columnNames
: ロード対象の列をリストします。
oracle.hadoop.loader.defaultDateFormat
: すべてのDATE
フィールドに適用するデフォルトの日付形式を指定します。
oracle.hadoop.loader.loaderMap.column_name.format
: 特定の列のデータ形式を指定します。
oracle.hadoop.loader.loaderMap.column_name.field
: 特定の列にマップされるAvroレコード・フィールドの名前を識別します。
次のユーティリティは、以前のリリースのローダー・マップ・ファイルを構成ファイルに変換します。
hadoop oracle.hadoop.loader.metadata.LoaderMap -convert map_file conf_file
オプション
次の例に、サンプルの変換を示します。
例3-3 ローダー・ファイルから構成プロパティへの変換
$ HADOOP_CLASSPATH="$OLH_HOME/jlib/*:$HADOOP_CLASSPATH" $ hadoop oracle.hadoop.loader.metadata.LoaderMap -convert loadermap.xml conf.xml Oracle Loader for Hadoop Release 3.8.1 - Production Copyright (c) 2012, 2017, 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>
オンライン・データベース・モードでは、データを直接Oracleデータベース表にロードするか、ファイルに保存するかを選択できます。オフライン・データベース・モードでは、出力データの保存先はファイルに制限され、このファイルをターゲット表に個別のプロシージャとしてロードできます。ジョブ構成ファイルに出力形式を指定するには、mapreduce.job.outputformat.class
プロパティを使用します。
次の出力形式から選択します。
JDBC出力形式: データをターゲット表に直接ロードします。
Oracle OCIダイレクト・パス出力形式: データをターゲット表に直接ロードします。
デリミタ付きテキスト出力形式: データをローカル・ファイルに保存します。
Oracle Data Pump出力形式: データをローカル・ファイルに保存します。
HadoopシステムとOracle Databaseとの間のJDBC接続を利用してデータをロードできます。ローダー・ジョブの出力レコードは、タスクをオンライン・データベース・モードのOraLoader
プロセスの一部としてマップまたはリデュースすると、ターゲット表に直接ロードされます。データをロードするための追加手順は不要です。
ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のJDBC接続をオープンしている必要があります。
この出力形式を使用するには、mapreduce.job.outputformat.class
を次のように設定します
oracle.hadoop.loader.lib.output.JDBCOutputFormat
JDBCOutputFormat
では、標準のJDBCバッチを使用してパフォーマンスと効率を最適化します。バッチの実行中に制約違反などのエラーが発生した場合、JDBCドライバはただちに実行を停止します。つまり、バッチに100行あり、10行目でエラーが発生した場合、9行は挿入され、91行は挿入されません。
JDBCドライバではエラーが発生した行が特定されないため、Oracle Loader for Hadoopでは、バッチ内の各行の挿入ステータスは把握されません。バッチ内のエラーが発生したすべての行に問題があるとみなされ、行はターゲット表に挿入される場合もあれば、挿入されない場合もあります。次のバッチのロードが続けられます。バッチ・エラーの数と問題のある行の数を示すロード・レポートがジョブの最後に生成されます。
この問題に対処する方法の1つは、ターゲット表に対して一意キーを定義することです。たとえば、HR.EMPLOYEES
表にEMPLOYEE_ID
という名前の主キーがあるとします。この場合、データをHR.EMPLOYEES
にロードした後、EMPLOYEE_ID
で問合せを行って欠落している従業員IDを検出します。欠落している従業員IDが入力データに見つかったら、ロードに失敗した原因を特定し、再度ロードを試行できます。
Oracle Call Interface (OCI)のダイレクト・パス・インタフェースを使用して、データをターゲット表にロードします。オンライン・データベース・モードでは、各リデューサが異なるデータベース・パーティションにロードするため、並列ロードのパフォーマンス向上が可能になります。データをロードするための追加手順は不要です。
ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のOCI接続をオープンしている必要があります。
この出力形式を使用するには、mapreduce.job.outputformat.class
を次のように設定します
oracle.hadoop.loader.lib.output.OCIOutputFormat
OCIOutputFormat
には、次の制限があります。
Linux x86.64プラットフォームでのみ使用できます。
MapReduceジョブで1つ以上のリデューサを作成する必要があります。
ターゲット表は、パーティション化されている必要があります。
Oracle Database 11g (11.2.0.3)では、ターゲット表が、サブパーティション・キーにCHAR
、VARCHAR2
、NCHAR
またはNVARCHAR2
列が含まれるコンポジット時間隔パーティション化表の場合、Oracle Bug#13498646を適用します。後続バージョンのOracle Databaseでは、このパッチは必要ありません。
Hadoopクラスタでデリミタ付きテキスト出力ファイルを作成できます。マップまたはリデュース・タスクは、ジョブ構成ファイルに指定されたフィールド・デリミタと囲み文字を使用して、デリミタ付きテキスト・ファイルを生成します。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DelimitedTextOutputFormatの概要」を参照してください。
この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続で表のメタデータを取得し、オフライン・データベース・モードの場合には、OraloaderMetadata
ユーティリティによって生成された表のメタデータ・ファイルを使用できます。
この出力形式を使用するには、mapreduce.job.outputformat.class
を次のように設定します
oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat
出力タスクによって、デリミタ付きテキスト形式ファイル、1つ以上の対応するSQL*Loader制御ファイルおよび外部表を使用してロードするためのSQLスクリプトが生成されます。
ターゲット表がパーティション化されていない場合、またはoracle.hadoop.loader.loadByPartition
がfalse
の場合には、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」を参照してください。
または、デリミタ付きテキスト・ファイルをデータベース・システムにコピーして、次のいずれかの方法でデータをターゲット表にロードすることもできます。
ファイルは${mapreduce.output.fileoutputformat.outputdir}/_olh
ディレクトリにあります。
出力ファイル内のレコードとフィールドの形式は、次のプロパティによって制御されます。
次の例に、出力タスクで生成されるサンプル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' )
Hadoopクラスタでデータ・ポンプ形式ファイルを作成できます。データ・ポンプ・ファイルは、マップまたはリデュース・タスクによって生成されます。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DataPumpOutputFormatの概要」を参照してください。
この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続を使用し、オフライン・データベース・モードの場合には、OraloaderMetadata
ユーティリティによって生成された表のメタデータ・ファイルを使用できます。
この出力形式を使用するには、mapreduce.job.outputformat.class
を次のように設定します
oracle.hadoop.loader.lib.output.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スクリプトを使用してロードすることもできます。このスクリプトは次のタスクを実行します。
ORACLE_DATAPUMP
アクセス・ドライバを使用する外部表定義を作成します。バイナリ形式のOracle Data Pump出力ファイルは、外部表のLOCATION
句にリストされます。
外部表によって使用されるディレクトリ・オブジェクトを作成します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。スクリプトで使用するディレクトリ名を指定するには、ジョブ構成ファイルにoracle.hadoop.loader.extTabDirectoryName
プロパティを設定します。
外部表からターゲット表に行を挿入します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。
SQLスクリプトは${mapreduce.output.fileoutputformat.outputdir}/_olh
ディレクトリにあります。
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の方法に従います。
基本オプション
ジョブ構成ファイルを識別します。「ジョブ構成ファイルの作成」を参照してください。
入力形式として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="$OLH_HOME/jlib/*:$HADOOP_CLASSPATH" hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \ -conf MyConf.xml -libjars $OLH_HOME/jlib/oraloader-examples.jar
HiveToAvroInputFormat
を使用する場合は、Hive構成ディレクトリをHADOOP_CLASSPATH
環境変数に追加する必要があります。
HADOOP_CLASSPATH="$OLH_HOME/jlib/*:hive_home/lib/*:hive_conf_dir:$HADOOP_CLASSPATH"
次のHive JARファイルを、カンマ区切りリスト形式で、hadoop
コマンドの-libjars
オプションに追加する必要もあります。アスタリスク(*)を完全なファイル名に置き換えます。
hive-exec-*.jar
hive-metastore-*.jar
libfb303*.jar
次の例は、Cloudera's Distribution including Apache Hadoop (CDH) 5.8の完全なファイル名を示しています。
# hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf MyConf.xml \
-libjars hive-exec-1.1.0-cdh5.8.0.jar, hive-metastore-1.1.0-cdh5.8.0.jar, libfb303-0.9.3.jar
Oracle Loader for Hadoopは、次のような様々な理由で入力レコードを拒否します。
マッピング・プロパティのエラー
入力データ内の欠落フィールド
無効な表パーティションにマップされたレコード
不正な書式のレコード(たとえば、日付が日付形式に一致しない場合や、レコードが正規表現パターンに一致しない場合)
デフォルトでは、Oracle Loader for Hadoopは、拒否されたレコードをHadoopログに記録せず、拒否されたレコードの識別方法のみを記録します。これにより、クラスタ全体に存在するHadoopログにユーザーの機密情報が格納されることを防ぎます。
拒否されたレコードを記録するようにOracle Loader for Hadoopを管理するには、構成プロパティoracle.hadoop.loader.logBadRecords
をtrue
に設定します。Oracle Loader for Hadoopは、ジョブの出力ディレクトリ内にある_olh/
ディレクトリの1つ以上の「不正な」ファイルに不正なレコードを記録します。
一部の問題により、Oracle Loader for Hadoopが入力のすべてのレコードを拒否することがあります。このような問題による時間とリソースの無駄を軽減するため、Oracle Loader for Hadoopは、1000レコードが拒否されると、ジョブを中止します。
拒否レコードの最大許可数を変更するには、構成プロパティoracle.hadoop.loader.rejectLimit
を設定します。負の値を設定すると、拒否制限が無効になり、拒否されるレコードの数に関係なくジョブの実行が完了します。
ロード・バランシングの目標は、すべてのリデューサにほぼ同量の処理を割り当てるMapReduceパーティション化スキームを生成することです。
Oracle Loader for Hadoopのサンプリング機能を使用すると、パーティション化されたデータベース表にデータをロードするときにリデューサ間で負荷を分散できます。このサンプリング機能では、データベース・パーティションをリデューサに割り当てる効率的なMapReduceパーティション化スキームが生成されます。
リデューサの実行時間は、通常、処理するレコードの数に比例します。レコードが多いほど、実行時間は長くなります。サンプリング機能が無効の場合、特定のデータベース・パーティションのすべてのレコードが1つのリデューサに送られます。データベース・パーティションによってレコードの数が異なることがあるため、これによってリデューサの負荷は不均等になります。Hadoopジョブの実行時間は、通常、最も遅いリデューサの実行時間によって決まるため、リデューサの負荷が不均等な場合、ジョブ全体のパフォーマンスが低下します。
サンプリング機能の有効/無効を切り替えるには、構成プロパティoracle.hadoop.loader.sampler.enableSampling
を設定します。サンプリング機能はデフォルトで有効になっています。
次のジョブ構成プロパティによってロード・バランシング機能の質を制御します。
サンプラは、所定のリデューサ負荷係数を使用してパーティション化スキームの質を評価します。負荷係数は、(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
というデフォルト値では、負荷分散の質と実行時間の兼合いが適切にとられます。
デフォルトでは、サンプラは、maxLoadFactor
とloadCI
の基準を満たすパーティション化スキームを生成するのに十分なサンプルを収集するまで実行されます。
ただし、サンプリングする最大レコード数を指定するoracle.hadoop.loader.sampler.maxSamplesPct
プロパティを設定すると、サンプラの実行時間を制限できます。
Oracle Loader for Hadoopでは、サンプリングが成功の場合にのみ、生成されたパーティション化スキームを使用します。統計的信頼度loadCI
で保証される最大リデューサ負荷係数(1+ maxLoadFactor
)のパーティション化スキームが生成される場合、サンプリングは成功です。
パーティション・レポートは、様々なマッパーに割り当てられたキーを識別します。このレポートは、サンプラで使用するためのXML形式で保存されます。ユーザーが使用するための情報は含まれません。このレポートには、${mapreduce.output.fileoutputformat.outputdir}/_balancer/orabalancer_report.xml
という名前が付けられます。サンプル化されたジョブ専用に生成されます。このxmlファイルには、マッピング出力を異なるリデューサに割り当てる方法およびサンプリング統計の説明が含まれます。
デフォルト値maxLoadFactor
、loadCI
およびmaxSamplesPct
により、サンプラは、様々な入力データ分布に対する質の高いパーティション化スキームを正常に生成できます。ただし、制約が厳しすぎる場合や、必要なサンプルの数が、ユーザーが指定した最大数であるmaxSamplesPct
を超えている場合などには、サンプラがカスタム・プロパティ値を使用したパーティション化スキームの生成に失敗することがあります。このような場合、Oracle Loader for Hadoopは、問題を特定するログ・メッセージを生成し、データベースのパーティション化スキームを使用してレコードの分割を行い、負荷分散は保証されません。
代替策は、構成プロパティの値を緩和することです。これは、maxSamplesPct
を大きくするか、maxLoadFactor
またはloadCI
、あるいはその両方を小さくすることによって行えます。
カスタム入力形式では、メモリーに収まらない入力分割が返されることがあります。このような場合、サンプラは、ローダー・ジョブが発行されるクライアント・ノードでメモリー不足エラーを返します。
この問題の解決策は、次のとおりです。
ジョブが発行されるJVMのヒープ・サイズを大きくします。
次のプロパティを調整します。
カスタム入力形式を開発する場合は、「カスタム入力形式」を参照してください。
Oracle Loader for Hadoopを使用してデータをOracle Big Data ApplianceからOracle Exadata Database Machineにロードする場合、InfiniBandプライベート・ネットワーク上でSockets Direct Protocol (SDP)を使用するようにシステムを構成することによって、スループットを向上させることができます。この設定は、データのロードのみを目的としてOracle Databaseに接続するための追加接続属性を指定します。
SDPプロトコルを指定するには、次のようにします。
HADOOP_OPTS
環境変数にJVMオプションを追加して、JDBC SDPエクスポートを有効にします。
HADOOP_OPTS="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
次のようにして、このHadoop構成プロパティを子タスクJVMに設定します。
-D mapred.child.java.opts="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"
注意:
このHadoop構成プロパティは、OLHコマンドラインに追加したり、構成ファイルに設定したりできます。
標準のイーサネット通信を構成します。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.url
を設定します。
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=hostName)(PORT=portNumber))) (CONNECT_DATA=(SERVICE_NAME=serviceName)))
ExadataでOracleリスナーを、SDPプロトコルをサポートするように構成し、特定のポート・アドレス(1522など)にバインドします。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.oci_url
の値としてリスナー・アドレスを指定します。
(DESCRIPTION=(ADDRESS=(PROTOCOL=SDP) (HOST=hostName) (PORT=portNumber)) (CONNECT_DATA=(SERVICE_NAME=serviceName)))
hostName、portNumberおよびserviceNameは、Oracle Exadata Database Machine上のSDPリスナーを識別するための適切な値に置き換えます。
関連項目:
InfiniBandによる通信の構成の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。
OraLoader
は、構成プロパティの指定にhadoopコマンドの標準的なメソッドを使用します。構成ファイルを指定する場合は-conf
オプションを使用し、個別のプロパティを指定する場合は-D
オプションを使用します。
この項では、一般にOraLoader
ジョブに設定する必要があるOraLoader構成プロパティ、Oracle NoSQL Database構成プロパティ、そしていくつかの汎用的なHadoop MapReduceプロパティについて説明します。
すべてのOraLoaderプロパティを示す構成ファイルは、$OLH_HOME/doc/oraloader-conf.xml
にあります。
MapReduce構成プロパティ
プロパティ | 説明 |
---|---|
mapreduce.job.name |
型: String デフォルト値: 説明: Hadoopのジョブ名。一意の名前を付けることで、Hadoop JobTracker WebインタフェースやCloudera Managerなどのツールを使用してジョブを監視できます。 |
mapreduce.input.fileinputformat.inputdir |
型: String デフォルト値: 定義されていません。 説明: 入力ディレクトリの名前のカンマ区切りリスト。 |
mapreduce.job.inputformat.class |
型: String デフォルト値: 定義されていません。 説明: 入力データの形式を識別します。次のいずれかの組込み入力形式またはカスタム
組込み入力形式の詳細は、「入力形式の概要」を参照してください。 |
mapreduce.output.fileoutputformat.outputdir |
型: String デフォルト値: 定義されていません。 説明: 出力ディレクトリのカンマ区切りリスト。ジョブを実行する前には存在しません。必須。 |
mapreduce.job.outputformat.class |
型: String デフォルト値: 定義されていません。 説明: 出力タイプを指定します。値は次のとおりです。
「出力形式の概要」を参照してください。 |
mapreduce.job.reduces |
型: Integer デフォルト値: 1 説明: Oracle Loader for Hadoopジョブで使用されるリデュース・タスクの数。デフォルト値の1ではパラレル処理がサポートされないため、複数のパラレル・データ・ロードをサポートするよう値を大きくすると、パフォーマンスが向上します。ジョブのリデュース・タスクの数には、十分であるが過剰でない値を選択してください。使用可能なリソースによって決定されるポイントでリデュース・タスクの数を過度に増やすと、向上がみられなくなる一方で、他のジョブのパフォーマンスが低下する可能性もあります。 |
OraLoaderの構成プロパティ
プロパティ | 説明 |
---|---|
oracle.hadoop.loader.badRecordFlushInterval |
型: Integer デフォルト値: 説明: ログ・ファイルをフラッシュするまでにタスクの試行を記録できる最大レコード数を設定します。この設定により、レコードの拒否が制限( フラッシュ間隔を有効にするには、 |
oracle.hadoop.loader.compressionFactors |
型: 小数 デフォルト値: 説明: これらの値は、サンプリングが有効でターゲット表が圧縮されているときにOracle Loader for Hadoopによって使用されます。これらは、ターゲット表の圧縮係数です。最高のパフォーマンスを得るには、このプロパティの値がターゲット表の圧縮係数と一致している必要があります。値は名前=値のペアのカンマ区切りリストです。名前は次のキーワードのいずれかである必要があります。
|
oracle.hadoop.loader.connection.defaultExecuteBatch |
型: Integer デフォルト値: 説明: データベースへのトリップごとに挿入されるレコード数。 1以上の値を指定します。最大値の制限はありませんが、パフォーマンスはあまり向上せずにメモリー・フットプリントが大きくなるため、非常に大きいバッチ・サイズを使用することは推奨されません。 値が1未満の場合は、デフォルト値が設定されます。 |
oracle.hadoop.loader.connection.oci_url |
型: String デフォルト値: 説明: 次の例では、OCI接続にソケット・ダイレクト・プロトコル(SDP)を指定しています。
この接続文字列に接頭辞"jdbc:oracle:thin:@"は不要です。最初のアット記号(@)までのすべての文字が削除されます。 |
oracle.hadoop.loader.connection.password |
型: String デフォルト値: 定義されていません。 説明: 接続するユーザーのパスワード。パスワードの保存にはクリア・テキストを使用しないことをお薦めします。かわりにOracle Walletを使用してください。 |
oracle.hadoop.loader.connection.sessionTimeZone |
型: String デフォルト値: 説明: データベース接続のセッション・タイムゾーンを変更します。有効な値は、次のとおりです。
このプロパティは、 |
oracle.hadoop.loader.connection.cluster.tns_admin |
型: String デフォルト値: 定義されていません。 説明: TNS adminの場所がクライアント側と異なる場合の、クラスタ・ノード上のTNS adminの場所。 デフォルトでは、クライアント側のTNS adminの場所は、クラスタ・ノード上と同じくoracle.hadoop.loader.connection.tns_adminによって指定します。
|
oracle.hadoop.loader.connection.tns_admin |
型: String デフォルト値: 定義されていません。 説明: Hadoopクラスタの各ノードにある、 Oracle Walletを外部パスワード・ストアとして使用する場合(推奨)、このプロパティを設定する必要があります。 |
oracle.hadoop.loader.connection.tnsEntryName |
型: String デフォルト値: 定義されていません。 説明: |
oracle.hadoop.loader.connection.url |
型: String デフォルト値: 定義されていません。 説明: データベース接続のURL。このプロパティは、他のすべての接続プロパティより優先されます。 Oracle Walletが外部パスワード・ストアとして構成されている場合(推奨)、プロパティ値は、ドライバ接頭辞 次の例に、接続URLの有効な値を示します。
|
oracle.hadoop.loader.connection.user |
型: String デフォルト値: 定義されていません。 説明: データベース・ユーザー名。このプロパティでは オンライン・データベース・モードを使用する場合は、このプロパティまたは |
oracle.hadoop.loader.connection.wallet_location |
型: String デフォルト値: 定義されていません。 説明: Hadoopクラスタの各ノードにある、接続資格証明が格納されているOracle Walletディレクトリへのファイル・パス。 Oracle Walletを使用する場合、次のプロパティも設定する必要があります。 |
oracle.hadoop.loader.connection.cluster.wallet_location |
型: String デフォルト値: 定義されていません。 説明: ウォレットの場所がクライアント側と異なる場合の、クラスタ・ノード上のウォレットの場所。 デフォルトでは、クライアント側のウォレットの場所は、クラスタ・ノード上のウォレットの場所と同じくoracle.hadoop.loader.connection.wallet_locationによって指定します。
|
oracle.hadoop.loader.defaultDateFormat |
型: String デフォルト値: 説明: |
oracle.hadoop.loader.enableSorting |
型: Boolean デフォルト値: 説明: 各リデューサ・グループ内の出力レコードをソートするかどうかを制御します。ターゲット表のソート・キーとなる列を指定するには、 |
oracle.hadoop.loader.enforceClasspath |
型: Boolean デフォルト値: 一致しないバージョンのJARがクラスパスに追加されないようにするために、Oracle Loader for Hadoopでは、内部クラスが このチェックを無効にするには、プロパティを |
oracle.hadoop.loader.extTabDirectoryName |
型: String デフォルト値: 説明: 外部表の このプロパティは |
oracle.hadoop.loader.input.fieldNames |
型: String デフォルト値: 説明: 入力フィールドの名前のカンマ区切りリスト。 組込み入力形式の場合は、目的のフィールドだけではなく、データ内のすべてのフィールドの名前を指定します。入力行のフィールド数がこのプロパティに指定されたフィールド名の数より多い場合、余分なフィールドは破棄されます。行のフィールド数がこのプロパティに指定されたフィールド名の数より少ない場合、余分なフィールドにはnullが設定されます。選択したフィールドのみをロードする場合は、「ターゲット表列への入力フィールドのマッピング」を参照してください。 名前は、レコードのAvroスキーマの作成に使用されるため、有効なJSON名文字列である必要があります。 このプロパティは、 |
oracle.hadoop.loader.input.fieldTerminator |
型: String デフォルト値: 説明: |
oracle.hadoop.loader.input.hive.databaseName |
型: String デフォルト値: 定義されていません。 説明: 入力表が格納されているHiveデータベースの名前 |
oracle.hadoop.loader.input.hive.partitionFilter 注意: このプロパティは非推奨です。かわりにoracle.hadoop.loader.input.hive.rowFilter を使用してください。 |
型: String デフォルト値: 定義されていません。 説明: 式は次の制限に従う必要があります。
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 and 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表全体をロードします。 式は次の制限に従う必要があります。
いずれの場合も、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表(ストレージ・ハンドラによって管理されない表)から行のサブセットをインポートするときには
|
oracle.hadoop.loader.input.hive.tableName |
型: String デフォルト値: 定義されていません。 説明: 入力データが格納されているHive表の名前。 |
oracle.hadoop.loader.input.initialFieldEncloser |
型: String デフォルト値: 定義されていません。 説明: フィールドの開始を示す文字。値には、1文字または このプロパティが設定されている場合、パーサーは、各フィールドを囲まれていないトークン(値)として読み取る前にまず、囲まれたトークンとして読み取ります。フィールド囲み文字が設定されていない場合、パーサーは各フィールドを囲まれていないトークンとして読み取ります。 このプロパティを設定し、 |
oracle.hadoop.loader.input.regexCaseInsensitive |
型: Boolean デフォルト値: 説明: パターンの照合時に大文字と小文字を区別するかどうかを制御します。 このプロパティは |
oracle.hadoop.loader.input.regexPattern |
型: String デフォルト値: 定義されていません。 説明: 正規表現のパターン文字列。 正規表現はテキスト行全体が一致する必要があります。たとえば、入力行
このプロパティは 関連項目: 正規表現と取得グループの詳細は、次のサイトにあるJava Platform Standard Edition 6 API仕様の
|
oracle.hadoop.loader.input.trailingFieldEncloser |
型: String デフォルト値: 説明: フィールドの終了を示す文字を表します。値には、1文字または フィールドの囲み文字には、入力形式に定義された終端文字および空白文字とは異なる文字を使用する必要があります。 終了フィールド囲み文字が入力フィールドに組み込まれている場合、リテラル・テキストとして解析されるようにするには、二重にする必要があります。たとえば、 このプロパティを設定する場合、 |
oracle.hadoop.loader.loadByPartition |
型: Boolean デフォルト値: 説明: パーティションを認識するロードを指定します。Oracle Loader for Hadoopは、Hadoopクラスタ上のすべての出力形式の出力をパーティション別に整理します。このタスクはデータベース・システムのリソースには影響しません。
|
oracle.hadoop.loader.loaderMap.columnNames |
型: String デフォルト値: 定義されていません。 説明: ターゲット表の列名を任意の順序で示したカンマ区切りリスト。名前は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。 このプロパティは、 |
oracle.hadoop.loader.loaderMap.column_name.field |
型: String デフォルト値: 正規化された列名 説明: Avroレコードを含むフィールドの名前で、このプロパティ名で識別される列にマップされます。列名は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。オプション。 このプロパティは、 |
oracle.hadoop.loader.loaderMap.column_name.format |
型: String デフォルト値: 定義されていません。 説明: このプロパティ名で識別される列にロードするデータのデータ形式を指定します。日付形式には このプロパティは、 |
oracle.hadoop.loader.loaderMap.targetTable |
型: String デフォルト値: 定義されていません。 説明: ロード先の表のスキーマで修飾された名前。このプロパティは、 列のサブセットをロードするには、 |
oracle.hadoop.loader.loaderMapFile |
ローダー・マップは、リリース2.3以降で非推奨になりました。ローダー・マップ・ファイルは、 |
oracle.hadoop.loader.log4j.propertyPrefix |
型: String デフォルト値: 説明: 構成ファイルからロードされたApache Oracle Loader for Hadoopで -D log4j.logger.oracle.hadoop.loader.OraLoader=DEBUG -D log4j.logger.oracle.hadoop.loader.metadata=INFO この接頭辞で始まるすべての構成プロパティが 構成プロパティは |
oracle.hadoop.loader.logBadRecords |
型: Boolean デフォルト値: 説明: Oracle Loader for Hadoopが不正なレコードをファイルにログ記録するかどうかを制御します。 このプロパティは、入力形式とマッパーで拒否されるレコードのみに適用されます。出力形式またはサンプリング機能で発生したエラーには適用されません。 |
oracle.hadoop.loader.logRetentionPolicy |
型: String デフォルト値: 説明: どのような場合にジョブの最後にOracle Loader for Hadoopログを生成/保持する必要があるかを指定します。有効な値は、次のとおりです。
次の状況は、
logRetentionPolicy においてはエラーとみなされます。
次のファイルがこのプロパティの対象です。
|
oracle.hadoop.loader.olh_home |
型: String デフォルト値: 説明: OraLoaderジョブを開始するノード上のOracle Loader for Hadoopのホーム・ディレクトリのパス。このパスは、必要なライブラリの場所を示します。 |
oracle.hadoop.loader.olhcachePath |
型: String デフォルト値: 説明: Oracle Loader for HadoopがMapReduceの分散キャッシュにロードするファイルを作成できるHDFSディレクトリのフル・パスを識別します。 この分散キャッシュは、大規模なアプリケーション固有ファイルをキャッシュし、クラスタ内のノード間に効率的に分散する機能です。 |
oracle.hadoop.loader.output.dirpathBufsize |
型: Integer デフォルト値: 説明: |
oracle.hadoop.loader.output.escapeEnclosers |
型: Boolean デフォルト値: 説明: 埋込みの終了囲み文字をリテラル・テキストとして処理するかどうか(つまり、エスケープするかどうか)を制御します。このプロパティを |
oracle.hadoop.loader.output.fieldTerminator |
型: String デフォルト値: 説明: |
oracle.hadoop.loader.output.granuleSize |
型: Integer デフォルト値: 説明: 生成されたデータ・ポンプ・ファイルのグラニュル・サイズ(バイト)。 グラニュルは、 関連項目: |
oracle.hadoop.loader.output.initialFieldEncloser |
型: String デフォルト値: 定義されていません。 説明: 出力で生成される、フィールドの開始を示す文字。値には、1文字または フィールドに このプロパティを設定する場合、 |
oracle.hadoop.loader.output.trailingFieldEncloser |
型: String デフォルト値: 説明: 出力で生成される、フィールドの終了を示す文字。値には、1文字または フィールドに このプロパティを設定する場合、 |
oracle.hadoop.loader.rejectLimit |
型: Integer デフォルト値: 説明: ジョブの実行が停止するまでに拒否またはスキップできるレコードの最大数。負の値を設定すると、拒否制限が無効になり、ジョブの実行が完了します。
入力形式のエラーは、修復不可能でマップ・タスクが中止になるため、拒否制限に反映されません。サンプリング機能またはオンライン出力形式で発生したエラーも拒否制限に反映されません。 |
oracle.hadoop.loader.sampler.enableSampling |
型: Boolean デフォルト値: 説明: サンプリング機能が有効かどうかを制御します。サンプリングを無効にするには、このプロパティを
|
oracle.hadoop.loader.sampler.hintMaxSplitSize |
型: Integer デフォルト値: 説明: サンプリング・プロセスにHadoopの 一部の入力形式( データセットのデータ量が数十TB単位に上る場合や、入力形式の 分割サイズが大きいほど、I/Oパフォーマンスは高くなりますが、サンプリング性能は必ずしも高くなりません。この値を、適切なサンプリング性能を得られるような小さい値(ただし、小さすぎない値)に設定します。極度に小さい値を設定すると、I/Oパフォーマンスが非効率になり、返される分割数が多すぎて
|
oracle.hadoop.loader.sampler.hintNumMapTasks |
型: Integer デフォルト値: 説明: サンプリング・プロセスにHadoopの 一部の入力形式( データセットに対して、この値を100万行より大きい値に増やします。ただし、極度に大きい値を設定すると、返される分割数が多すぎて |
oracle.hadoop.loader.sampler.loadCI |
型: 小数 デフォルト値: 説明: リデューサの最大負荷係数に対する統計的信頼性インジケータ。 このプロパティは |
oracle.hadoop.loader.sampler.maxHeapBytes |
型: Integer デフォルト値: 説明: サンプラが使用可能なメモリーの最大容量をバイト単位で指定します。 次のいずれかの条件が真になった場合、サンプリングは中止されます。
|
oracle.hadoop.loader.sampler.maxLoadFactor |
型: Float デフォルト値: 説明: リデューサに対する最大許容負荷係数。値が このプロパティは 負荷が完全に分散された状態では、各リデューサに均等な作業量(負荷)が割り当てられています。負荷係数は、(assigned_load - ideal_load)/ideal_loadの計算で求められる各リデューサの相対的な過負荷を表します。ロード・バランシングが成功した場合、ジョブは指定した信頼度の最大負荷係数の範囲内で実行されます。
|
oracle.hadoop.loader.sampler.maxSamplesPct |
型: Float デフォルト値: 説明: 最大サンプル・サイズ(入力データ内のレコード数の割合)を設定します。値 このプロパティは0~1の範囲の値(0~100%)を受け入れます。負の値を設定すると、このプロパティは無効になります。 次のいずれかの条件が真になった場合、サンプリングは中止されます。
|
oracle.hadoop.loader.sampler.minSplits |
型: Integer デフォルト値: 説明: サンプラが中止条件を評価するまでに読み取る入力分割の最小数。入力分割の合計数が
|
oracle.hadoop.loader.sampler.numThreads |
型: Integer デフォルト値: 説明: サンプラのスレッド数。スレッド数が多いほど、サンプリングの同時実行性が高くなります。値が Oracle Loader for Hadoopのジョブを開始するノード上のプロセッサおよびメモリー・リソースに基づいて値を設定します。 |
oracle.hadoop.loader.sortKey |
型: String デフォルト値: 定義されていません。 説明: リデューサ・グループ内の出力レコードのソート・キーを構成する列名のカンマ区切りリスト。 引用符で囲まれている識別子または引用符で囲まれていない識別子を列名にすることができます。
|
oracle.hadoop.loader.tableMetadataFile |
型: String デフォルト値: 定義されていません。 説明: ターゲット表のメタデータ・ファイルへのパス。このプロパティは、オフライン・データベース・モードで実行する場合に設定します。 ローカル・ファイルを指定するには、次の例のように file:///home/jdoe/metadata.xml 表のメタデータ・ファイルを作成するには、 |
oracle.hadoop.loader.targetTable |
非推奨。 |
Oracle NoSQL Databaseの構成プロパティ
プロパティ | 説明 |
---|---|
oracle.kv.kvstore |
型: String デフォルト値: 定義されていません。 説明: ソース・データがあるKVストアの名前。 |
oracle.kv.hosts |
型: String デフォルト値: 定義されていません。 説明: ソース・データがあるKVストア内のホストを識別する、1つ以上のhostname:portペアの配列。複数のペアはカンマで区切ります。 |
oracle.kv.batchSize |
型: Key デフォルト値: 定義されていません。 説明: 各ネットワーク・ラウンドトリップ中、 |
oracle.kv.parentKey |
型: String デフォルト値: 定義されていません。 説明: 返される値を、指定されたキーの子のキーと値のペアのみに制限します。メジャー・キー・パスを部分パスとし、マイナー・キー・パスを空にする必要があります。null値(デフォルト)は出力を制限しないため、 |
oracle.kv.subRange |
型: KeyRange デフォルト値: 定義されていません。 説明: 返される値を、 |
oracle.kv.depth |
型: Depth デフォルト値: 説明: 返される値を、
|
oracle.kv.consistency |
型: Consistency デフォルト値: 説明: 子のキーと値のペアを読み取る際の一貫性保証です。次のキーワードは有効な値です。
|
oracle.kv.timeout |
型: Long デフォルト値: 説明: 選択したキーと値のペアを取得する場合の最大時間間隔(ミリ秒)を設定します。ゼロ(0)値は、プロパティをデフォルト値に設定します。 |
oracle.kv.formatterClass |
型: String デフォルト値: 定義されていません。 説明: Oracle NoSQL DatabaseのAvroレコードは直接Oracle Loader for Hadoopに移るため、NoSQLキーはターゲットのOracle Database表へのマッピングに使用できません。しかし、フォーマッタ・クラスはNoSQLのキーと値の両方を受け取るので、値とキーの両方を含む新しいAvroレコードを作成して返すことができ、これをOracle Loader for Hadoopに渡すことが可能になります。 |
Oracle Loader for Hadoopには、次のサードパーティ製品が含まれています。
Apache Avro 1.8.1
Apache Commons Mathematics Library 2.2
Oracle Loader for Hadoopには、Oracle 12cリリース1(12.1)クライアント・ライブラリが含まれます。Oracle Database 12cリリース1 (12.1)に含まれるサードパーティ製品の詳細は、『Oracle Databaseライセンス情報』を参照してください。
Oracle Loader for HadoopはHadoop 2.2.0で構築され、テストされます。
特に断りがないかぎり、あるいは、サードパーティ・ライセンス(LGPLなど)の条項で求められている場合、Apache Licensed Codeに関連するすべてのステートメントを含めた、この項のライセンスとステートメントは、告知のみを目的とするものです。
The following is included as a notice in compliance with the terms of the Apache 2.0 License, and applies to all programs licensed under the Apache 2.0 license:
You may not use the identified files except in compliance with the Apache License, Version 2.0 (the "License.")
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
A copy of the license is also reproduced below.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Definitions
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity.For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
Grant of Copyright License.Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
Grant of Patent License.Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted.If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
Redistribution.You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
You must give any other recipients of the Work or Derivative Works a copy of this License; and
You must cause any modified files to carry prominent notices stating that You changed the files; and
You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear.The contents of the NOTICE file are for informational purposes only and do not modify the License.You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
Submission of Contributions.Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
Trademarks.This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
Disclaimer of Warranty.Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
Limitation of Liability.In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
Accepting Warranty or Additional Liability.While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License.However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information.(Don't include the brackets!)The text should be enclosed in the appropriate comment syntax for the file format.We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.
This product includes software developed by The Apache Software Foundation (http://www.apache.org/) (listed below):Licensed under the Apache License, Version 2.0 (the "License"); you may not use Apache Avro except in compliance with the License.You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.
Copyright 2001-2011 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License"); you may not use the Apache Commons Mathematics library except in compliance with the License.You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.