6 Oracle DataSource for Apache Hadoop (OD4H)
6.1 業務系データ、ビッグ・データおよび要件
現在、ほとんどの会社に共通のデータ・アーキテクチャは、一般的に次のコンポーネントで構成されています。
-
業務系データ、トランザクション・データおよびマスター・データ(顧客、製品、従業員などの共有ビジネス・オブジェクト)を対象としたOracle Database
-
ビッグ・データ
Master Data Management (MDM)やイベント処理などのHadoopアプリケーションには、Hadoopストレージ(Webログなどのランディング・ポイントとして、HDFSやNoSQL Databaseなど)に含まれるデータと、Oracle Database (信頼できる監査可能な真のソースとして)に含まれるデータの両方に対するアクセス権が必要です。HadoopストレージとOracle Databaseの両方に存在するこのようなデータを処理するには、次の2つのアプローチがあります。
-
OracleのCopy to BDAなどのツールを使用したETLコピー
-
Oracle Big Data SQLおよびOracle DataSource for Apache Hadoop (OD4H)を使用した直接アクセス。
この章では、Oracle DataSource for Apache Hadoop (OD4H)について説明します。
6.2 Oracle DataSource for Apache Hadoop (OD4H)の概要
Oracle DataSource for Apache Hadoop (OD4H)は、HCatalogおよびInputFormatを使用するOracle Database用のストレージ・ハンドラです。
この項では、次の概念について説明します。
6.2.1 Hadoop 2.xを活用できる状況
Hadoop 2.xアーキテクチャにより、クラスタ・リソース管理およびストレージから計算エンジンが分離されます。これにより、次のものを使用できます。
-
様々なSQL問合せエンジン。たとえば、Hive SQL、Spark SQL、Big Data SQL。
-
様々なプログラム的な計算エンジン。たとえば、MapReduce、Pig、Storm、Solr、Cascading。
-
YARNによる計算リソース(CPU、メモリー)の拡張可能な割当て。
-
HCatalog、InputFormat、OutputFormatおよびStorageHandlerインタフェースを介したリモート・ストレージのみでなく、HDFS、NoSQLなどの様々なデータ・ストア。
Oracle DataSource for Apache Hadoop (OD4H)は、HCatalogおよびInputFormatを使用するOracle Database用のストレージ・ハンドラです。
次の図に、Hadoop 2.0アーキテクチャを示します。
6.2.2 Hadoopデータ・ソースとしてのOracle表
OD4Hにより、現在およびアドホックの問合せが有効化されます。これにより、データの問合せが高速化され安全性が向上します。データを直接問い合せて、必要に応じて必要なデータのみを取得できます。
OD4Hでは、Oracleのエンドツーエンドのセキュリティも提供されます。これには、アイデンティティ管理、列のマスキングおよびラベルと行のセキュリティも含まれます。
また、OD4Hにより、PigやMapReduceなど、HadoopおよびSparkのAPIへの直接アクセスも可能になります。
6.2.3 外部表
外部表により、Oracle表はHadoopやSparkのデータ・ソースに変換されます。外部表を宣言するためのDDLは、次のとおりです。
CREATE[TEMPORARY] EXTERNAL TABLE [IF NOT EXISTS] [db_name.]table_name
[(col_name data_type [COMMENTcol_comment],...)]
[COMMENT table_comment]
STORED BY 'oracle.hcat.osh.OracleStorageHandler' [WITHSERDEPROPERTIES(...)]
[TBLPROPERTIES (property_name=property_value,...)]
data_type
|SMALLINT
|INT
|BIGINT
|BOOLEAN
|FLOAT
|DOUBLE
|STRING
|BINARY
|TIMESTAMP
|DECIMAL
|DECIMAL(precision,scale)
|VARCHAR
|CHAR
関連項目:
Hive外部表の構文は、リンクhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTableを参照してくださいノート:
Oracleでは、プリミティブ型のみがサポートされます。
Oracleデータ型 | Hiveデータ型 |
|
スケールが0、精度が10未満の場合はINT。 スケールが0、精度が19未満の場合はBIGINT。 スケールが0より大きく、精度が19より大きい場合はDECIMAL。 |
|
STRING |
|
DOUBLE |
|
FLOAT |
|
BINARY |
|
CHAR |
|
VARCHAR |
|
BINARY |
DATE |
TIMESTAMP |
TIMESTAMP |
TIMESTAMP |
|
非サポート |
RAW |
BINARY |
次に、外部表のプロパティについて説明します。
6.2.3.1 TBLPROPERTIES
プロパティ | 使用 |
---|---|
oracle.hcat.osh.columns.mapping |
Hive列とOracle表の列との間のマッピングを指定するカンマ区切りリスト。OracleStorageHandlerを使用するすべての外部表では、これを定義する必要があります。 |
mapreduce.jdbc.url |
データベースに接続するための接続URL |
mapreduce.jdbc.username |
データベースに接続するための接続ユーザー名 |
mapreduce.jdbc.password |
データベースに接続するための接続パスワード |
mapreduce.jdbc.input.table.name |
Oracle表名 |
mapreduce.jdbc.input conditions |
データベースの問合せに使用されます。問合せプッシュダウンに使用する必要があります。 |
mapreduce.jdbc.input.query |
データベースの問合せに使用されます。問合せは、列のサブセットが選択されている場合にのみ使用する必要があります。 |
mapreduce.jdbc.input.orderby |
データベースに順序をプッシュするために使用される |
oracle.hcat.osh.splitterKind |
分割がOracle Database内のターゲット表の物理的構造と一致するよう、OracleStorageHandlerで分割をどのように作成する必要があるかを指定するために使用されます。適用可能なスプリッタの種類には、 |
oracle.hcat.osh.rowsPerSplit |
|
oracle.hcat.osh.authentication |
Oracle Databaseへの接続に使用される認証方式。 |
sun.security.krb5.principal |
Kerberosプリンシパル。 |
oracle.hcat.osh.kerb.callback |
Kerberos認証のコールバック。Kerberos認証が適用されている場合にのみ使用されます。 |
oracle.hcat.osh.maxSplits |
あらゆる種類のスプリッタについての分割の最大数 |
oracle.hcat.osh.useChunkSplitter |
DBMS_PARALLEL_EXECUTEパッケージを使用する、チャンク・ベースのROW_SPLITTERおよびBLOCK_SPLITTERを使用して、表をチャンクに分割してhadoopの分割にマップします。デフォルト値はtrueに設定されます。 |
oracle.hcat.osh.chunkSQL |
分割を作成するために、CUSTOM_SPLITTER によって使用されます。SQL文字列は、各チャンクの範囲を2列(start_id とend_id )で返すSELECT文にしてください。列はROWID 型にする必要があります。
|
oracle.hcat.osh.useOracleParallelism |
構成すると、Oracleから行をフェッチする間、並列問合せが実行されます。デフォルト値: false
|
oracle.hcat.osh.fetchSize |
行をフェッチするために使用される、生成済のselect問合せのJDBCのフェッチ・サイズ。デフォルト値: 10 (Oracle JDBCドライバによって設定) |
ノート:
前述に加えて、任意のJDBC接続プロパティ(oracle.jdbc.*
およびoracle.net.*
)をTBLPROPERTIES
として指定できます。これらは、JDBCドライバを使用してOracle Databaseへの接続を確立する場合に使用されます。
ノート:
Oracle DataSource for Apache Hadoop (OD4H)は、OracleビューおよびOracle表と連携します。
6.2.3.2 SERDE PROPERTIES
プロパティ | 使用 |
---|---|
oracle.hcat.osh.columns.mapping |
OracleStorageHandlerを使用するすべての外部表では、これを定義する必要があります。これは、Hive列(表の作成で指定)とOracle表の列との間のマッピングを指定するカンマ区切りリストです。また、 |
6.2.4 OD4Hパッケージ内のjarのリスト
Oracle DataSource for Apache Hadoop (OD4H)に含まれるjarのリストは次のとおりです。
OD4Hは、次のリストのjarで構成されています。
表6-1 OD4H内のjarのリスト
jarの名前 | 使用 |
---|---|
osh.jar | OracleStorageHandler実装が含まれています |
ojdbc7.jar | SparkタスクやHadoopタスクによってデータベースへの接続に使用される、OD4H固有のJDBCドライバ(内部コールで最適化されます)。 |
ucp.jar | OracleStorageHandler内の接続プールの作成用 |
oraclepki103.jar、osdt_core.jar、osdt_cert.jar、osdt_jce.jar | Oracle Wallet認証用 |
orai18n.jar | Oracleグローバリゼーション・サポート |
xdb.jar | Oracle XDB jar |
6.3 OD4Hの動作方法
Oracle DataSource for Apache Hadoop (OD4H)では、新しい表を作成する必要はありません。OD4Hの使用を開始するには、次のステップを実行します。
-
新しいOracle表を作成するか、既存の表を再利用します。
-
Oracle表を参照する外部表を作成するためのHive DDLを作成します。
-
HiveSQL、SparkSQLまたはその他のSpark/Hadoop問合せおよびAPIコールを発行します。
次の項では、新しいOracle Database表およびHive DDLの作成方法について説明します。
6.3.1 Oracle Database表の作成または既存の表の再利用
次に、パーティション化されたOracle表の例を示します。これは、この後でパーティション・プルーニングの動作を示すデモに使用します。
CREATE TABLE EmployeeData ( Emp_ID NUMBER, First_Name VARCHAR2(20), Last_Name VARCHAR2(20), Job_Title VARCHAR2(40), Salary NUMBER) PARTITION BY RANGE (Salary) ( PARTITION salary_1 VALUES LESS THAN (60000) TABLESPACE tsa , PARTITION salary_2 VALUES LESS THAN (70000) TABLESPACE tsb , PARTITION salary_3 VALUES LESS THAN (80000) TABLESPACE tsc , PARTITION salary_4 VALUES LESS THAN (90000) TABLESPACE tsd , PARTITION salary_5 VALUES LESS THAN (100000) TABLESPACE tse );
ノート:
このマニュアルの後続の例で示すように、この構文は表の作成に使用できます。
-
Hive、Sparkまたはその他のHadoopモデル(ローカルHive表との結合など)から、問合せを発行します。
6.3.2 Hive DDL
この例では、2つの異なる分割パターンを使用して、2つのHive外部表を同じOracle表に関連付けます。
-
SIMPLE_SPLITTER
-
PARTITION_SPLITTER
ノート:
外部表の列は、ベースとなるOracle表の列より少なくすることができます。列には異なる名前を付けることができるため、ベース表でのマッピングにTBLPROPERTY
を使用します。
後続の例では、次の変数を使用します。
connection_string = jdbc:oracle:thin:@localhost:1521/<servicename>
oracle_user=od4h
oracle_pwd=od4h
次のコマンドにより、デフォルトの分割パターンSIMPLE_SPLITTER
を使用して、Hive外部表が作成されます。
CREATE EXTERNAL TABLE EmployeeDataSimple ( Emp_ID int, First_Name string, Last_Name string, Job_Title string, Salary int ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'Emp_ID,First_Name,Last_Name,Job_Title,Salary') TBLPROPERTIES ( 'mapreduce.jdbc.url' = '${hiveconf:jdbc:oracle:thin:@localhost:1521/<servicename>}', 'mapreduce.jdbc.username' = '${hiveconf:od4h}', 'mapreduce.jdbc.password' = '${hiveconf:od4h}', 'mapreduce.jdbc.input.table.name' = 'EmployeeData' );
次の例では、PARTITION_SPLITTER
を使用して、Hive外部表が作成されます。
DROP TABLE EmployeeDataPartitioned; CREATE EXTERNAL TABLE EmployeeDataPartitioned ( Emp_ID int, First_Name string, Last_Name string, Job_Title string, Salary int ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'Emp_ID,First_Name,Last_Name,Job_Title,Salary') TBLPROPERTIES ( 'mapreduce.jdbc.url' = '${hiveconf:jdbc:oracle:thin:@localhost:1521/<servicename>}', 'mapreduce.jdbc.username' = '${hiveconf:od4h}', 'mapreduce.jdbc.password' = '${hiveconf:od4h}', 'mapreduce.jdbc.input.table.name' = 'EmployeeData', 'oracle.hcat.osh.splitterKind' = 'PARTITIONED_TABLE' );
6.3.3 Hiveでの外部表の作成
Hiveでの外部表の作成は、次の方法で実行できます。
DROP TABLE employees; CREATE EXTERNAL TABLE employees ( EMPLOYEE_ID INT, FIRST_NAME STRING, LAST_NAME STRING, SALARY DOUBLE, HIRE_DATE TIMESTAMP, JOB_ID STRING ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'employee_id,first_name,last_name,salary,hire_date,job_id') TBLPROPERTIES ( 'mapreduce.jdbc.url' = 'jdbc:oracle:thin:@localhost:1521:orcl', 'mapreduce.jdbc.username' = 'hr', 'mapreduce.jdbc.password' = 'hr', 'mapreduce.jdbc.input.table.name' = 'EMPLOYEES' );
ノート:
OD4Hを使用するために、ucp.jar
、ojdbc8.jar
およびosh.jar
がHive CLASSPATH
に存在することを確認してください。これはBDAで事前に構成されます。
CLASSPATH
および他のHive構成プロパティについてさらに学習するには、次の情報を参照してください。
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
6.4 OD4Hの機能
次のトピックでは、OD4Hの機能について説明します。
6.4.1 パフォーマンスおよびスケーラビリティ機能
次の項では、OD4Hのパフォーマンスおよびスケーラビリティ機能について説明します。
HCatalogには、Hive DDLから表のメタデータが格納されます。HiveSQL、Spark SQLなど、その後、このメタデータは、問合せの発行中に使用されます。
Oracle表は、splitterKind
プロパティで決定されるグラニュルに分割されます。次に、これらのグラニュルは、生成された問合せを発行することにより、OracleStorageHandler
によって分割に読み込まれます。
スキャンが必要な分割を問合せ計画で決定する場合、OracleStorageHandler
により、すべての使用可能な問合せタイプをテストする必要はありません。
6.4.1.1 スプリッタ
Hive外部表でOTD4Hを使用して問合せを実行する場合、基礎となるOracle表は、Hadoop側での分割に対応するグラニュルに動的に分割されます。各分割は、単一のマップ・タスクによって処理されます。ORACLE_SPLITTER_KIND
プロパティを使用すると、分割の作成方法を指定できます。これにより、分割をOracle Database内のターゲット表の物理的構造と一致させることができます。
使用できる他の種類のスプリッタは、次のとおりです。
SINGLE_SPLITTER
表につき1つの分割を作成します。SINGLE_SPLITTER
を使用すると、表全体に対する問合せを単一タスクで処理できます。
ROW_SPLITTER
分割当たりの行数を制限します。デフォルトの行数は1000です。行数を指定するには、oracle.hcat.osh.rowsPerSplit
プロパティを設定します。ROW_SPLITTER
を使用する場合、oracle.hcat.osh.maxSplits
のデフォルト値は1です。この値を増加して、並列読取りを有効化できます。
rowsPerSplit
プロパティで指定されている値に基づいて、表を分割します。これにより得られる分割数がmaxSplits
を超える場合は、maxSplits
プロパティが使用されます。分割当たりの行は、これに従って分割されます。
ノート:
oracle.hcat.osh.rowsPerSplit
は、ROW_SPLITTER
でのみ使用され、その他の種類のスプリッタでは使用されません。
BLOCK_SPLITTER
BLOCK_SPLITTER
を使用する場合、oracle.hcat.osh.maxSplits
のデフォルト値は1です。この値を増加して、並列読取りを有効化できます。BLOCK_SPLITTER
には、Oracleターゲット表を含むスキーマに付与される、SYS.DBA.EXTENTS
表に対するSELECT
権限が必要です。この権限が存在しない場合、OD4HではSINGLE_SPLITTER
を使用します。ノート:
BLOCK_SPLITTER
での実際の分割数は、oracle.hcat.osh.maxSplits
プロパティで指定されている値より小さくなる場合があります。
パーティション化された表または索引構成表には、BLOCK_SPLITTERを使用しないでください。
ノート:
ROW_SPLITTERおよびBLOCK_SPLITTER型の場合は、oracle.hcat.osh.useChunkSplitter
を使用して分割メカニズムを指定します。デフォルトのプロパティ値はtrue
です。これにより、DBMS_PARALLEL_EXECUTE
パッケージを使用して分割に対応するチャンクを作成できます。プロパティ値がfalse
の場合は、分割のためカスタムSQLが生成されます。
PARTITION_SPLITTER
パーティション当たり1つの分割を作成します。PARTITION_SPLITTER
は、表がパーティション化されている場合にデフォルトで使用されます。この設定を上書きするには、表プロパティでROW_SPLITTER
を指定します。PARTITION_SPLITTER
を使用する場合、oracle.hcat.osh.maxSplits
表プロパティのデフォルト値は64です。
次に、ROW_SPLITTER
の例を示します。
DROP TABLE employees;
CREATE EXTERNAL TABLE employees (
EMPLOYEE_ID INT,
FIRST_NAME STRING,
LAST_NAME STRING,
SALARY DOUBLE,
HIRE_DATE TIMESTAMP,
JOB_ID STRING
)
STORED BY 'oracle.hcat.osh.OracleStorageHandler'
WITH SERDEPROPERTIES (
'oracle.hcat.osh.columns.mapping' = 'employee_id,first_name,last_name,salary,hire_date,job_id')
TBLPROPERTIES (
'mapreduce.jdbc.url' = 'jdbc:oracle:thin:@localhost:1521:orcl',
'mapreduce.jdbc.username' = 'hr',
'mapreduce.jdbc.password' = 'hr',
'mapreduce.jdbc.input.table.name' = 'EMPLOYEES',
'oracle.hcat.osh.splitterKind' = 'ROW_SPLITTER',
'oracle.hcat.osh.rowsPerSplit' = '1500'
);
CUSTOM_SPLITTER
カスタム分割生成メカニズムを提供する場合は、CUSTOM_SPLITTER
を使用します。これを行うには、CUSTOM_SPLITTER
で、oracle.hcat.osh.splitterKind
プロパティと、oracle.hcat.osh.chunkSQL
の各分割の始めと終わりに対応したROWIDを出力するSELECT
文を使用します。
6.4.1.2 スプリッタの選択
SINGLE_SPLITTER
は、Hive外部表の表プロパティにスプリッタが指定されておらず、かつターゲットOracle表がパーティション化されていない場合に、デフォルトで使用されます。
パーティション化されていない表の場合、oracle.hcat.osh.maxSplits
のデフォルト値は1になります。パーティション化されている表の場合、同じもののデフォルト値は64であり、デフォルトのスプリッタはPARTITION_SPLITTER
になります。Oracleサーバーへの接続数を制限するために、maxSplits
のデフォルトが設定されます。この制限を大きくするには、Hive表プロパティでoracle.hcat.osh.maxSplits
の値を明示的に増やす必要があります。
Hive外部表にスプリッタの種類を選択する場合は、次のガイドラインを使用します。
スプリッタの種類 | 使用 |
---|---|
|
並列度が不要な場合。 |
|
ターゲット表がパーティション化されている場合に、デフォルトで使用されます |
|
Oracleユーザーに |
|
Oracleユーザーに |
|
生成された分割を詳細に制御する場合。 |
6.4.1.3 述語のプッシュダウン
述語のプッシュダウンは最適化の手法であり、問合せのときにOracle Databaseによって評価されるよう、述語(WHERE
条件)をプッシュダウンします。これにより、問合せの実行時に、Oracle DatabaseからHiveにフェッチされるデータ量が最小化されます。
述語のプッシュダウンを有効化するには、構成プロパティhive.optimize.ppd
をtrue
またはfalse
のいずれかに設定します。hive-1.1.0のデフォルト値は、true
に設定されています。このため、述語のプッシュダウンは、無効化しないかぎり常に実行されます。
ノート:
OD4Hでは、使用可能なすべての述語をプッシュダウンするわけではありません。実行計画のうち、外部表として宣言されたOracle表に関連する部分のみが考慮されます。また、OD4Hでは、Oracle SQLエンジンおよび各分割タスクについての副問合せがリライトされます。1つの列に対する単一条件内に演算子>、=、<および!=を含む現在の条件(たとえば、key > 10)、またはANDで区切られた複数条件の組合せ(たとえば、key > 10 AND key < 20 AND key !=17)がプッシュダウンされます。
Oracle Databaseからフェッチされるデータの量を削減するための別のオプションとして、表を作成するとき、TBLPROPERTY
mapreduce.jdbc.input.conditions
を使用して条件を指定できます。次に例を示します。
mapreduce.jdbc.input.conditions = 'key > 10 OR key = 0'。
ノート:
HiveおよびOracle間の日付とタイムスタンプ表現の非互換性により、これらの列はデフォルトでは問合せでプッシュ・ダウンされません。これは特定の制限を使用することで有効にできます。表のプロパティoracle.hcat.datetime.pushdown
をtrue
に設定します。true
に設定する場合、問合せの日付表現の形式はYYYY-MM-DD
にする必要があり、タイムスタンプは小数点以下のない"YYYY-MM-DD HH:MM:SS
"形式にする必要があります。oracle.hcat.datetime.pushdown
をtrue
に設定する場合にサポートされる、その他の日付表現やタイムスタンプ表現はありません。
6.4.1.4 予測のプッシュダウン
予測のプッシュダウンは、問合せの実行時に、Oracle Databaseから必要な列のみをフェッチする最適化の手法です。問合せ時にすべての列をフェッチする必要がある場合は(非推奨)、hive.io.file.read.all.columns
接続プロパティをtrue
に設定して無効化できます。Hive-1.1.0では、このプロパティはデフォルトでfalse
に設定されています。
6.4.1.5 パーティション・プルーニング
従業員データ・パーティション表を参照すると、問合せに関係のないパーティションは、パーティション・リストから削除されます。EXPLAIN PLANを問合せに対して実行し、問合せに関連するパーティションとサブパーティションのリストを取得することによって、このことが行われます。
表レベルのパーティション・プルーニングでは、表レベルの述語のプッシュダウンを使用する一方で、問合せレベルでのパーティション・プルーニングでは、問合せレベルの述語のプッシュダウンを使用します。
パーティション・プルーニングは、WHERE
句でパーティション化キーを使用するSELECT
問合せが実行されるとアクティブになります。次に、パーティション・プルーニングの例を示します。
給与が前述の範囲内であるパーティションを問い合せて、その他のパーティションをプルーニングするには、次の手順を実行します。
Hive外部表:
CREATE EXTERNAL TABLE EmployeeDataPartitioned ( Emp_ID int, First_Name string, Last_Name string, Job_Title string, Salary int ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'Emp_ID,First_Name,Last_Name,Job_Title,Salary') TBLPROPERTIES ( 'mapreduce.jdbc.url' = '${hiveconf:connection_string}', 'mapreduce.jdbc.username' = '${hiveconf:oracle_user}', 'mapreduce.jdbc.password' = '${hiveconf:oracle_pwd}', 'mapreduce.jdbc.input.table.name' = 'EmployeeData', 'oracle.hcat.osh.oosKind' = 'PARTITIONED_TABLE' );
次のSELECT
文では、給与が72000から78000の範囲内のパーティションを問い合せ、その他のパーティションをプルーニングする方法を示しています。
select * from EmployeeDataPartitioned where salary > 72000 and salary < 78000;
6.4.2 スマート接続管理
接続キャッシュ
各マップ・タスクは、独自のJVMで実行されます。これに対応して、各JVMでは、同じ問合せ内で再利用可能なOracle Databaseへの単一の接続をキャッシュします。マッパーでは新しい接続を確立する前にキャッシュをチェックし、問合せの実行が完了すると、キャッシュは実行されません。
Oracle RAC認識
JDBCおよびUCPでは、様々なOracle RACインスタンスが認識されます。このことは、JDBCに送信される問合せを分割するために使用できます。StorageHandlerは、ロード・バランシングについてリスナーに依存します。
ログオン・ストームの処理
Hadoopを使用すると、データベースに接続を試行するマッパーの数を制限できます。Hadoopにより、データベースへの接続を試行するマッパーの数を制限するには、oracle.hcat.osh.maxSplits
を使用します。このパラメータは、並行性の程度を制御します。ただし、同じ問合せの後続タスクでは、問合せのシステム・コミット番号(SCN)当たりの表のグラニュルを問い合せることが保証されます。これにより、結果セットの一貫性が保証されます。
データベース常駐接続プーリング(DRCP)
OD4HにDRCPを構成し、OD4HからOracle Databaseへの同時接続の最大数を制限することをお薦めします。
DRCPを構成するには、次のステップを実行します。
-
SYSDBA
としてログインします。 -
デフォルト設定で
DBMS_CONNECTION_POOL.START_POOL
を使用し、デフォルト・プールSYS_DEFAULT_CONNECTION_POOL
を開始します。デフォルト設定で
DBMS_CONNECTION_POOL.MINSIZE
およびDBMS_CONNECTION_POOL.MAXSIZE
を使用できます。
ノート:
DRCPの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。6.4.3 セキュリティ機能
OD4Hのセキュリティ機能は、次のとおりです。
6.4.3.1 認証の改善
OD4Hでは、Oracle Databaseへの接続にOracle JDBCドライバを使用します。これにより、Oracle JDBCでサポートされているすべての認証方式が提供されます。OD4Hでは、Basic認証(ユーザー名とパスワード)、Oracle WalletおよびKerberosを使用した認証がサポートされています。oracle.hcat.osh.authentication
表プロパティを使用して、Hiveで作成された表に使用する認証を指定できます。このことは、厳密認証の場合にのみ役立ちます。
-
Kerberos
-
Oracle Wallet
-
Basic認証
ノート:
Kerberosなどの厳密認証を使用することをお薦めします。次に、様々な認証プロセスについて例をあげて説明します。
-
Kerberos
Hadoopエンジン・プロセスのKerberos資格証明を使用します。この
プリンシパル
には、表へのアクセス権が必要です。関連項目:
Kerberos用のデータベースの構成およびクライアント・パラメータの詳細は、『Oracle Database JDBC開発者ガイド』を参照してください
Hive上でKerberos構成を有効化するには、
hive-env.sh
に次を追加します。export HADOOP_OPTS="$HADOOP_OPTS -Djava.security.krb5.conf=<path to kerberos configuration>
子JVMを有効化してKerberos構成を使用するには、
mapred-site.xml
を編集して、クラスタのすべてのノードについて次のプロパティを組み込みます。<property><name>mapred.child.java.opts</name> <value>-Djava.security.krb5.conf=<path to kerberos configuration>></value></property>
BDAでは、Cloudera Managerを使用してこれらの構成を有効化します。
次に、Kerberos認証の例を示します。
CREATE EXTERNAL TABLE kerb_example ( id DECIMAL, name STRING, salary DECIMAL ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'id,name,salary') TBLPROPERTIES ( 'mapreduce.jdbc.url' = 'jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=adc*******.xxxxxx.com)(PORT=5521))(CONNECT_DATA= (SERVICE_NAME=project_name.xxx.rdbms.xxxx.com)))', 'mapreduce.jdbc.input.table.name' = 'kerb_example', 'mapreduce.jdbc.username' = 'CLIENT@xxxxxx.COM', 'oracle.hcat.osh.authentication' = 'KERBEROS', 'oracle.net.kerberos5_cc_name' = '/tmp/krb5cc_xxxxx', 'java.security.krb5.conf' = '/home/user/kerberos/krb5.conf', 'oracle.hcat.osh.kerb.callback' = 'KrbCallbackHandler', 'sun.security.krb5.principal' = 'CLIENT@xxxxx.COM' );
oracle.security.krb5.conf
で指定されているパスは、クラスタのすべてのノードからアクセス可能である必要があります。また、これらのパスは、Oracle Databaseのsqlnet.ora
内の対応するプロパティのパスと一致する必要もあります。sqlnet.ora
で指定されているkeytab
パスも、クラスタのすべてのノードからアクセス可能である必要があります。sun.security.krb5.principal
が指定されていない場合、OD4Hでは、oracle.net.kerberos5_cc_name
プロパティで指定されている資格証明キャッシュ内のデフォルト・プリンシパルを使用して、認証が試行されます。ノート:
callback
は、oracle.net.kerberos5_cc_nameproperty
で指定されている資格証明キャッシュから取得されるチケットを使用して、principal
を認証できない場合にのみ、呼び出されます。次に、単純なコールバック・ハンドラ・クラスを示します(コールバック・クラスは、Hiveクラスパスに使用可能である必要があります)。
class KrbCallbackHandler implements CallbackHandler{ @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException{ for (int i = 0; i < callbacks.length; i++){ if (callbacks[i] instanceof PasswordCallback){ PasswordCallback pc = (PasswordCallback)callbacks[i]; System.out.println("set password to 'welcome'"); pc.setPassword((new String("welcome")).toCharArray()); } else if (callbacks[i] instanceof NameCallback) { ((NameCallback)callbacks[i]).setName("client@xxxxx.COM"); }else{ throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); } } }
-
Oracle Wallet
ウォレットは、各エンジン・プロセスのOS環境で使用可能である必要があります。次に、ウォレット認証の追加方法の例を示します。
CREATE EXTERNAL TABLE wallet_example ( id DECIMAL, name STRING, salary DECIMAL ) STORED BY 'oracle.hcat.osh.OracleStorageHandler' WITH SERDEPROPERTIES ( 'oracle.hcat.osh.columns.mapping' = 'id,name,salary') TBLPROPERTIES ( 'mapreduce.jdbc.url' = 'jdbc:oracle:thin:/@inst1', 'mapreduce.jdbc.input.table.name' = 'wallet_example', 'oracle.hcat.osh.authentication' = 'ORACLE_WALLET', 'oracle.net.tns_admin' = '/scratch/user/view_storage/user_project6/work', 'oracle.net.wallet_location' = '/scratch/user/view_storage/user_project6/work' );
ノート:
oracle.net.tns_admin
およびoracle.net.wallet_location
で指定されているパスは、クラスタのすべてのノードからアクセス可能である必要があります。関連項目:
『Oracle Databaseセキュリティ・ガイド』のパスワード資格証明のためのSecure External Password Storeの管理に関する項。
-
Basic認証(デモ専用)
これは、HCatalog
TBLPROPERTIES
に格納されているか、またはHiveQLSELECT
文で指定されます。Basic認証を使用する場合、Oracleスキーマのユーザー名とパスワードは、Hive外部表プロパティで指定されます。
ノート:
これは、パスワードがHCatalog内にクリア・テキストで格納されるため、本番環境ではお薦めしません。
6.5 OD4HでのHiveQLの使用方法
HiveQLは、Hiveで提供されるSQLに類似した言語です。これは、OD4Hを使用して作成されたHive外部表を問い合せるために使用できます。
リソース・マネージャのWebインタフェースをブラウザ(http://bigdatalite.localdomain:8088/cluster
)で実行して、BDAで実行中の問合せのステータスを追跡できます。
問合せのログは、Cloudera Managerで確認することもでき、この場合、HiveQLでの問合せに対応してOracle Databaseに送信された実際の問合せも示されます。HiveおよびOD4Hでは、ロギング用のslf4jフレームワークが使用されます。Hiveのロギング構成の手法を使用して、OD4H関連クラスのロギング・レベルを制御できます。
6.6 OD4HでのSpark SQLの使用方法
Spark SQLを使用すると、Sparkを使用して、SQLおよびHiveSQLで表されたリレーショナル問合せを実行できるようになります。Spark SQLを使用すると、Java、PythonおよびScalaの単一のアプリケーションで、SQL問合せと、Resilient Distributed Datasets (RDD)によってサポートされているプログラム的なデータ操作を組み合せることができます。
Spark SQLを使用すると、SQLまたはHiveQLを使用してリレーショナル問合せを実行できます。これは、OD4Hを使用して作成された外部表を問い合せるためにも使用できます。
問合せを実行する前に、BigDataLite-4.2 VM上でSpark-SQLを構成するには、次のステップを実行します。
-
/usr/lib/spark/bin/compute-classpath.sh
内のCLASSPATHに、ojdbc7.jar
およびosh.jar
を追加しますCLASSPATH="$CLASSPATH:/opt/oracle/od4h/lib/osh.jar" CLASSPATH="$CLASSPATH:/opt/oracle/od4h/lib/ojdbc7.jar"
-
/usr/lib/spark/conf/spark-env.sh
でSPARK_HOME
を編集しますexport SPARK_HOME=/usr/lib/spark:/etc/hive/conf
-
/usr/lib/spark/conf/spark-env.sh
で追加の環境変数を指定する必要があります。追加する必要のあるHive関連変数が、太字で示されています。ファイルには、Hadoop関連環境変数がすでに含まれています。
export DEFAULT_HADOOP=/usr/lib/hadoop export DEFAULT_HIVE=/usr/lib/hive export DEFAULT_HADOOP_CONF=/etc/hadoop/conf export DEFAULT_HIVE_CONF=/etc/hive/conf export HADOOP_HOME=${HADOOP_HOME:-$DEFAULT_HADOOP} export HADOOP_HDFS_HOME=${HADOOP_HDFS_HOME:-${HADOOP_HOME}/../hadoop-hdfs} export HADOOP_MAPRED_HOME=${HADOOP_MAPRED_HOME:-${HADOOP_HOME}/../hadoop-mapreduce} export HADOOP_YARN_HOME=${HADOOP_YARN_HOME:-${HADOOP_HOME}/../hadoop-yarn} export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-$DEFAULT_HADOOP_CONF} export HIVE_CONF_DIR=${HIVE_CONF_DIR:-$DEFAULT_HIVE_CONF} CLASSPATH="$CLASSPATH:$HIVE_CONF_DIR" CLASSPATH="$CLASSPATH:$HADOOP_CONF_DIR" if [ "x" != "x$YARN_CONF_DIR" ]; then CLASSPATH="$CLASSPATH:$YARN_CONF_DIR" fi # Let's make sure that all needed hadoop libs are added properly CLASSPATH="$CLASSPATH:$HADOOP_HOME/client/*" CLASSPATH="$CLASSPATH:$HIVE_HOME/lib/*" CLASSPATH="$CLASSPATH:$($HADOOP_HOME/bin/hadoop classpath)"
構成後、デモの/shell/*QuerySpark.sh
に含まれているスクリプトを使用して、Spark SQLに対していくつかのサンプル問合せを実行できます。デフォルトでは、Sparkにより、問合せがコンソール上に出力されます。この動作を変更するには、Sparkロギング構成ファイル/usr/lib/spark/conf/log4j.properties
を編集できます。
OracleRecordReaderによって出力されるログには、次のようにOracle Databaseに送信される実際の問合せが示されます。
15/03/18 10:36:08 INFO
OracleRecordReader: Reading records from Oracle Table using Query: SELECT
FIRST_NAME
, LAST_NAME
, EMP_ID
FROM
EmployeeData
6.7 Oracle Databaseへの書込み
OD4Hの一般的なユースケースでは、HiveまたはSpark SQLの問合せの結果セットをOracle Databaseに格納します。OD4HではOutputFormatが実装されるため、HadoopからOracle Database表に書き込むことができます。
Oracle Database表にデータが挿入された後、好みのビジネス・インテリジェンス・ツールを使用して、さらにデータ・マイニングを行えます
OD4Hデモ・コード・サンプルからの問合せを次に示します。これは、EmployeeBonusReportという外部表への書込みを示しています。
例6-1 Oracle DatabaseへのHiveまたはSparkの結果セットの書込み
INSERT INTO EmployeeBonusReport
SELECT EmployeeDataSimple.First_Name, EmployeeDataSimple.Last_Name,
EmployeeBonus.bonus
FROM EmployeeDataSimple JOIN EmployeeBonus ON
(EmployeeDataSimple.Emp_ID=EmployeeBonus.Emp_ID)
WHERE salary > 70000 and bonus > 7000"