この章では、Oracle SQL Connector for Hadoop Distributed File System (HDFS)を使用して、HadoopとOracle Database間のデータ・アクセスを容易にする方法について説明します。
この章は次の項で構成されています:
Oracle SQL Connector for HDFSを使用する場合、Apache Hadoopに存在する次の形式のデータへのアクセスやデータの分析にOracle Databaseを使用できます。
HDFS形式のデータ・ポンプ・ファイル
HDFS形式のデリミタ付きテキスト・ファイル
Apache Hive表のデリミタ付きテキスト・ファイル
その他のファイル形式(JSONファイルなど)の場合、入力ファイルをデリミタ付きテキストとして新規のHive表にステージングしてから、Oracle SQL Connector for HDFSを使用できます。パーティション化Hive表がサポートされているため、Oracle Databaseで、Hive表全体ではなく、Hive表パーティションのサブセットを表すことができます。
Oracle SQL Connector for HDFSでは、外部表およびデータベース・ビューを使用して、Hive表およびHDFSのデリミタ付きテキスト・ファイルとデータ・ポンプ・ファイルに対する読取りアクセス権をOracle Databaseに提供します。外部表は、データベース外のデータの場所を識別するOracle Databaseオブジェクトです。Oracle Databaseは、外部表の作成時に指定されたメタデータを使用してデータにアクセスします。Oracle SQL Connector for HDFSは、パーティション化Hive表へのアクセスをサポートするように外部表にデータベース・ビューを作成します。外部表またはビューへの問合せによって、データがOracleデータベースの表に格納されている場合と同様に、HDFSやHive表に格納されているデータにアクセスできます。
これらのオブジェクトをOracle Databaseに作成するには、Oracle SQL Connector for HDFSで提供されるExternalTable
コマンドライン・ツールを使用します。ExternalTable
に、Hadoopのデータソースに関する情報とOracle Databaseのスキーマに関する情報を指定します。この情報は、ExternalTable
コマンドに対するオプションとして、またはXMLファイルで指定します。ExternalTableコマンドライン・ツールは、シェルまたはSQL Developerから使用できます。
外部表の準備が完了すると、他のデータベース表の場合と同じ方法でデータに問合せを実行できます。HDFSやHive表のデータに問い合せたり、そのデータを他のデータベースに存在するデータと結合したりすることもできます。
SQLを使用してOracleデータベース表にデータのバルク・ロードを実行できます。頻繁に問い合せるデータのすべてまたは一部をOracleデータベースに格納することもできます。Oracle SQL Connector for HDFSは、Oracleデータベース上で実行されるHadoopクライアントとして機能し、外部表プリプロセッサhdfs_stream
を使用してHDFSのデータにアクセスします。Oracle Shell for Hadoop Loadersには、1ステップで外部表を作成してバルク・ロードを実行するコマンドがあります。
関連項目:
次のOracleブログには、Oracle SQL Developerの使用方法に関する情報が記載されています: https://blogs.oracle.com/bigdataconnectors/move-data-between-apache-hadoop-and-oracle-database-with-sql-developer次に、Oracle SQL Connector for HDFSを使用する場合の基本的なステップを示します。
例2-1 Oracle DatabaseからのHDFSデータ・ファイルへのアクセス
次に、これらのステップを示します。
$ cat moviefact_hdfs.sh # Add environment variables export OSCH_HOME="/u01/connectors/orahdfs-<version>" hadoop jar $OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ -conf /home/oracle/movies/moviefact_hdfs.xml \ -createTable $ cat moviefact_hdfs.xml <?xml version="1.0"?> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>MOVIE_FACTS_EXT</value> </property> <property> <name>oracle.hadoop.exttab.locationFileCount</name> <value>4</value> </property> <property> <name>oracle.hadoop.exttab.dataPaths</name> <value>/user/oracle/moviework/data/part*</value> </property> <property> <name>oracle.hadoop.exttab.fieldTerminator</name> <value>\u0009</value> </property> <property> <name>oracle.hadoop.exttab.defaultDirectory</name> <value>MOVIEDEMO_DIR</value> </property> <property> <name>oracle.hadoop.exttab.nullIfSpecifier</name> <value>\N</</value> </property> <property> <name>oracle.hadoop.exttab.columnNames</name> <value>CUST_ID,MOVIE_ID,GENRE_ID,TIME_ID,RECOMMENDED,ACTIVITY_ID,RATING,SALES</value> </property> <property> <name>oracle.hadoop.exttab.colMap.TIME_ID.columnType</name> <value>TIMESTAMP</value> </property> <property> <name>oracle.hadoop.exttab.colMap.timestampMask</name> <value>YYYY-MM-DD:HH:MI:SS</value> </property> <property> <name>oracle.hadoop.exttab.colMap.RECOMMENDED.columnType</name> <value>NUMBER</value> </property> <property> <name>oracle.hadoop.exttab.colMap.ACTIVITY_ID.columnType</name> <value>NUMBER</value> </property> <property> <name>oracle.hadoop.exttab.colMap.RATING.columnType</name> <value>NUMBER</value> </property> <property> <name>oracle.hadoop.exttab.colMap.SALES.columnType</name> <value>NUMBER</value> </property> <property> <name>oracle.hadoop.exttab.sourceType</name> <value>text</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>jdbc:oracle:thin:@localhost:1521:orcl</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>MOVIEDEMO</value> </property> </configuration> $ sh moviefact_hdfs.sh Oracle SQL Connector for HDFS Release 3.4.0 - Production Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. [Enter Database Password: password] The create table command succeeded. CREATE TABLE "MOVIEDEMO"."MOVIE_FACTS_EXT" ( "CUST_ID" VARCHAR2(4000), "MOVIE_ID" VARCHAR2(4000), "GENRE_ID" VARCHAR2(4000), "TIME_ID" TIMESTAMP(9), "RECOMMENDED" NUMBER, "ACTIVITY_ID" NUMBER, "RATING" NUMBER, "SALES" NUMBER ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY "MOVIEDEMO_DIR" ACCESS PARAMETERS ( RECORDS DELIMITED BY 0X'0A' CHARACTERSET AL32UTF8 PREPROCESSOR "OSCH_BIN_PATH":'hdfs_stream' FIELDS TERMINATED BY 0X'09' MISSING FIELD VALUES ARE NULL ( "CUST_ID" CHAR(4000), "MOVIE_ID" CHAR(4000), "GENRE_ID" CHAR(4000), "TIME_ID" CHAR, "RECOMMENDED" CHAR, "ACTIVITY_ID" CHAR, "RATING" CHAR, "SALES" CHAR ) ) LOCATION ( 'osch-20141114064206-5250-1', 'osch-20141114064206-5250-2', 'osch-20141114064206-5250-3', 'osch-20141114064206-5250-4' ) ) PARALLEL REJECT LIMIT UNLIMITED; The following location files were created. osch-20141114064206-5250-1 contains 1 URI, 12754882 bytes 12754882 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00001 osch-20141114064206-5250-2 contains 1 URI, 438 bytes 438 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00002 osch-20141114064206-5250-3 contains 1 URI, 432 bytes 432 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00003 osch-20141114064206-5250-4 contains 1 URI, 202 bytes 202 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00004 $ sqlplus moviedemo SQL*Plus: Release 12.1.0.1.0 Production on Fri Apr 18 09:24:18 2014 Copyright (c) 1982, 2013, Oracle. All rights reserved. Enter password: password Last Successful login time: Thu Apr 17 2014 18:42:01 -05:00 Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> DESCRIBE movie_facts_ext; Name Null? Type ----------------------------------------- -------- ---------------------------- CUST_ID VARCHAR2(4000) MOVIE_ID VARCHAR2(4000) GENRE_ID VARCHAR2(4000) TIME_ID TIMESTAMP(9) RECOMMENDED NUMBER ACTIVITY_ID NUMBER RATING NUMBER SALES NUMBER SQL> CREATE TABLE movie_facts AS SELECT * FROM movie_facts_ext; Table created. SQL> SELECT movie_id, time_id, recommended, rating FROM movie_facts WHERE rownum < 5; MOVIE_ID TIME_ID RECOMMENDED RATING -------- -------------------------------- ----------- ---------- 205 03-DEC-10 03.14.54.000000000 AM 1 1 77 14-AUG-11 10.46.55.000000000 AM 1 3 116 24-NOV-11 05.43.00.000000000 AM 1 5 141 01-JAN-11 05.17.57.000000000 AM 1 4
Oracle DatabaseシステムまたはHadoopクラスタのいずれかでOracle SQL Connector for HDFSが提供するExternalTable
コマンドライン・ツールを実行できます。
Hiveソースの場合は、HadoopクラスタのノードまたはクラスタのHadoopクライアントとして設定されているシステムにログインします。
テキストおよびデータ・ポンプ形式ファイルの場合は、Oracle DatabaseシステムまたはHadoopクラスタのノードにログインします。
Oracle SQL Connector for HDFSでは、ツールを実行するためにログインするシステムのHADOOP_CLASSPATH
環境変数に情報を追加する必要があります。この追加設定は、システム管理者がアカウントの作成時に行う場合と、自分で行う必要がある場合があります。「OSCHユーザーのOSレベル要件」を参照してください。
環境変数の設定:
HADOOP_CLASSPATH
にOracle SQL Connector for HDFSのJARファイルへのパスが含まれていることを確認します。
path/orahdfs-<version>/jlib/*
Hiveデータソースを使用しているHadoopクラスタにログインする場合は、HADOOP_CLASSPATH
にHiveのJARファイルとconfディレクトリが含まれていることも確認します。次に例を示します。
/usr/lib/hive/lib/* /etc/hive/conf
便宜上、OSCH_HOME
環境変数を作成することもできます。Oracle Big Data Applianceにこの環境変数を設定するBashコマンドを次に示します。
$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
関連項目:
両方のシステムにソフトウェアをインストールし、ユーザー・アカウントを設定する手順については、「Oracle SQL Connector for Hadoop Distributed File Systemの設定」を参照してください。
Oracle SQL Connector for HDFSに関する既知の問題の詳細は、OSCH_HOME
/doc/README.txt
を参照してください。
Oracle SQL Connector for HDFSは、org.apache.hadoop.util.Toolインタフェースでサポートされる汎用のコマンドライン引数を受け入れるコマンドライン・ユーティリティです。また、Oracle外部表のプリプロセッサも提供します。Oracle Big Data Applianceで使用するOracle Exadata Database Machineの構成に関する手順の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。
Oracle SQL Connector for HDFSには、ExternalTable
というコマンドライン・ツールがあります。この項では、このツールの基本的な使用方法について説明します。データソース形式に固有のコマンド構文については、「外部表の作成」を参照してください。
ExternalTable
ツールでは、いくつかのプロパティの値を使用して次のタスクを行います。
外部表の作成
場所ファイルの移入
既存の外部表への場所ファイルの公開
場所ファイルのリスト
外部表の説明
これらのプロパティ値はXMLドキュメントに指定することも、コマンドラインで個々に指定することもできます。
これは、hadoop
コマンドを使用して実行するExternalTable
コマンドライン・ツールの構文全体です。
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -createTable [--noexecute [--output filename.sql]] | -drop [--noexecute] | -describe | -publish [--noexecute] | -listlocations [--details] | -getDDL
OSCH_HOME
環境変数を作成することも、コマンド構文のOSCH_HOME
をOracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスに置き換えることもできます。Oracle Big Data Applianceの場合、このディレクトリは次のようになります。
/opt/oracle/orahdfs-<version>
たとえば、ExternalTable
コマンドライン・ツールで次のようなコマンドを実行できます。
hadoop jar /opt/oracle/orahdfs-<version>/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ . . .
汎用オプションおよびユーザー・コマンド
実行するコマンドで必要なプロパティを含むXML構成ファイルの名前を特定します。
特定のプロパティに値を割り当てます。
外部表定義を作成し、データのURIを外部表の場所ファイルに公開します。出力レポートに、外部表の作成に使用されるDDLと、場所ファイルの内容が示されます。Oracle SQL Connector for HDFSでは、データベースもチェックして、必要なデータベース・ディレクトリが存在し、ユーザーに必要な権限が付与されていることを確認します。
パーティション化Hive表の場合は、Oracle SQL Connector for HDFSによって外部表、ビューおよびメタデータ表が作成されます。表2-2を参照してください。
パーティション化Hive表のメタデータ表名を指定するか、その他すべてのデータソースの外部表名を指定します。
--noexecute
オプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、実行計画の詳細とエラーが表示されます。--output
オプションを使用すると、-createTable
コマンドからDDL表がファイルに書き込まれます。最初に、-createTable
コマンドを--noexecute
を指定して実行することをお薦めします。
特定のデータソースをサポートするようにOracle SQL Connector for HDFSによって作成された、1つ以上のOracle Databaseオブジェクトを削除します。パーティション化Hive表のメタデータ表名を指定するか、その他すべてのデータソースの外部表名を指定します。Oracle SQL Connector for HDFSが作成していない表またはビューを削除しようとするとエラーが発生します。
--noexecute
オプションを使用して、削除するオブジェクトをリストしてください。
Oracle SQL Connector for HDFSによって作成されたOracle Databaseオブジェクトに関する情報を提供します。-getDDL
や-listLocations
ではなく、このコマンドを使用します。
既存の外部表の場所ファイルにデータのURIを公開します。既存の外部表から新しいデータ・ファイルにアクセスできるように、新しいデータ・ファイルを追加した後にこのコマンドを使用します。
--noexecute
オプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、計画されているSQL ALTER TABLE
コマンドと場所ファイルが表示されます。また、エラーも示されます。
最初に、-publish
コマンドを--noexecute
を指定して実行することをお薦めします。
「外部表の更新」を参照してください。
場所ファイルの内容をテキストで表示します。このコマンドで--details
オプションを指定すると、詳細なリストが示されます。このコマンドはリリース3.0で非推奨になりました。かわりに"-describe"を使用してください。
既存の外部表の表定義を出力します。このコマンドはリリース3.0で非推奨になりました。かわりに"-describe"を使用してください。
関連項目:
Oracle SQL Connector for HDFSで提供されるExternalTable
ツールを使用して、外部表を自動的に作成できます。
ExternalTable
ツールを使用して外部表を作成するには、使用するデータソースにあわせて次の手順を実行します。
ExternalTable -createTable
コマンドの実行を完了すると、外部表を使用する準備ができます。ExternalTable
は、外部表の場所ファイルも管理します。「場所ファイルの管理」を参照してください。
外部表を手動で作成するには、「SQLでの外部表の作成」の手順に従います。
-createTableのExternalTable構文
次の構文を使用して外部表を作成し、その場所ファイルを移入します。
hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -createTable [--noexecute]
Oracle SQL Connector for HDFSは、Oracle Loader for Hadoopで作成されるデータ・ポンプ・ファイルのみをサポートし、Oracleユーティリティで作成される汎用データ・ポンプ・ファイルはサポートしません。
Oracle SQL Connector for HDFSは、データ・ポンプ・ファイルのヘッダーのメタデータを使用してデータ・ポンプ・ファイルの外部表定義を作成します。また、preprocessor
アクセス・パラメータでORACLE_LOADER
アクセス・ドライバを使用します。さらに、EXTERNAL VARIABLE DATA
という特殊なアクセス・パラメータも使用します。このパラメータを使用すると、ORACLE_LOADER
は、Oracle Loader for Hadoopで生成されたデータ・ポンプ形式ファイルを読み取ることができます。
Oracle SQL Connector for HDFSによって作成された外部表および場所ファイルを削除するには、-drop
コマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。
注意:
Oracle Loader for Hadoopで作成されるデータ・ポンプ・ファイルにコネクタがアクセスできるようにするには、Oracle SQL Connector for HDFSでOracle Database 11.2.0.2へのパッチが必要です。このパッチをダウンロードするには、http://support.oracle.com
にアクセスしてOracle Bug#14557588を検索します。
リリース11.2.0.3以降では、このパッチは不要です。
次のプロパティは必須です。
oracle.hadoop.exttab.sourceType=datapump
このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。
次の例に、データ・ポンプ・ファイルを記述するプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してデータ・ポンプ・ファイルを記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。
例2-2 データ・ポンプ形式ファイルのプロパティを使用したXMLファイル
<?xml version="1.0"?> <!-- Required Properties --> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.defaultDirectory</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.dataPaths</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.sourceType</name> <value>datapump</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>value</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>value</value> </property> <!-- Optional Properties --> <property> <name>oracle.hadoop.exttab.logDirectory</name> <value>value</value> </property> </configuration>
次の例では、データ・ポンプ・ファイルを読み取るSALES_DP_XTAB
という外部表を作成します。
例2-3 データ・ポンプ形式ファイルの外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。Oracle RACの場合は、分散ファイル・システムにクラスタ全体のディレクトリを作成する必要があります。
$ mkdir /data/sales_dp_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_dp_dir AS '/data/sales_dp_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_dp_dir TO scott;
外部表を作成します。
$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:$HADOOP_CLASSPATH"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \
-D oracle.hadoop.exttab.sourceType=datapump \
-D oracle.hadoop.exttab.dataPaths=hdfs:///user/scott/olh_sales_dpoutput/ \
-D oracle.hadoop.exttab.defaultDirectory=SALES_DP_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable
Oracle SQL Connector for HDFSは、Hiveメタストア・クライアントにアクセスして表の列や表データの場所に関する情報を取得することで、Hive表から外部表定義を作成します。さらに、Hive表のデータ・パスがOracle外部表の場所ファイルに公開されます。
Hive表のメタデータを読み取る場合、Oracle SQL Connector for HDFSでは、HiveのJARファイルがHADOOP_CLASSPATH
変数に含まれる必要があります。Hiveクライアントが機能しているコンピュータにOracle SQL Connector for HDFSをインストールしてこれが稼働している必要があります。
Hive構成ディレクトリをHADOOP_CLASSPATH
環境変数に追加したことを確認します。Hiveクライアントが正しく機能している必要があります。
Hive管理表の場合、データ・パスはウェアハウス・ディレクトリから始まります。
Hive外部表の場合、HDFSの外部の場所からのデータ・パスは、Oracle外部表の場所ファイルに公開されます。表の作成時に外部の場所が定義されるかどうかをHiveは確認しないため、Hive外部表にはデータがありません。Hive表が空の場合、1つの場所ファイルが公開されますが、ヘッダーのみが含まれデータのURIはありません。
Oracle外部表は、「動作中」のHive表ではありません。Hive表が変更された後に、ExternalTable
ツールを使用して、既存の外部表を削除し新しい外部表を作成する必要があります。
Oracle SQL Connector for HDFSによって作成された外部表および場所ファイルを削除するには、-drop
コマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。
Oracle SQL Connector for HDFSは、ROW FORMAT DELIMITED
句とFILE FORMAT TEXTFILE
句を使用して定義される、Hive表をサポートします。Hive管理表とHive外部表はどちらもサポートされます。
Oracle SQL Connector for HDFSはパーティション化Hive表もサポートします。この場合、Oracle SQL Connector for HDFSは1つ以上の外部表およびデータベース・ビューを作成します。「パーティション化Hive表からの外部表の作成」を参照してください。
Hive表は、バケット化される場合とされない場合があります。Hive 0.10.0のすべてのプリミティブ・タイプがサポートされています。
次の表に、HiveとOracle間のデフォルトのデータ型マッピングを示します。Oracle外部表に作成したターゲット列のデータ型を変更するには、「オプションのプロパティ」にリストされているoracle.hadoop.exttab.hive.columnType.*
プロパティを設定します。
表2-1 Hiveデータ型のマッピング
ソースのHive列のデータ型 | ターゲットのOracle列のデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
次の例に、Hive表を記述するプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してHive表を記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。
例2-4 Hive表のプロパティを使用したXMLテンプレート
<?xml version="1.0"?> <!-- Required Properties --> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.defaultDirectory</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.sourceType</name> <value>hive</value> </property> <property> <name>oracle.hadoop.exttab.hive.partitionFilter</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.hive.tableName</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.hive.databaseName</name> <value>value</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>value</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>value</value> </property> <!-- Optional Properties --> <property> <name>oracle.hadoop.exttab.locationFileCount</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.hive.columnType.TYPE</name> <value>value</value> </property> </configuration>
次の例では、SALES_HIVE_XTAB
という外部表を作成して、Hive表からデータを読み取ります。この例では、XMLファイルではなく、コマンドラインのすべてのプロパティを定義しています。
例2-5 パーティション化されていないHive表の外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。
$ mkdir /data/sales_hive_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_hive_dir AS '/data/sales_hive_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_hive_dir TO scott;
外部表を作成します。
$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:/usr/lib/hive/lib/*:/etc/hive/conf:$HADOOP_CLASSPATH"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_HIVE_XTAB \
-D oracle.hadoop.exttab.sourceType=hive \
-D oracle.hadoop.exttab.locationFileCount=2 \
-D oracle.hadoop.exttab.hive.tableName=sales_country_us \
-D oracle.hadoop.exttab.hive.databaseName=salesdb \
-D oracle.hadoop.exttab.defaultDirectory=SALES_HIVE_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable
注意:
パーティション化されていないHive表およびその他のデータソースについては、プロパティoracle.hadoop.exttab.tableName
の値が外部表の名前です。
Oracle SQL Connector for HDFSはパーティション化Hive表をサポートしているため、単一のパーティション、パーティションの範囲またはすべてのパーティションの問合せが可能になります。Oracle Databaseでは、すべてのHiveパーティションまたはそのサブセットを表します。
関連項目:
Oracle SQL Connector for HDFSを使用したすべてのHive表へのアクセスに適用される必須プロパティ、データ型マッピングおよびその他の詳細は、「Hive表からの外部表の作成」を参照してください。
パーティション化Hive表をサポートするために、次の表で説明するオブジェクトをOracle SQL Connector for HDFSで作成します。
表2-2 パーティション化Hive表をサポートするためのOracle Databaseの各オブジェクト
データベース・オブジェクト | 説明 | ネーミング規則(1) |
---|---|---|
外部表 |
Hiveパーティションごとに1つ |
例: |
ビュー |
外部表ごとに1つ。Hiveデータの問合せに使用されます。 |
例: |
メタデータ表 |
Hive表に1つ。特定のHive表に関連付けられているすべての外部表およびビューを識別します。これらのデータベース・オブジェクトの作成、情報表示または削除時にこのテーブルを指定します。 |
例: |
脚注1 テーブル名の末尾に付く"_n"は数値を示します。
たとえば、Hive表が5つのパーティションから構成される場合、Oracle SQL Connector for HDFSは5つの外部表、5つのビュー、および1つのメタデータ表をOracle Databaseに作成します。
表2-2に説明されているオブジェクトおよび場所ファイルを削除するには、-drop
コマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。
注意:
パーティション化Hive表およびその他のデータソースの場合は、プロパティ oracle.hadoop.exttab.tableName
の値がメタデータ表の名前です。
メタデータ表は、Hive表の問合せ方法に関する重要な情報を提供します。次の表はメタデータ表の列を説明します。
表2-3 メタデータ表の列
列 | 説明 |
---|---|
|
単一のHive表パーティションへのアクセスに使用されるOracle Databaseビュー。このビューには、Hive表列とパーティション列の両方が含まれます。 |
|
Hive表パーティションを表すOracle外部表。外部表にはHive表列のみが含まれ、Hiveパーティション列は含まれません。 Hiveパーティション内のすべてのデータにアクセスするには、対応するOracle Databaseビューを使用します。 |
|
Oracle Databaseを介してアクセスされるパーティション化Hive表。 |
|
表が格納されるHiveデータベース。 |
|
Oracle Databaseでアクセスするためのパーティションのサブセットの選択に使用されるHiveパーティション・フィルタ。 |
パーティション列 |
Hive表のパーティション化に使用する各列には、メタデータ表内に別々の列があります。たとえば、メタデータ表にはHive表の |
次のSELECT
文では、HIVE_SALES_DATA
という名前のメタデータ表を問い合せます。
SQL> SELECT view_name, ext_table_name, Hive_table_name, \ hive_db_name, country, city \ FROM hive_sales_data \ WHERE state = 'TEXAS';
問合せの結果により、Texasの各都市のデータを持つ3つのビューが特定されます。
VIEW_NAME EXT_TABLE_NAME HIVE_TABLE_NAME HIVE_DB_NAME COUNTRY CITY ------------------------------------------------------------------------------------------ HIVE_SALES_DATA_1 OSCHHIVE_SALES_DATA_1 hive_sales_data db_sales US AUSTIN HIVE_SALES_DATA_2 OSCHHIVE_SALES_DATA_2 hive_sales_data db_sales US HOUSTON HIVE_SALES_DATA_3 OSCHHIVE_SALES_DATA_3 hive_sales_data db_sales US DALLAS
ビューには、パーティション化列の値が含まれます。外部表にはパーティション列の値が含まれないため、パーティション化Hive表に問い合せる際にはビューを使用することをお薦めします。
問合せを容易にするために、個々のパーティション・ビュー上にUNION ALL
ビューを作成できます。mkhive_unionall_view.sql
スクリプトを使用してください。このスクリプトはOSCH_HOME/example/sql
ディレクトリにあります。パフォーマンスを維持するために、UNION ALL
ビューは50から100 (数はサイズによる)を超えるビューを作成しないでください。
mkhive_unionall_view.sql
を使用するには、次の構文を使用してください。
@mkhive_unionall_view[.sql] table schema view predicate
MKHIVE_UNIONALL_VIEWスクリプト・パラメータ
例2-6 パーティション化Hive表のUNION ALLビュー
次の例では、HIVE_SALES_DATA_UA
という名前のUNION ALL
ビューを作成します。このビューは、HIVE_SALES_DATA
メタデータ表にリストされるすべてのパーティションにアクセスします。
SQL> @mkhive_unionall_view.sql HIVE_SALES_DATA null null null
この例では、ALL_SALES
という名前のUNION ALL
ビューを作成します。このビューはHIVE_SALES_DATA
メタデータ表にリストされるすべてのパーティションにアクセスします。
SQL> @mkhive_unionall_view.sql HIVE_SALES_DATA null ALL_SALES null
次の例では、TEXAS_SALES_DATA
という名前のUNION ALL
ビューを作成します。このビューはSTATE = 'TEXAS'
のすべてのパーティションの行にアクセスします。
SQL> @mkhive_unionallview.sql HIVE_SALES_DATA null TEXAS_SALES_DATA '(STATE = ''''TEXAS'''')'
パーティション化Hive表をサポートするためにコネクタが作成したオブジェクトを管理するには、常にOracle SQL Connector for HDFSコマンドを使用してください。メタデータ表の削除に-drop
コマンドではなく、SQL drop table
コマンドを使用する場合、ダングリング・オブジェクトが発生します。パーティション化Hive表の外部表およびビューを削除できない場合には、それらはダングリング・オブジェクトです。
オブジェクトを削除するときに生成されたエラー・メッセージのスキーマおよび表名を確認し、次の手順で使用してください。
ダングリング・オブジェクトを削除するには、次の手順を実行します。
Oracle DatabaseでSQLセッションをオープンし、ダングリング・オブジェクトの所有者として接続します。
ALL_EXTERNAL_LOCATIONS
およびALL_EXTERNAL_TABLES
データ・ディクショナリ・ビューを問い合せて外部表の場所ファイルを特定します。
SELECT a.table_name, a.directory_name, a.location \ FROM all_external_locations a, all_external_tables b \ WHERE a.table_name = b.table_name AND a.table_name \ LIKE 'OSCHtable%' AND a.owner='schema';
前の構文のLIKE
句で表およびスキーマを適切な値で置き換えます。
出力される場所ファイルの名前にはosch-
接頭辞(osch-20140408014604-175-1
など)が付きます。
ALL_EXTERNAL_TABLES
データ・ディクショナリ・ビューを問い合せて外部表を特定します。
SELECT table_name FROM all_external_tables \ WHERE table_name \ LIKE 'OSCHtable%' AND owner=schema;
ALL_VIEWS
データ・ディクショナリ・ビューを問い合せてデータベース・ビューを特定します。
SELECT view_name FROM all_views WHERE view_name LIKE 'table%' AND owner='schema';
次のコマンドを使用して、表、ビューおよび場所ファイルを調査し、それらが不要であることを確認します。
DESCRIBE schema.table; SELECT * FROM schema.table; DESCRIBE schema.view; SELECT * FROM schema.view;
次のようなコマンドを使用して不要な場所ファイル、表およびビューを削除します。
EXECUTE utl_file.fremove('directory', 'location_file'); DROP TABLE schema.table; DROP VIEW schema.view;
Oracle SQL Connector for HDFSは、列の数、テキスト・デリミタおよびオプションで外部表の列名を指定する構成プロパティを使用して、デリミタ付きテキスト・ファイルの外部表定義を作成します。デフォルトでは、外部表のすべてのテキスト列はVARCHAR2
です。列名を指定しない場合は、デフォルトでC1からCnに設定されます。nは、oracle.hadoop.exttab.columnCount
プロパティで指定される列の数です。
すべてのテキスト・データソースは、VARCHAR2(4000)
に自動的にマップされます。Oracle外部表に作成したターゲット列のデータ型を変更するには、「オプションのプロパティ」にリストされているoracle.hadoop.exttab.colMap.*
プロパティを設定します。
デリミタ付きテキストのソースの場合、次のプロパティが必要です。
このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。
この例に、デリミタ付きテキスト・ファイルを記述するすべてのプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してデータ・ファイルを記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。
例2-7 デリミタ付きテキスト・ファイルのプロパティを使用したXMLテンプレート
<?xml version="1.0"?> <!-- Required Properties --> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.defaultDirectory</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.dataPaths</name> <value>value</value> </property> <!-- Use either columnCount or columnNames --> <property> <name>oracle.hadoop.exttab.columnCount</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.columnNames</name> <value>value</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>value</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>value</value> </property> <!-- Optional Properties --> <property> <name>oracle.hadoop.exttab.colMap.TYPE</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.recordDelimiter</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.fieldTerminator</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.initialFieldEncloser</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.trailingFieldEncloser</name> <value>value</value> </property> <property> <name>oracle.hadoop.exttab.locationFileCount</name> <value>value</value> </property> </configuration>
この例では、SALES_DT_XTAB
という外部表をデリミタ付きテキスト・ファイルから作成します。
例2-8 デリミタ付きテキスト・ファイルの外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。
$ mkdir /data/sales_dt_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_dt_dir AS '/data/sales_dt_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_dt_dir TO scott;
外部表を作成します。
$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:$HADOOP_CLASSPATH"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DT_XTAB \
-D oracle.hadoop.exttab.locationFileCount=2 \
-D oracle.hadoop.exttab.dataPaths="hdfs:///user/scott/olh_sales/*.dat" \
-D oracle.hadoop.exttab.columnCount=10 \
-D oracle.hadoop.exttab.defaultDirectory=SALES_DT_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable
Oracle SQL Connector for HDFSに対する外部表を手動で作成できます。たとえば、次の手順では、ExternalTable -createTable
コマンドで公開されない外部表の構文を使用できます。
追加の構文は、データ・ポンプ形式ファイルではサポートされません。
外部表を手動で作成するには、次の手順を実行します。
-createTable --noexecute
コマンドを使用して、外部表DDLを生成します。
DDLに必要な変更をすべて行います。
前のステップのDDLを実行して、Oracle Databaseに表定義を作成します。
ExternalTable -publish
コマンドを使用して、外部表の場所ファイルにデータのURIを公開します。
-publish
オプションにより、テキスト、データ・ポンプまたはHiveソースに基づいた既存のOracle外部表の(HDFSデータ・パスを指し示す)場所ファイルを更新できます。
ExternalTable
コマンドライン・ツールで-createTable
オプションを使用して、Oracle Databaseに外部表および関連メタデータを作成します。また、外部表の場所ファイルにHDFSのデータ・ファイルのUniversal Resource Identifier (URI)を移入します。
既存の外部表の場所ファイルに更新を公開するには、ExternalTable
を-publish
オプション付きで使用します。この操作により、外部表の場所ファイルがHDFSデータ・パスの新しいURIで更新され、ソースがパーティション化Hive表であれば、新しいパーティション用の外部表およびビューが追加されます
-publish
は次の目的で使用します。
既存の外部表に新しいデータを公開します。
-createTable
によって、外部表の作成時点のHDFSまたはHiveソースのスナップショットが取得されます。ただし、ソースは後で変更される可能性があります。-publish
オプションにより、ソースから既存の外部表を更新できます。
ソースがパーティション化Hive表の場合に新しいデータを公開します。
パーティション化Hive表であるソースに新しいパーティションが追加される場合、-publish
オプションにより、新しいパーティションへのアクセスが必要な新しいデータベース・オブジェクトを追加できます。このオプションは、新しいHiveパーティションを検出し、そのパーティション用の追加の外部表およびビューを作成して、-createTable
コマンドで作成されたメタデータ表を更新します。
-createTableコマンドを--noexecute
オプション付きで使用して手動で作成した外部表を移入します。
注意:
publish
オプションでは、現在、パーティション化Hive表が完全にサポートされます。パーティション化Hive表から導出された外部表を更新するために、回避策として-drop
および-createTable
を使用する必要はなくなりました。
関連項目:
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -publish [--noexecute]
この例では、HADOOP_CLASSPATH
を設定し、例2-3で作成された外部表にHDFSのデータ・パスを公開します。この環境変数の設定の詳細は、「システムへのOracle SQL Connector for HDFSの構成」を参照してください。
例2-9 データ・ポンプ形式ファイルの外部表へのHDFSデータ・パスの公開
この例ではBashシェルが使用されます。
$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*" $ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \ -D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \ -D oracle.hadoop.exttab.sourceType=datapump \ -D oracle.hadoop.exttab.dataPaths=hdfs:/user/scott/data/ \ -D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \ -D oracle.hadoop.connection.user=scott -publish
この例の詳細は次のとおりです。
OSCH_HOME
は、Oracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスです。
SALES_DP_XTAB
は、例2-3で作成された外部表です。
hdfs:/user/scott/data/
は、HDFSデータの場所です。
@myhost:1521
は、データベース接続文字列です。
-describe
コマンドは、既存の外部表の定義を出力するデバッグおよび診断ユーティリティです。場所ファイルのメタデータおよび内容も見られるようになります。このコマンドを使用すると、Oracle外部表の場所ファイルの完全性を確認できます。
このコマンドを使用するには次のプロパティが必要です。
JDBC接続プロパティ(url、userおよびpasswordプロパティを使用した接続を参照してください)
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -describe
この例は、SALES_DP_XTAB
に関連付けられた外部表および場所ファイルの情報を表示するコマンド構文を示します。
例2-10 外部表および場所ファイルの調査
$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*" $ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \ -D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \ -D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \ -D oracle.hadoop.connection.user=scott -describe
-drop
コマンドは、Oracle SQL Connector for HDFSによって作成されたデータベース・オブジェクトを削除します。これらのオブジェクトには外部表、場所ファイルおよびビューが含まれます。手動でオブジェクトを削除すると、「ダングリング・オブジェクトの削除」で説明している問題が発生する可能性があります。
-drop
コマンドはOracle SQL Connector for HDFSが作成したオブジェクトのみを削除します。Oracle SQL Connector for HDFSで作成されたオブジェクトを削除するには、-drop
コマンドを常に使用することをお薦めします。
このコマンドを使用するには次のプロパティが必要です。
oracle.hadoop.exttab.tableName
。パーティション化Hive表の場合は、これはメタデータ表の名前です。その他のデータソース・タイプの場合は、これは外部表の名前です。
JDBC接続プロパティ(url、userおよびpasswordプロパティを使用した接続を参照してください)
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -drop
この例に、SALES_DP_XTAB
に関連付けられたデータベース・オブジェクトを削除するコマンド構文を示します。
例2-11 データベース・オブジェクトの削除
$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*" $ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \ -D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \ -D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \ -D oracle.hadoop.connection.user=scott -drop
データへのアクセスに外部表が使用されるため、外部表のすべての機能と制限が適用されます。問合せは、自動ロード・バランシングと並列で実行されます。ただし、外部表では、更新、挿入および削除操作は許可されず、索引を作成できません。外部表にアクセスすると、表の完全スキャンが常に実行されます。
Oracle SQL Connector for HDFSでは、ORACLE_LOADER
アクセス・ドライバが使用されます。hdfs_stream
プリプロセッサ・スクリプト(Oracle SQL Connector for HDFSに付属)は、入力データをORACLE_LOADER
が処理できる形式に変更します。
Oracle SQL Connector for HDFSでは、デフォルトのデータ型マッピングを使用して、Hiveおよびテキスト・ソースに対して適切なデータ型の列をOracle外部表に作成します。これらのデフォルトをオーバーライドするには、すべての列または特定の列に対して様々な構成プロパティを設定します。
たとえば、テキスト・ファイルの1つのフィールドにタイムスタンプを含める場合です。デフォルトでは、このフィールドはVARCHAR2
列にマップされます。ただし、TIMESTAMP
列を指定して日時マスクを入力すると、値を正確にTIMESTAMP
データ型にキャストできます。TIMESTAMP
データ型では、データがテキストとして表されているときは使用できない時間ベースの問合せおよび分析がサポートされます。
テキスト・ソースはVARCHAR2
列にマップされ、Hive列は、同等に最も近いOracleデータ型の列にマップされます。表2-1に、デフォルトのマッピングを示します。
次のプロパティは、外部表のすべての列に適用されます。Hiveソースの場合は、これらのプロパティ設定によって、oracle.hadoop.exttab.hive.*
プロパティ設定がオーバーライドされます。
次のプロパティが適用されるのは、プロパティ名のcolumn_name部分を名前に持つ1つの列のみです。これらのプロパティ設定は、その他すべての設定をオーバーライドします。
次のプロパティでは、すべての列がデフォルトのVARCHAR2
データ型である外部表が作成されます。
oracle.hadoop.exttab.tableName=MOVIE_FACT_EXT_TAB_TXT oracle.hadoop.exttab.columnNames=CUST_ID,MOVIE_ID,GENRE_ID,TIME_ID,RECOMMENDED,ACTIVITY_ID,RATING,SALES
この例では、次のプロパティを設定して、複数の列のデータ型をオーバーライドします。
oracle.hadoop.exttab.colMap.TIME_ID.columnType=TIMESTAMP oracle.hadoop.exttab.colMap.RECOMMENDED.columnType=NUMBER oracle.hadoop.exttab.colMap.ACTIVITY_ID.columnType=NUMBER oracle.hadoop.exttab.colMap.RATING.columnType=NUMBER oracle.hadoop.exttab.colMap.SALES.columnType=NUMBER
Oracle SQL Connector for HDFSによって、指定したデータ型を備えた外部表が作成されます。
SQL> DESCRIBE movie_facts_ext
Name Null? Type
----------------------------------------- -------- ----------------------------
CUST_ID VARCHAR2(4000)
MOVIE_ID VARCHAR2(4000)
GENRE_ID VARCHAR2(4000)
TIME_ID TIMESTAMP(9)
RECOMMENDED NUMBER
ACTIVITY_ID NUMBER
RATINGS NUMBER
SALES NUMBER
次の例では、次のプロパティ設定を追加して、VARCHAR2
列の長さを変更します。
oracle.hadoop.exttab.colMap.CUST_ID.columnLength=12 oracle.hadoop.exttab.colMap.MOVIE_ID.columnLength=12 oracle.hadoop.exttab.colMap.GENRE_ID.columnLength=12
これで、すべての列がカスタム・データ型に設定されました。
SQL> DESCRIBE movie_facts_ext
Name Null? Type
----------------------------------------- -------- ----------------------------
CUST_ID VARCHAR2(12)
MOVIE_ID VARCHAR2(12)
GENRE_ID VARCHAR2(12)
TIME_ID TIMESTAMP(9)
RECOMMENDED NUMBER
ACTIVITY_ID NUMBER
RATINGS NUMBER
SALES NUMBER
場所ファイルは、外部表のLOCATION句で指定されるファイルです。Oracle SQL Connector for HDFSは、データ・ファイルのUniversal Resource Identifier (URI)のみを含む場所ファイルを作成します。データ・ファイルには、HDFSに格納されるデータが含まれます。
外部表で並列処理を有効にするには、外部表のLOCATION句で複数のファイルを指定する必要があります。ファイルの数は、表の読取り時に外部表で開始される子プロセスの数を決定します。これは、並列度やDOPと呼ばれます。
次の手順で説明されているように、特定の並列度で実行することに決定し、場所ファイルを多数(並列度の倍数)作成できるのが理想的です。
パフォーマンスを最大にするために並列処理を設定するには、次の手順を実行します。
Oracle SQL Connector for HDFSの実行時にOracle DBAで使用できる最大DOPを特定します。
大量のデータをOracleデータベースにロードする場合は、DBAと協力してリソースを最大限に使用できる時期を特定する必要もあります。
DOPの小さい倍数となる数の場所ファイルを作成します。たとえば、DOPが8の場合は、8、16、24または32個の場所ファイルを作成します。
ほぼ同じサイズで、場所ファイル数の倍数となる数のHDFSファイルを作成します。たとえば、場所ファイルが32個ある場合は、データ量やHDFSファイルの最小サイズに応じて、128個や1280個以上のHDFSファイルを作成します。
ALTER SESSION
コマンドを使用するか、SQL SELECT
文でヒントを使用して、データ・ロードのDOPを設定します。
この例では、ALTER SESSION
を使用してDOPを8に設定します。
ALTER SESSION FORCE PARALLEL DML PARALLEL 8; ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;
次の例では、PARALLEL
ヒントを使用してDOPを8に設定します。
INSERT /*+ parallel(my_db_table,8) */ INTO my_db_table \ SELECT /*+ parallel(my_hdfs_external_table,8) */ * \ FROM my_hdfs_external_table;
SQL INSERT
文のAPPEND
ヒントもパフォーマンスの向上に役立つことがあります。
Oracle SQL Connector for HDFSのコマンドライン・ツールExternalTable
は、外部表を作成してそのHDFS URI情報を場所ファイルに公開します。外部表の場所ファイルは、oracle.hadoop.exttab.defaultDirectory
プロパティで指定されたディレクトリに格納されます。Oracle RACデータベースの場合、このディレクトリは、各データベース・サーバーからアクセス可能な分散ファイル・システムに格納する必要があります。
ExternalTable
は、外部表の場所ファイルを管理しますが、これには次の操作が含まれます。
名前の競合の確認後、データベース・ディレクトリに新しい場所ファイルを生成
データベース・ディレクトリの既存の場所ファイルを必要に応じて削除
データのURIを新しい場所ファイルに公開
新しい場所ファイルに一致するように外部表のLOCATION
句を変更
サポート対象データソースの場所ファイルの管理については、次のトピックで説明します。
データ・ポンプ・ファイルにアクセスするには、ORACLE_LOADER
アクセス・ドライバが必要です。このドライバでは、各場所ファイルがHDFSの単一のデータ・ポンプ・ファイルに対応する必要があります。空の場所ファイルは許可されないため、外部表の場所ファイルの数は、HDFSのデータ・ファイルの数と厳密に一致する必要があります。
Oracle SQL Connector for HDFSは、場所ファイルの管理を自動的に引き継ぎ、外部表の場所ファイルの数とHDFSのデータ・ポンプ・ファイルの数が同じになるようにします。
ORACLE_LOADER
アクセス・ドライバには、場所ファイルの数に関する制限はありません。各場所ファイルは、HDFSの1つ以上のデータ・ファイルに対応できます。外部表の場所ファイルの数は、oracle.hadoop.exttab.locationFileCount
構成プロパティで示されます。
url、userおよびpasswordプロパティを使用した接続を参照してください。
-D
オプションを指定したコマンドラインでExternalTable
ツールに構成プロパティを渡すか、構成ファイルを作成してから-conf
オプションを指定したコマンドラインでそのファイルを渡すことができます。これらのオプションは、実行されるコマンドの前に記述する必要があります。
たとえば、次のコマンドではexample.xml
という名前の構成ファイルを使用します。
hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-conf /home/oracle/example.xml \
-createTable
「ExternalTableコマンドライン・ツールの構文」を参照してください。
構成ファイルは、次のような非常に単純な構造のXMLドキュメントです。
<?xml version="1.0"?> <configuration> <property> <name>property</name> <value>value</value> </property> . . . </configuration>
次の例に構成ファイルを示します。これらのプロパティの説明については、「Oracle SQL Connector for HDFS構成プロパティ・リファレンス」を参照してください。
例2-12 Oracle SQL Connector for HDFSの構成ファイル
<?xml version="1.0"?> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>SH.SALES_EXT_DIR</value> </property> <property> <name>oracle.hadoop.exttab.dataPaths</name> <value>/data/s1/*.csv,/data/s2/*.csv</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>jdbc:oracle:thin:@//myhost:1521/myservicename</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>SH</value> </property> </configuration>
次に、ExternalTable
コマンドライン・ツールで使用される構成プロパティの一覧を示します。プロパティは次のカテゴリに編成されます。
一般的なプロパティ
プロパティ | 説明 | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
oracle.hadoop.exttab.badFileFormatUsePercentA |
外部表の不正ファイル名に'%a'を含むかどうかを示します。これは、 有効な値: デフォルト値: デフォルトの不正ファイル名は
関連項目:
|
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.columnLength |
外部表の デフォルト値: 列タイプで許容される最大長 Oracle Database 12cの場合、Oracle SQL Connector for HDFSでは、データベースの 有効な値: 整数 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.columnType |
Hiveおよびテキスト・ソースのすべての列のデータ型マッピングを指定します。オプション。
デフォルト値: テキストの場合は 有効な値: 次のOracleデータ型がサポートされています。
|
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.dateMask |
すべての デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.fieldLength |
すべての デフォルト値: 4000バイト 有効な値: 整数 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.timestampMask |
すべての デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.timestampTZMask |
すべての デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.columnLength |
外部表の デフォルト値: 有効な値: 整数 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.columnType |
column_nameに対するデータ型マッピングをオーバーライドします。オプション。 column_nameは、大文字と小文字を区別します。Hive表の列または デフォルト値: 有効な値: |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.dateMask |
column_nameに対する書式マスクをオーバーライドします。オプション。 column_nameは、大文字と小文字を区別します。Hive表の列または デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.fieldLength |
column_nameに対して、 column_nameは、大文字と小文字を区別します。Hive表の列または デフォルト値: Oracle SQL Connector for HDFSでは、次の表に示すようにデフォルトのフィールドの長さを設定します。 表2-4 フィールドの長さの計算
有効な値: 整数 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.nullIfSpecifier |
このプロパティは、外部表のcolumn_nameによって識別される列に適用されます。オプション。 型: string 有効な値: デフォルト値: なし。 このプロパティは、デリミタ付きテキストのソースにのみ適用されます。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.timestampMask |
column_nameに対する書式マスクをオーバーライドします。オプション。 column_nameは、大文字と小文字を区別します。Hive表の列または デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.colMap.column_name.timestampTZMask |
column_nameに対する書式マスクをオーバーライドします。オプション。 column_nameは、大文字と小文字を区別します。Hive表の列または デフォルト値: 有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。 |
||||||||||||||||||||||
oracle.hadoop.exttab.columnCount |
デリミタ付きテキスト・ファイルから作成される外部表の列の数を指定します。列名はC1、C2、... Cnのように設定されます。nはこのプロパティの値です。 このプロパティは、
デリミタ付きテキスト・ファイルから外部表を作成する場合は、このプロパティまたは |
||||||||||||||||||||||
oracle.hadoop.exttab.columnNames |
デリミタ付きテキスト・ファイルから作成される外部表の列名のカンマ区切りリストを指定します。このプロパティを設定しない場合、列名はC1、C2、... Cnのようになります。nは 列名はSQL識別子として読み取られます。引用符で囲まれていない値は大文字に変換され、二重引用符で囲まれている値は入力したとおりに使用されます。
デリミタ付きテキスト・ファイルから外部表を作成する場合は、このプロパティまたは |
||||||||||||||||||||||
oracle.hadoop.exttab.dataCompressionCodec |
注意: このプロパティは非推奨です。OSCHは、実行時に各ファイルの圧縮コードを検出します。データセットには、圧縮ファイルと非圧縮ファイルの両方を含めることも、異なるコーデックで圧縮されたファイルを含めることもできます。 データ・ファイルの圧縮に使用される圧縮コーデック・クラスの名前を指定します。このプロパティは、データ・ファイルを圧縮する場合に指定します。オプション。 このプロパティは、 Hadoopでは、次を含む複数の標準コーデックを使用できます。
デフォルト値: なし |
||||||||||||||||||||||
oracle.hadoop.exttab.dataPaths |
完全修飾されたHDFSパスのカンマ区切りリストを指定します。このプロパティを使用すると、パスの指定に特別なパターン一致文字を使用して、入力を制限できます。次の表を参照してください。 たとえば、 /data/s2/,/data/s[7-9]/*.csv 外部表は、リストされたすべてのファイルおよびリストされたディレクトリ内のすべてのファイルに含まれるデータにアクセスします。これらのファイルで1つのデータセットを構成します。 データセットには、圧縮ファイルを含めることも、非圧縮ファイルを含めることもできますが、両方を含めることはできません。 表2-5 パターン一致文字
|
||||||||||||||||||||||
oracle.hadoop.exttab.dataPathFilter |
パス・フィルタ・クラスを指定します。Hiveデータソースの場合、このプロパティは無視されます。 Oracle SQL Connector for HDFSは、デフォルトのフィルタを使用して、先頭がドットまたはアンダースコアの隠しファイルを除外します。このプロパティを使用して別のパス・フィルタ・クラスを指定する場合、デフォルトのフィルタの他にも使用するフィルタが機能します。そのため、使用するフィルタで受け入れられる表示ファイルのみが考慮されます。 |
||||||||||||||||||||||
oracle.hadoop.exttab.defaultDirectory |
Oracle外部表のデフォルトのディレクトリを指定します。このディレクトリは、ディレクトリ・オブジェクトを明示的に指定しない入力ファイルおよび出力ファイルのすべてに使用されます。Oracle RACでは、このディレクトリは、すべてのOracleインスタンスがアクセスできる共有ディレクトリである必要があります。 有効な値: 既存のデータベース・ディレクトリの名前 引用符で囲まれていない名前は大文字に変更されます。二重引用符で囲まれている名前は変更されないため、大文字と小文字を区別する場合は、二重引用符で囲まれた名前を使用します。一重引用符で囲まれている名前は、デフォルトのディレクトリ名に使用できません。
|
||||||||||||||||||||||
oracle.hadoop.exttab.fieldTerminator |
デフォルト値: , (カンマ) 有効な値: 次のいずれかの形式の文字列
2つの形式を組み合せないでください。 |
||||||||||||||||||||||
oracle.hadoop.exttab.hive.columnType.* |
Hiveデータ型をOracleデータ型にマップします。このプロパティ名はHiveデータ型を識別し、その値はOracleデータ型です。外部表のターゲット列は、このプロパティで示されたOracleデータ型で作成されます。 Hiveの デフォルト値: 次の表に、Hive列タイプのプロパティとそのデフォルト値を示します。 有効な値: 表2-6 Hive列タイプのマッピングのプロパティ
|
||||||||||||||||||||||
oracle.hadoop.exttab.hive.databaseName |
入力データ表を含むHiveデータベースの名前を指定します。
|
||||||||||||||||||||||
oracle.hadoop.exttab.hive.partitionFilter |
ソースHive表パーティションのフィルタに使用する有効なHiveQL式を指定します。表がパーティション化されていない場合、このプロパティは無視されます。 型: String デフォルト値: なし。Hive表のすべてのパーティションは外部表にマップされます。 有効な値: 有効なHiveQL式。 説明: ソースHive表パーティションのフィルタに使用する有効なHiveQL式を指定します。Hive表がパーティション化されていない場合、このプロパティは無視されます。他の列を含めてもエラーは発生しませんが、意図しない結果となる可能性があります。他の列は含めないことをお薦めします。 式は次の制限に従う必要があります。
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.exttab.hive.refreshTables |
ソースがHiveパーティション化表の場合にのみ適用され、それ以外では無視されます。このプロパティは、ソースで新しいHiveパーティションの新しい外部表およびビューを追加する場合に、 リフレッシュを有効にするには、このプロパティを デフォルト値: |
||||||||||||||||||||||
oracle.hadoop.exttab.hive.tableName |
既存のHive表の名前を指定します。
|
||||||||||||||||||||||
oracle.hadoop.exttab.hive.deleteObsoleteTables |
古いオブジェクトの削除を有効にするには、このプロパティを デフォルト値: |
||||||||||||||||||||||
oracle.hadoop.exttab.initialFieldEncloser |
デリミタ付きテキスト・ファイルから作成される外部表の開始フィールド囲み文字を指定します。オプション。 デフォルト値: null。外部表定義に囲み文字は指定されません。
有効な値: 次のいずれかの形式の文字列
2つの形式を組み合せないでください。 |
||||||||||||||||||||||
oracle.hadoop.exttab.locationFileCount |
外部表の場所ファイルの目的の数を指定します。データ・ポンプ・ファイル以外のファイルにのみ適用可能です。 デフォルト値: 4 データ・ファイルがデータ・ポンプ形式の場合、このプロパティは無視されます。それ以外は、場所ファイルの数は次のいずれか少ない方になります。
少なくとも1つの場所ファイルが作成されます。 場所ファイルの数の詳細は、「並列処理の有効化」を参照してください。 |
||||||||||||||||||||||
oracle.hadoop.exttab.logDirectory |
ログ・ファイルと不正なファイルが格納されるデータベース・ディレクトリを指定します。ファイル名は、外部表で使用されるデフォルトの値になります。たとえば、ログ・ファイルの名前は、表名の後に これは、 ファイル名のデフォルトの拡張子を次に示します。
有効な値: 既存のOracleディレクトリ・オブジェクト名。 引用符で囲まれていない名前は大文字に変更されます。引用符で囲まれている名前は変更されません。次の表に、値が変換される場合の例を示します。 例2-7 引用符で囲まれている値と引用符で囲まれていない値の例
|
||||||||||||||||||||||
oracle.hadoop.exttab.nullIfSpecifier |
外部表定義のNULLIF句を指定します。オプション。 このプロパティは、外部表のすべての列に適用されます。 型: string 有効な値: 次の形式の文字列。
デフォルト値: なし。 このプロパティは、デリミタ付きテキストのソースにのみ適用されます。 |
||||||||||||||||||||||
oracle.hadoop.exttab.preprocessorDirectory |
プリプロセッサのデータベース・ディレクトリを指定します。ファイル・システム・ディレクトリには、 デフォルト値: プリプロセッサのディレクトリは、外部表の |
||||||||||||||||||||||
oracle.hadoop.exttab.preprocessorScript |
外部表のプリプロセッサ・スクリプトの名前を指定します。 デフォルト値: プリプロセッサ・スクリプト名は、外部表の |
||||||||||||||||||||||
oracle.hadoop.exttab.recordDelimiter |
デリミタ付きテキスト・ファイルから作成される外部表のレコード・デリミタを指定します。オプション。 デフォルト値:
有効な値: 次のいずれかの形式の文字列
2つの形式を組み合せないでください。 |
||||||||||||||||||||||
oracle.hadoop.exttab.sourceType |
ソース・ファイルのタイプを指定します。 デフォルト値: 有効な値: |
||||||||||||||||||||||
oracle.hadoop.exttab.stringSizes |
文字列に指定される長さがバイトか文字かを示します。この値は、外部表の デフォルト値: 有効な値: |
||||||||||||||||||||||
oracle.hadoop.exttab.createLogFiles |
外部表の問合せ時にログ・ファイルを作成するかどうかを指定します。開発中はログ・ファイル作成を有効にし、本番中には最高のパフォーマンスを得るためにログ・ファイル作成を無効にすることをお薦めします。 デフォルト値: デフォルトではログ・ファイルが作成されます。ログ・ファイルの作成を停止するには、表を削除し、このプロパティを |
||||||||||||||||||||||
oracle.hadoop.exttab.printVerbose |
デフォルト値: |
||||||||||||||||||||||
oracle.hadoop.exttab.createBadFiles |
外部表の問合せ時に不正なファイルを作成するかどうかを指定します。不正なファイルには、不正なデータのある行に関する情報が含まれます。不正なファイルは、不正なデータがある場合にのみ作成されます。不正なファイルを作成することをお薦めします。 デフォルト値: デフォルトでは不正なファイルが作成されます。不正なファイルの作成を停止するには、表を削除し、このプロパティを このプロパティは、Hiveおよびデリミタ付きテキストのソースにのみ適用されます。 |
||||||||||||||||||||||
oracle.hadoop.exttab.logFileFormatUsePercentA |
外部表のログ・ファイル名に'%a'を含むかどうかを示します。これは、 有効な値: デフォルト値: デフォルトのログ・ファイル名は ロードが正常に行われたかどうかを判断するため、または拒否された行の理由を確認するために、 関連項目:
|
||||||||||||||||||||||
oracle.hadoop.exttab.tableName |
パーティション化Hive表のメタデータ表、またはその他すべてのデータソースに関する外部表のスキーマで修飾された名前を、次の形式で指定します。 schemaName.tableName schemaNameを省略すると、スキーマ名はデフォルトで接続ユーザー名に設定されます。 デフォルト値: なし すべての操作で必須のプロパティ。 |
||||||||||||||||||||||
oracle.hadoop.exttab.trailingFieldEncloser |
デリミタ付きテキスト・ファイルから作成される外部表の終了フィールド囲み文字を指定します。オプション。 デフォルト値: null。デフォルトで
有効な値: 次のいずれかの形式の文字列
2つの形式を組み合せないでください。 |
url、userおよびpasswordプロパティを使用した接続
url、userおよびpasswordプロパティは、異なる接続メソッドを提供します。これらのプロパティは、Oracle Walletを使用した接続に必要なプロパティと併用しないでください。
プロパティ | 説明 |
---|---|
oracle.hadoop.connection.url |
次のようなThinスタイル・サービス名形式のデータベース接続文字列を指定します。 jdbc:oracle:thin:@//host_name:port/service_name サービス名が不明な場合は、特権ユーザーとして次のSQLコマンドを入力します。 SQL> show parameter service このプロパティは、他のすべての接続プロパティより優先されます。 デフォルト値: 定義されていません。 有効な値: 1つの文字列 |
oracle.hadoop.connection.user |
Oracleデータベースのログイン名を指定します。oracle.hadoop.connection.passwordが指定されていない場合は、 デフォルト値: 定義されていません。 有効な値: 1つの文字列 |
oracle.hadoop.connection.password |
Oracle Databaseユーザーのパスワード。重要でないテスト環境やデモ環境以外で、このプロパティをクリア・テキスト・パスワードを格納するために使用しないことをお薦めします。接続からpasswordプロパティを除外することで、パスワード・プロンプト/応答を強制できます。この場合、externalTableツールによってパスワードの入力が求められます。プロンプト/応答なしの接続が必要な場合は、次の項で説明するOracle Wallet接続メソッドをかわりに使用してください。 デフォルト値: 定義されていません。 有効な値: 1つの文字列 |
Oracle Walletを使用した接続
Oracle Walletを外部パスワード・ストアとして使用する場合、次の表に示すプロパティを設定します。
表2-8 Oracle Walletを使用した接続に必要なプロパティ
プロパティ | 説明 |
---|---|
oracle.hadoop.connection.tnsEntryName |
tnsnames.oraファイルに定義されたTNSエントリ名を指定します。 このプロパティは、 デフォルト値: 定義されていません。 有効な値: 1つの文字列 |
oracle.hadoop.connection.tns_admin |
tnsnames.oraファイルを格納するディレクトリを指定します。データベース接続文字列でTransparent Network Substrate (TNS)のエントリ名を使用するようにこのプロパティを定義します。TNSNamesをJDBC Thinドライバとともに使用する場合は、このプロパティまたはJavaの Oracle Walletを外部パスワード・ストアとして使用する場合、このプロパティを設定する必要があります。 デフォルト値: Java 有効な値: 1つの文字列 |
oracle.hadoop.connection.wallet_location |
接続の資格証明が格納されるOracle Walletディレクトリへのファイル・パスを指定します。 デフォルト値: 定義されていません。 有効な値: 1つの文字列 |
ヒント:
Oracle Walletを使用した接続は多くのTNSエントリに対応できるため、user、passwordおよびurlプロパティを使用する接続よりも推奨されます。後者は単一のマシン/ポート/サービス名の組合せに制限されます。簡単かつ段階的なデモについては、Connecting Hadoop With Oracleブログの投稿Using Oracle SQL Connector for HDFS with Oracle Walletを参照してください。
大量のデータを処理する場合、並列処理はきわめて重要です。外部表を使用する場合、必ず次のSQLコマンドを使用して並列問合せを有効にします。
ALTER SESSION ENABLE PARALLEL QUERY;
Oracle SQL Connector for HDFSによって作成された外部ファイルからOracle Databaseにデータをロードする前に、並列DDLを有効にします。
ALTER SESSION ENABLE PARALLEL DDL;
既存のデータベース表にデータを挿入する前に、次のSQLコマンドを使用して並列DMLを有効にします。
ALTER SESSION ENABLE PARALLEL DML;
APPEND
やPQ_DISTRIBUTE
などのヒントにより、データ挿入時のパフォーマンスも向上します。
パフォーマンス改善に関する詳細および例は、My Oracle Supportドキュメント2111850.1を参照してください。