プライマリ・コンテンツに移動
Oracle® Big Data Connectorsユーザーズ・ガイド
リリース5 (5.0)
F21918-01
目次へ移動
目次
索引へ移動
索引

前
次

9 Oracle DataSource for Apache Hadoop (OD4H)

Oracle DataSource for Apache Hadoop (OD4H)では、Hiveメタストアを介してSpark SQLを使用して、Oracle Databaseのマスター・データに直接、すばやく、パラレルかつ安全に、一貫してアクセスできます。この章では、次の項で、Oracle DataSource for Apache Hadoop (OD4H)について説明します。

9.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)について説明します。

9.2 Oracle DataSource for Apache Hadoop (OD4H)の概要

Oracle DataSource for Apache Hadoop (OD4H)は、HCatalogおよびInputFormatを使用するOracle Database用のストレージ・ハンドラです。

この項では、次の概念について説明します。

9.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アーキテクチャを示します。

図9-1 Hadoop 2.0アーキテクチャ

図9-1の説明が続きます
「図9-1 Hadoop 2.0アーキテクチャ」の説明

9.2.2 Hadoopデータ・ソースとしてのOracle表

OD4Hにより、現在およびアドホックの問合せが有効化されます。これにより、データの問合せが高速化され安全性が向上します。データを直接問い合せて、必要に応じて必要なデータのみを取得できます。

OD4Hでは、Oracleのエンドツーエンドのセキュリティも提供されます。これには、アイデンティティ管理、列のマスキングおよびラベルと行のセキュリティも含まれます。

また、OD4Hにより、PigやMapReduceなど、HadoopおよびSparkのAPIへの直接アクセスも可能になります。

9.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型のマッピングを示します。
Oracleデータ型 Hiveデータ型

NUMBER

スケールが0、精度が10未満の場合はINT。

スケールが0、精度が19未満の場合はBIGINT。

スケールが0より大きく、精度が19より大きい場合はDECIMAL。

CLOB

NCLOB

STRING

BINARY_DOUBLE

DOUBLE

BINARY_FLOAT

FLOAT

BLOB

BINARY

CHAR

NCHAR

CHAR

VARCHAR2

NVARCHAR2

VARCHAR

ROWID

UROWID

BINARY
DATE TIMESTAMP
TIMESTAMP TIMESTAMP

TIMESTAMPTZ

TIMESTAMPLTZ

非サポート
RAW BINARY

次に、外部表のプロパティについて説明します。

9.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

データベースに順序をプッシュするために使用されるORDER BY句。

oracle.hcat.osh.splitterKind

分割がOracle Database内のターゲット表の物理的構造と一致するよう、OracleStorageHandlerで分割をどのように作成する必要があるかを指定するために使用されます。適用可能なスプリッタの種類には、SINGLE_SPLITTERPARTITION_SPLITTERROW_SPLITTERBLOCK_SPLITTERがあります。

oracle.hcat.osh.rowsPerSplit

ROW_SPLITTER splitterKindが表に適用されている場合にのみ、使用されます。LIMIT_RANGEスプリッタの分割ごとの行数を表します。デフォルトは1000です

oracle.hcat.osh.authentication

Oracle Databaseへの接続に使用される認証方式。SIMPLE (デフォルト)、ORACLE_WALLETKERBEROSにすることができます

sun.security.krb5.principal

Kerberosプリンシパル。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_idend_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表と連携します。

9.2.3.2 SERDE PROPERTIES

プロパティ 使用

oracle.hcat.osh.columns.mapping

OracleStorageHandlerを使用するすべての外部表では、これを定義する必要があります。これは、Hive列(表の作成で指定)とOracle表の列との間のマッピングを指定するカンマ区切りリストです。また、WITHSERDEPROPERTIESを使用すると、外部表定義で、実際のOracle表内の選択された列のみを参照することもできます。つまり、Oracle表のすべての列をHive外部表に含める必要はありません。マッピングにおけるOracle列の順序は、表の作成で指定したHive列の順序と同じです。

9.2.4 OD4Hパッケージ内のjarのリスト

Oracle DataSource for Apache Hadoop (OD4H)に含まれるjarのリストは次のとおりです。

OD4Hは、次のリストのjarで構成されています。

表9-1 OD4H内のjarのリスト

jarの名前 使用
osh.jar OracleStorageHandler実装が含まれています
ojdbc8.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

9.3 OD4Hの動作方法

Oracle DataSource for Apache Hadoop (OD4H)では、新しい表を作成する必要はありません。OD4Hの使用を開始するには、次のステップを実行します。

  1. 新しいOracle表を作成するか、既存の表を再利用します。

  2. Oracle表を参照する外部表を作成するためのHive DDLを作成します。

  3. HiveSQL、SparkSQLまたはその他のSpark/Hadoop問合せおよびAPIコールを発行します。

次の項では、新しいOracle Database表およびHive DDLの作成方法について説明します。

9.3.1 Oracle Database表の作成または既存の表の再利用

次に、パーティション化されたOracle表の例を示します。これは、この後でパーティション・プルーニングの動作を示すデモに使用します。

  1. 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
     );

    注意:

    このマニュアルの後続の例で示すように、この構文は表の作成に使用できます。

  2. Hive、Sparkまたはその他のHadoopモデル(ローカルHive表との結合など)から、問合せを発行します。

9.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'
);

9.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.jarojdbc8.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

Clouderaディストリビューションについては、Cloudera Manager用のステップ(https://www.cloudera.com/documentation/enterprise/5-14-x/topics/cm_mc_hive_udf.html)を参照してください。その他のディストリビューションについては、それぞれのドキュメントで、Hive/HiveServer2環境へのjarの追加について参照してください。

9.4 OD4Hの機能

次のトピックでは、OD4Hの機能について説明します。

9.4.1 パフォーマンスおよびスケーラビリティ機能

次の項では、OD4Hのパフォーマンスおよびスケーラビリティ機能について説明します。

HCatalogには、Hive DDLから表のメタデータが格納されます。HiveSQL、Spark SQLなど、その後、このメタデータは、問合せの発行中に使用されます。

Oracle表は、splitterKindプロパティで決定されるグラニュルに分割されます。次に、これらのグラニュルは、生成された問合せを発行することにより、OracleStorageHandlerによって分割に読み込まれます。

スキャンが必要な分割を問合せ計画で決定する場合、OracleStorageHandlerにより、すべての使用可能な問合せタイプをテストする必要はありません。

9.4.1.1 スプリッタ

Hive外部表でOD4Hを使用して問合せを実行する場合、基礎となる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です。この値を増加して、並列読取りを有効化できます。

OD4Hでは、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が生成されます。DBMS_PARALLEL_EXECUTEは、ビューではなく表にのみ使用できるため、mapreduce.jdbc.input.table.nameが表ではなくビューを参照している場合、oracle.hcat.osh.useChunkSplitterfalseに設定する必要があります。

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文を使用します。

9.4.1.2 スプリッタの選択

SINGLE_SPLITTERは、Hive外部表の表プロパティにスプリッタが指定されておらず、かつターゲットOracle表がパーティション化されていない場合に、デフォルトで使用されます。

パーティション化されていない表の場合、oracle.hcat.osh.maxSplitsのデフォルト値は1になります。パーティション化されている表の場合、同じもののデフォルト値は64であり、デフォルトのスプリッタはPARTITION_SPLITTERになります。Oracleサーバーへの接続数を制限するために、maxSplitsのデフォルトが設定されます。この制限を大きくするには、Hive表プロパティでoracle.hcat.osh.maxSplitsの値を明示的に増やす必要があります。

Hive外部表にスプリッタの種類を選択する場合は、次のガイドラインを使用します。

スプリッタの種類 使用

SINGLE_SPLITTER

並列度が不要な場合。

PARTITION_SPLITTER

ターゲット表がパーティション化されている場合に、デフォルトで使用されます

BLOCK_SPLITTER

OracleユーザーにSYS.DBA_EXTENTSに対するSELECT権限があり、ターゲット表がパーティション化されていない場合。

ROW_SPLITTER

OracleユーザーにSYS.DBA_EXTENTSに対するSELECT権限がない場合。

CUSTOM_SPLITTER

生成された分割を詳細に制御する場合。

9.4.1.3 述語のプッシュダウン

述語のプッシュダウンは最適化の手法であり、問合せのときにOracle Databaseによって評価されるよう、述語(WHERE条件)をプッシュダウンします。これにより、問合せの実行時に、Oracle DatabaseからHiveにフェッチされるデータ量が最小化されます。

述語のプッシュダウンを有効化するには、構成プロパティhive.optimize.ppdtrueまたは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'。

これにより、指定された条件に基づいて実行されるすべての問合せについて、Oracle Databaseからフェッチされる行が制限されます。作成される外部表は、Oracle Databaseでのビューに類似しています。このアプローチは、分析できないためにOD4Hによって自動的にプッシュダウンできない複合述語をプッシュダウンする場合にのみ役立ちます。

注意:

HiveおよびOracle間の日付とタイムスタンプ表現の非互換性により、これらの列はデフォルトでは問合せでプッシュ・ダウンされません。これは特定の制限を使用することで有効にできます。表のプロパティoracle.hcat.datetime.pushdowntrueに設定します。trueに設定する場合、問合せの日付表現の形式はYYYY-MM-DDにする必要があり、タイムスタンプは小数点以下のない"YYYY-MM-DD HH:MM:SS"形式にする必要があります。oracle.hcat.datetime.pushdowntrueに設定する場合にサポートされる、その他の日付表現やタイムスタンプ表現はありません。

9.4.1.4 予測のプッシュダウン

予測のプッシュダウンは、問合せの実行時に、Oracle Databaseから必要な列のみをフェッチする最適化の手法です。問合せ時にすべての列をフェッチする必要がある場合は(非推奨)、hive.io.file.read.all.columns接続プロパティをtrueに設定して無効化できます。Hive-1.1.0では、このプロパティはデフォルトでfalseに設定されています。

9.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;

9.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を構成するには、次のステップを実行します。

  1. SYSDBAとしてログインします。

  2. デフォルト設定でDBMS_CONNECTION_POOL.START_POOLを使用し、デフォルト・プールSYS_DEFAULT_CONNECTION_POOLを開始します。

    デフォルト設定でDBMS_CONNECTION_POOL.MINSIZEおよびDBMS_CONNECTION_POOL.MAXSIZEを使用できます。

関連項目:

DRCPの構成の詳細は、『Oracle Database管理者ガイド』を参照してください

9.4.3 セキュリティ機能

OD4Hのセキュリティ機能は、次のとおりです。

9.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などの厳密認証を使用することをお薦めします。

次に、様々な認証プロセスについて例をあげて説明します。

  1. 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");
    		}
    	}
    }
  2. 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の管理に関する項。

  3. Basic認証(デモ専用)

    これは、HCatalog TBLPROPERTIESに格納されているか、またはHiveQL SELECT文で指定されます。

    Basic認証を使用する場合、Oracleスキーマのユーザー名とパスワードは、Hive外部表プロパティで指定されます。

    注意:

    これは、パスワードがHCatalog内にクリア・テキストで格納されるため、本番環境ではお薦めしません。

9.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関連クラスのロギング・レベルを制御できます。

9.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を構成するには、次のステップを実行します。

  1. /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"

  2. /usr/lib/spark/conf/spark-env.shSPARK_HOMEを編集します

    export SPARK_HOME=/usr/lib/spark:/etc/hive/conf
  3. /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

9.7 Oracle Databaseへの書込み

OD4Hの一般的なユースケースでは、HiveまたはSpark SQLの問合せの結果セットをOracle Databaseに格納します。OD4HではOutputFormatが実装されるため、HadoopからOracle Database表に書き込むことができます。

Oracle Database表にデータが挿入された後、好みのビジネス・インテリジェンス・ツールを使用して、さらにデータ・マイニングを行えます

OD4Hデモ・コード・サンプルからの問合せを次に示します。これは、EmployeeBonusReportという外部表への書込みを示しています。

例9-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"