現在、ほとんどの会社に共通のデータ・アーキテクチャは、一般的に次のコンポーネントで構成されています。
業務系データ、トランザクション・データおよびマスター・データ(顧客、製品、従業員などの共有ビジネス・オブジェクト)を対象とした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 Table Access for Hadoop and Spark (OTA4H)を使用した直接アクセス。
この章では、Oracle Table Access for Hadoop and Spark (OTA4H)について説明します。
Oracle Table Access for Hadoop and Spark (OTA4H)は、HCatalogおよびInputFormatを使用するOracle Database用のストレージ・ハンドラです。
この項では、次の概念について説明します。
Hadoop 2.xアーキテクチャにより、クラスタ・リソース管理およびストレージから計算エンジンが分離されます。これにより、次のものを使用できます。
様々なSQL問合せエンジン。たとえば、Hive SQL、Spark SQL、Big Data SQL。
様々なプログラム的な計算エンジン。たとえば、MapReduce、Pig、Storm、Solr、Cascading。
YARNによる計算リソース(CPU、メモリー)の拡張可能な割当て。
HCatalog、InputFormat、OutputFormatおよびStorageHandlerインタフェースを介したリモート・ストレージのみでなく、HDFS、NoSQLなどの様々なデータ・ストア。
OTA4Hは、HCatalogおよびInputFormatを使用するOracle Database用のストレージ・ハンドラです。
次の図に、Hadoop 2.0アーキテクチャを示します。
図6-1 Hadoop 2.0アーキテクチャ
OTA4Hにより、現在およびアドホックの問合せが有効化されます。これにより、データの問合せが高速化され安全性が向上します。データを直接問い合せて、必要に応じて必要なデータのみを取得できます。
OTA4Hでは、Oracleのエンドツーエンドのセキュリティも提供されます。これには、アイデンティティ管理、列のマスキングおよびラベルと行のセキュリティも含まれます。
また、OTA4Hにより、PigやMapReduceなど、HadoopおよびSparkのAPIへの直接アクセスも可能になります。
外部表により、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.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 |
あらゆる種類のスプリッタについての分割の最大数 |
注意:
前述に加えて、任意のJDBC接続プロパティ(oracle.jdbc.*
およびoracle.net.*
)をTBLPROPERTIES
として指定できます。これらは、JDBCドライバを使用してOracle Databaseへの接続を確立する場合に使用されます。
注意:
Oracle Table Access for Hadoop (OTA4H)はOracleビューおよびOracle表と連動します。
プロパティ | 使用 |
---|---|
oracle.hcat.osh.columns.mapping |
OracleStorageHandlerを使用するすべての外部表では、これを定義する必要があります。これは、Hive列(表の作成で指定)とOracle表の列との間のマッピングを指定するカンマ区切りリストです。また、 |
OTA4Hは、jarの次のリストで構成されています。すべてのjarは、BDAの/opt/oracle/ota4h/jlib
にあります。
表6-1 OTA4H内のjarのリスト
jarの名前 | 使用 |
---|---|
osh.jar | OracleStorageHandler実装が含まれています |
ojdbc7.jar | SparkタスクやHadoopタスクによってデータベースへの接続に使用される、OTA4H固有のJDBCドライバ(内部コールで最適化されます)。 |
ucp.jar | OracleStorageHandler内の接続プールの作成用 |
oraclepki103.jar、osdt_core.jar、osdt_cert.jar、osdt_jce.jar | Oracle Wallet認証用 |
orai18n.jar | Oracleグローバリゼーション・サポート |
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' );
注意:
HIVE_AUX_JARS_PATH
環境変数(hive-env.sh
、hive.aux.jars.path
構成プロパティまたはHive起動時の--auxpath
オプションにあります)によって制御されるHive auxpathに、ucp.jar
、ojdbc7.jar
およびosh.jar
を含めます。BDAでは、Cloudera Managerインタフェースを使用してこれらを構成できます。また、Hiveコマンドラインでadd jar
を使用して、これらのjarをHadoopタスクのクラスパスに追加する必要もあります。様々なHiveコマンドライン・オプションおよび構成プロパティは、次のソースを参照してください。
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
Oracle Table Access for Hadoop and Spark (OTA4H)を使用するために、新しい表を作成する必要はありません。OTA4Hの使用を開始するには、次の手順を実行します。
Oracle表を参照する外部表を作成するためのHive DDLを作成します。
HiveSQL、SparkSQLまたはその他のSpark/Hadoop問合せおよびAPIコールを発行します。
次の項では、新しいOracle Database表およびHive DDLの作成方法について説明します。
次に、パーティション化された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表との結合など)から、問合せを発行します。
この例では、2つの異なる分割パターンを使用して、2つのHive外部表を同じOracle表に関連付けます。
SIMPLE_SPLITTER
PARTITION_SPLITTER
注意:
外部表の列は、ベースとなるOracle表の列より少なくすることができます。列には異なる名前を付けることができるため、ベース表でのマッピングにTBLPROPERTY
を使用します。
後続の例では、次の変数を使用します。
connection_string = jdbc:oracle:thin:@localhost:1521/<servicename>
oracle_user=ota4h
oracle_pwd=ota4h
次のコマンドにより、デフォルトの分割パターン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:ota4h}', 'mapreduce.jdbc.password' = '${hiveconf:ota4h}', '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:ota4h}', 'mapreduce.jdbc.password' = '${hiveconf:ota4h}', 'mapreduce.jdbc.input.table.name' = 'EmployeeData', 'oracle.hcat.osh.splitterKind' = 'PARTITIONED_TABLE' );
関連項目:
デモ・コード・サンプルは、Big Data Applianceに関するページを参照次のトピックでは、OTA4Hの機能について説明します。
次の項では、OTA4Hのパフォーマンスおよびスケーラビリティ機能について説明します。
HCatalogには、Hive DDL、HiveSQL、Spark SQLなどからの表のメタデータが格納され、その後、このメタデータは、問合せの発行中に使用されます。
Oracle表は、splitterKind
プロパティで決定されるグラニュルに分割されます。次に、これらのグラニュルは、生成された問合せを発行することにより、OracleStorageHandler
によって分割に読み込まれます。
スキャンが必要な分割を問合せ計画で決定する場合、OracleStorageHandler
により、すべての使用可能な問合せタイプをテストする必要はありません。
図6-2 OTA4Hの要約
Hive外部表でOTA4Hを使用して問合せを実行する場合、基礎となる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
権限が必要です。この権限が存在しない場合、OTA4HではSINGLE_SPLITTER
を使用します。注意:
BLOCK_SPLITTER
での実際の分割数は、oracle.hcat.osh.maxSplits
プロパティで指定されている値より小さくなる場合があります。 パーティション化された表または索引構成表には、BLOCK_SPLITTERを使用しないでください。
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' );
SINGLE_SPLITTERは、Hive外部表の表プロパティにスプリッタが指定されておらず、かつターゲットOracle表がパーティション化されていない場合に、デフォルトで使用されます。
パーティション化されていない表の場合、oracle.hcat.osh.maxSplits
のデフォルト値は1になります。パーティション化されている表の場合、同じもののデフォルト値は64であり、デフォルトのスプリッタはPARTITION_SPLITTER
になります。Oracleサーバーへの接続数を制限するために、maxSplits
のデフォルトが設定されます。この制限を大きくするには、Hive表プロパティでoracle.hcat.osh.maxSplits
の値を明示的に増やす必要があります。
Hive外部表にスプリッタの種類を選択する場合は、次のガイドラインを使用します。
スプリッタの種類 | 使用 |
---|---|
|
並列度が不要な場合。 |
|
ターゲット表がパーティション化されている場合に、デフォルトで使用されます |
|
Oracleユーザーに |
|
Oracleユーザーに |
述語のプッシュダウンは最適化の手法であり、問合せのときにOracle Databaseによって評価されるよう、述語(WHERE
条件)をプッシュダウンします。これにより、問合せの実行時に、Oracle DatabaseからHiveにフェッチされるデータ量が最小化されます。
述語のプッシュダウンを有効化するには、構成プロパティhive.optimize.ppd
をtrue
またはfalse
のいずれかに設定します。hive-1.1.0のデフォルト値は、true
に設定されています。このため、述語のプッシュダウンは、無効化しないかぎり常に実行されます。
注意:
OTA4Hでは、使用可能なすべての述語をプッシュダウンするわけではありません。実行計画のうち、外部表として宣言されたOracle表に関連する部分のみが考慮されます。また、OTA4Hでは、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'。
これにより、指定された条件に基づいて実行されるすべての問合せについて、Oracle Databaseからフェッチされる行が制限されます。作成される外部表は、Oracle Databaseでのビューに類似しています。このアプローチは、分析できないためにOTA4Hによって自動的にプッシュダウンできない複合述語をプッシュダウンする場合にのみ、役立ちます。
表レベルの述語のプッシュダウン
表レベルの述語のプッシュダウンを有効化するには、TBLPROPERTY mapreduce.jdbc.input.conditions
を使用して、表を作成するときに条件を指定する必要があります。
次に例を示します。
mapreduce.jdbc.input.conditions = 'key > 10 OR key = 0'。
これにより、指定された条件に基づいて実行されるすべての問合せについて、Oracle Databaseからフェッチされる行が制限されます。作成される表は、Oracleデータベースのビューと類似したものになります。
ただし、表レベルの述語のプッシュダウンは、述語(WHERE
句)が問合せで指定されている場合、無視されます。
予測のプッシュダウンは、問合せの実行時に、Oracle Databaseから必要な列のみをフェッチする最適化の手法です。問合せ時にすべての列をフェッチする必要がある場合は(非推奨)、hive.io.file.read.all.columns
接続プロパティをtrue
に設定して無効化できます。Hive-1.1.0では、このプロパティはデフォルトでfalse
に設定されています。
従業員データ・パーティション表を参照すると、問合せに関係のないパーティションは、パーティション・リストから削除されます。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;
接続キャッシュ
各マップ・タスクは、独自のJVMで実行されます。これに対応して、各JVMでは、同じ問合せ内で再利用可能なOracle Databaseへの単一の接続をキャッシュします。マッパーでは新しい接続を確立する前にキャッシュをチェックし、問合せの実行が完了すると、キャッシュは実行されません。
Oracle RAC認識
JDBCおよびUCPでは、様々なOracle RACインスタンスが認識されます。このことは、JDBCに送信される問合せを分割するために使用できます。StorageHandlerは、ロード・バランシングについてリスナーに依存します。
レプリケーション
レプリケートされたデータベース内の複数インスタンスにわたって問合せを分散し、並列化を実現できます。
ログオン・ストームの処理
Hadoopを使用すると、データベースに接続を試行するマッパーの数を制限できます。Hadoopにより、データベースへの接続を試行するマッパーの数を制限するには、oracle.hcat.osh.maxSplits
を使用します。このパラメータは、並行性の程度を制御します。ただし、同じ問合せの後続タスクでは、問合せのシステム・コミット番号(SCN)当たりの表のグラニュルを問い合せることが保証されます。これにより、結果セットの一貫性が保証されます。
データベース常駐接続プーリング(DRCP)
OTA4HにDRCPを構成し、専用にする接続の最大数を制限することをお薦めします。
DRCPを構成するには、次の手順を実行します。
SYSDBA
としてログインします。
デフォルト設定でDBMS_CONNECTION_POOL.START_POOL
を使用し、デフォルト・プールSYS_DEFAULT_CONNECTION_POOL
を開始します。
デフォルト設定でDBMS_CONNECTION_POOL.MINSIZE
およびDBMS_CONNECTION_POOL.MAXSIZE
を使用できます。
注意:
DRCPの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。OTA4Hのセキュリティ機能は、次のとおりです。
OTA4Hでは、Oracle Databaseへの接続にOracle JDBCドライバを使用します。これにより、Oracle JDBCでサポートされているすべての認証方式が提供されます。OTA4Hでは、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
が指定されていない場合、OTA4Hでは、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
に格納されているか、またはHiveQL SELECT
文で指定されます。
Basic認証を使用する場合、Oracleスキーマのユーザー名とパスワードは、Hive外部表プロパティで指定されます。
注意
これは、パスワードがHCatalog内にクリア・テキストで格納されるため、本番環境ではお薦めしません。
HiveQLは、Hiveで提供されるSQLに類似した言語です。これは、OTA4Hを使用して作成されたHive外部表を問い合せるために使用できます。
リソース・マネージャのWebインタフェースをブラウザ(http://bigdatalite.localdomain:8088/cluster
)で実行して、BDAで実行中の問合せのステータスを追跡できます。
問合せのログは、Cloudera Managerで確認することもでき、この場合、HiveQLでの問合せに対応してOracle Databaseに送信された実際の問合せも示されます。HiveおよびOTA4Hでは、ロギング用のslf4jフレームワークが使用されます。Hiveのロギング構成の手法を使用して、OTA4H関連クラスのロギング・レベルを制御できます。
Sparkは、高速化するために設計された汎用のクラスタ・プログラミング・プラットフォームです。Sparkを使用すると、ユーザーはメモリーからデータをロードしたり、問合せを実行できます。Sparkでは、同じエンジンで、対話型問合せやバッチ・アプリケーションなど、様々なワークロードを処理できます。
Spark SQLを使用すると、Sparkを使用して、SQLおよびHiveSQLで表されたリレーショナル問合せを実行できるようになります。Spark SQLを使用すると、Java、PythonおよびScalaの単一のアプリケーションで、SQL問合せと、Resilient Distributed Datasets (RDD)によってサポートされているプログラム的なデータ操作を組み合せることができます。
Spark SQLを使用すると、SQLまたはHiveQLを使用してリレーショナル問合せを実行できます。これは、OTA4Hを使用して作成された外部表を問い合せるためにも使用できます。
問合せを実行する前に、BigDataLite-4.2 VM上でSpark-SQLを構成するには、次の手順を実行します。
/usr/lib/spark/bin/compute-classpath.sh
内のCLASSPATHに、ojdbc7.jar
およびosh.jar
を追加します
CLASSPATH="$CLASSPATH:/opt/oracle/ota4h/lib/osh.jar" CLASSPATH="$CLASSPATH:/opt/oracle/ota4h/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