この章では、Oracle SQL Connector for Hadoop Distributed File System (HDFS)を使用して、HadoopとOracle Database間のデータ・アクセスを容易にする方法について説明します。
この章の内容は次のとおりです。
Oracle SQL Connector for HDFSを使用する場合、Hadoopに存在する次の形式のデータへのアクセスやデータの分析にOracle Databaseを使用できます。
HDFS形式のデータ・ポンプ・ファイル
HDFS形式のデリミタ付きテキスト・ファイル
Hive表
その他のファイル形式(JSONファイルなど)の場合、Oracle SQL Connector for HDFSを使用する前に、入力をHive表にステージングできます。
Oracle SQL Connector for HDFSでは、外部表を使用して、Hive表、HDFSのデリミタ付きテキスト・ファイルおよびデータ・ポンプ・ファイルへの読取りアクセス権をOracle Databaseに提供します。外部表は、データベース外のデータの場所を識別するOracle Databaseオブジェクトです。Oracle Databaseは、外部表の作成時に指定されたメタデータを使用してデータにアクセスします。外部表への問合せによって、データがOracleデータベースの表に格納されている場合と同様に、HDFSやHive表に格納されているデータにアクセスできます。
この目的で外部表を作成するには、Oracle SQL Connector for HDFSで提供されるExternalTable
コマンドライン・ツールを使用します。ExternalTable
に、Hadoopのデータソースに関する情報とOracle Databaseのスキーマに関する情報を指定します。この情報は、ExternalTableコマンドへのパラメータとして、またはXMLファイル形式で指定します。
外部表の準備が完了すると、他のデータベース表の場合と同じ方法でデータに問合せを実行できます。HDFSやHive表のデータに問い合せたり、そのデータを他のデータベースに存在するデータと結合したりすることもできます。
SQLを使用して、Oracleデータベースの表にデータをバルク・ロードすることもできます。頻繁に問い合せるデータのすべてまたは一部をOracleデータベースに格納することもできます。
次に、Oracle SQL Connector for HDFSを使用する場合の基本的な手順を示します。
初めてOracle SQL Connector for HDFSを使用する場合は、ソフトウェアがインストールおよび構成されていることを確認します。
「システムへのOracle SQL Connector for HDFSの構成」を参照してください。
Oracle DatabaseシステムまたはHadoopクラスタのノードのいずれか適切なシステムにログインします。
「システムへのOracle SQL Connector for HDFSの構成」を参照してください。
接続とデータベースを指定するXMLドキュメントを作成します(ExternalTable
コマンドにこれらのパラメータを指定していない場合)。
「外部表の説明」を参照してください。
ExternalTable
コマンドを含むシェル・スクリプトを作成します。
「ExternalTableコマンドライン・ツールの使用」を参照してください。
シェル・スクリプトを実行します。
ジョブが失敗した場合、出力の診断メッセージを使用してエラーを特定し、修正します。失敗した時点のジョブの進捗状況によっては、スクリプトを再実行する前にOracleデータベースから表の定義を削除する必要があります。
ジョブが成功した後、外部表の所有者としてOracle Databaseに接続します。この表に問い合せて、データにアクセスできることを確認します。
頻繁に問い合せるデータは、データベースの表にロードすると便利です。外部表には索引やパーティションはありません。
ここまでの手順を例2-1に例示します。
例2-1 Oracle DatabaseからのHDFSデータ・ファイルへのアクセス
$ cat moviefact_hdfs.sh # Add environment variables export OSCH_HOME="/opt/oracle/orahdfs-2.2.0" hadoop jar $OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ -conf /home/jdoe/movie/moviefact_hdfs.xml \ -createTable $ cat moviefact_hdfs.xml <?xml version="1.0"?> <configuration> <property> <name>oracle.hadoop.exttab.tableName</name> <value>MOVIE_FACT_EXT_TAB_TXT</value> </property> <property> <name>oracle.hadoop.exttab.locationFileCount</name> <value>4</value> </property> <property> <name>oracle.hadoop.exttab.dataPaths</name> <value>/user/jdoe/moviework/data/part*</value> </property> <property> <name>oracle.hadoop.exttab.fieldTerminator</name> <value>\u0009</value> </property> <property> <name>oracle.hadoop.exttab.defaultDirectory</name> <value>MOVIE_DIR</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.sourceType</name> <value>text</value> </property> <property> <name>oracle.hadoop.connection.url</name> <value>jdbc:oracle:thin:@//dbhost:1521/orcl.example.com</value> </property> <property> <name>oracle.hadoop.connection.user</name> <value>MOVIEDEMO</value> </property> </configuration> $ sh moviefact_hdfs.sh Oracle SQL Connector for HDFS Release 2.2.0 - Production Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. Enter Database Password: password] The create table command succeeded. CREATE TABLE "MOVIEDEMO"."MOVIE_FACT_EXT_TAB_TXT" ( "CUST_ID" VARCHAR2(4000), "MOVIE_ID" VARCHAR2(4000), "GENRE_ID" VARCHAR2(4000), "TIME_ID" VARCHAR2(4000), "RECOMMENDED" VARCHAR2(4000), "ACTIVITY_ID" VARCHAR2(4000), "RATING" VARCHAR2(4000), "SALES" VARCHAR2(4000) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY "MOVIE_DIR" ACCESS PARAMETERS ( RECORDS DELIMITED BY 0X'0A' disable_directory_link_check CHARACTERSET AL32UTF8 STRING SIZES ARE IN CHARACTERS PREPROCESSOR "OSCH_BIN_PATH":'hdfs_stream' FIELDS TERMINATED BY 0X'2C' MISSING FIELD VALUES ARE NULL ( "CUST_ID" CHAR, "MOVIE_ID" CHAR, "GENRE_ID" CHAR, "TIME_ID" CHAR, "RECOMMENDED" CHAR, "ACTIVITY_ID" CHAR, "RATINGS" CHAR, "SALES" CHAR ) ) LOCATION ( 'osch-20130314092801-1513-1', 'osch-20130314092801-1513-2', 'osch-20130314092801-1513-3', 'osch-20130314092801-1513-4' ) ) PARALLEL REJECT LIMIT UNLIMITED; The following location files were created. osch-20130314092801-1513-1 contains 1 URI, 12754882 bytes 12754882 hdfs://bda-ns/user/jdoe/moviework/data/part-00001 osch-20130314092801-1513-2 contains 1 URI, 438 bytes 438 hdfs://bda-ns/user/jdoe/moviework/data/part-00002 osch-20130314092801-1513-3 contains 1 URI, 432 bytes 432 hdfs://bda-ns/user/jdoe/moviework/data/part-00003 osch-20130314092801-1513-4 contains 1 URI, 202 bytes 202 hdfs://bda-ns/user/jdoe/moviework/data/part-00004 SQL*Plus: Release 11.2.0.3.0 Production on Thu Mar 14 14:14:31 2013 Copyright (c) 1982, 2011, Oracle. All rights reserved. Enter password: password Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP and Data Mining options SQL> SELECT cust_id, movie_id, time_id FROM movie_fact_ext_tab_txt 2 WHERE rownum < 5; CUST_ID MOVIE_ID TIME_ID -------------------- -------------------- -------------------- 1150211 585 01-JAN-11 1221463 9870 01-JAN-11 1002672 1422 01-JAN-11 1095718 544 01-JAN-11 SQL> DESCRIBE movie_fact_ext_tab_txt Name Null? Type ----------------------------------------- -------- ---------------------------- CUST_ID VARCHAR2(4000) MOVIE_ID VARCHAR2(4000) GENRE_ID VARCHAR2(4000) TIME_ID VARCHAR2(4000) RECOMMENDED VARCHAR2(4000) ACTIVITY_ID VARCHAR2(4000) RATINGS VARCHAR2(4000) SALES VARCHAR2(4000) SQL> CREATE TABLE movie_facts AS 2 SELECT CAST(cust_id AS VARCHAR2(12)) cust_id, 3 CAST(movie_id AS VARCHAR2(12)) movie_id, 4 CAST(genre_id AS VARCHAR(3)) genre_id, 5 TO_TIMESTAMP(time_id,'YYYY-MM-DD-HH24:MI:SS:FF') time, 6 TO_NUMBER(recommended) recommended, 7 TO_NUMBER(activity_id) activity_id, 8 TO_NUMBER(ratings) ratings, 9 TO_NUMBER(sales) sales 10 FROM movie_fact_ext_tab_txt; SQL> DESCRIBE movie_facts Name Null? Type ----------------------------------------- -------- ---------------------------- CUST_ID VARCHAR2(12) MOVIE_ID VARCHAR2(12) GENRE_ID VARCHAR2(3) TIME TIMESTAMP(9) RECOMMENDED NUMBER ACTIVITY NUMBER RATING NUMBER SALES NUMBER
Oracle SQL Connector for HDFSは、Oracle DatabaseシステムまたはHadoopクラスタで実行できます。
Hiveソースの場合は、Hadoopクラスタのノードにログインする必要があります。
テキストおよびデータ・ポンプ形式ファイルの場合は、Oracle DatabaseシステムまたはHadoopクラスタのノードにログインできます。
Oracle SQL Connector for HDFSでは、ログインするシステムのHADOOP_CLASSPATH
環境変数に情報を追加する必要があります。この追加設定は、システム管理者がアカウントの作成時に行う場合と、自分で行う必要がある場合があります。「Oracle Databaseシステムのユーザー・アカウントの設定」および「Hadoopクラスタのユーザー・アカウントの設定」を参照してください。
環境変数の設定:
HADOOP_CLASSPATH
にOracle SQL Connector for HDFSのJARファイルへのパスが含まれていることを確認します。
path/orahdfs-2.2.0/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-2.2.0"
関連項目: 両方のシステムにソフトウェアをインストールし、ユーザー・アカウントを設定する手順については、「Oracle SQL Connector for Hadoop Distributed File Systemの設定」を参照してください。Oracle SQL Connector for HDFSに関する既知の問題の詳細は、OSCH_HOME/doc/README.txtを参照してください。 |
Oracle SQL Connector for HDFSには、ExternalTable
というコマンドライン・ツールがあります。この項では、このツールの基本的な使用方法について説明します。データソース形式に固有のコマンド構文については、「外部表の作成」を参照してください。
ExternalTable
ツールでは、いくつかのプロパティの値を使用して次のタスクを行います。
外部表の作成
場所ファイルの移入
既存の外部表への場所ファイルの公開
場所ファイルのリスト
外部表の説明
これらのプロパティ値はXMLドキュメントに指定することも、コマンドラインで個々に指定することもできます。「Oracle SQL Connector for HDFSの構成」を参照してください。
ExternalTable
コマンドライン・ツールの完全な構文は次のようになります。
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -createTable [--noexecute] | -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-2.2.0/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ . . .
パラメータの説明
実行するコマンドで必要なプロパティを含むXML構成ファイルの名前を特定します。「Oracle SQL Connector for HDFSの構成」を参照してください。
特定のプロパティに値を割り当てます。
外部表定義を作成し、データのURIを外部表の場所ファイルに公開します。出力レポートに、外部表の作成に使用されるDDLと、場所ファイルの内容が示されます。
--noexecute
オプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、実行計画の詳細とエラーが表示されます。最初に、-createTable
コマンドを--noexecute
を指定して実行することをお薦めします。
既存の外部表の場所ファイルにデータのURIを公開します。新しいデータ・ファイルを追加した後にこのオプションを使用すると、既存の外部表からアクセスできるようになります。
--noexecute
オプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、計画されているSQL ALTER TABLE
コマンドと場所ファイルが表示されます。また、エラーも示されます。最初に、-publish
コマンドを--noexecute
を指定して実行することをお薦めします。
「HDFSデータ・パスの公開」を参照してください。
場所ファイルの内容をテキストで表示します。このコマンドで--details
オプションを指定すると、詳細なリストが示されます。「場所ファイルとは」を参照してください。
既存の外部表の表定義を出力します。「外部表の説明」を参照してください。
Oracle SQL Connector for HDFSで提供されるExternalTable
ツールを使用して、外部表を自動的に作成できます。
ExternalTable
ツールを使用して外部表を作成するには、使用するデータソースにあわせて次の手順を実行します。
ExternalTable -createTable
コマンドの実行を完了すると、外部表を使用する準備ができます。
外部表を手動で作成するには、「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 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.tableName
oracle.hadoop.exttab.defaultDirectory
oracle.hadoop.exttab.dataPaths
oracle.hadoop.exttab.sourceType=datapump
oracle.hadoop.connection.url
oracle.hadoop.connection.user
このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。
例2-2に、データ・ポンプ・ファイルの記述に使用可能なすべてのプロパティを含む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>
例2-3では、データ・ポンプ・ファイルを読み取るSALES_DP_XTAB
という外部表を作成します。
例2-3 データ・ポンプ形式ファイルの外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイルシステム・ディレクトリを作成します。
$ mkdir /scratch/sales_dp_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_dp_dir AS '/scratch/sales_dp_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_dp_dir TO scott;
外部表を作成します。
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は、ROW FORMAT DELIMITED
句とFILE FORMAT TEXTFILE
句を使用して定義される、パーティション化されていないHive表をサポートします。Hive管理表とHive外部表はどちらもサポートされます。
Hive表は、バケット化される場合とされない場合があります。Hive 0.7.1 (CDH3)のすべてのプリミティブ型とDECIMAL
およびTIMESTAMP
型の表の列がサポートされます。
Hive表のソースには、次のプロパティが必要です。
oracle.hadoop.exttab.tableName
oracle.hadoop.exttab.defaultDirectory
oracle.hadoop.exttab.sourceType=hive
oracle.hadoop.exttab.hive.tableName
oracle.hadoop.exttab.hive.databaseName
oracle.hadoop.connection.url
oracle.hadoop.connection.user
このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。
例2-4に、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.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> </configuration>
例2-5では、SALES_HIVE_XTAB
という外部表を作成して、Hive表からデータを読み取ります。この例では、XMLファイルではなく、コマンドラインのすべてのプロパティを定義しています。
例2-5 Hive表の外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイルシステム・ディレクトリを作成します。
$ mkdir /scratch/sales_hive_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_hive_dir AS '/scratch/sales_hive_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_hive_dir TO scott;
外部表を作成します。
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
Oracle SQL Connector for HDFSは、列の数、テキスト・デリミタおよびオプションで外部表の列名を指定する構成プロパティを使用して、デリミタ付きテキスト・ファイルの外部表定義を作成します。外部表のテキスト列はすべてVARCHAR2になります。列名を指定しない場合、デフォルトでC1からCnに設定されます。nは、oracle.hadoop.exttab.columnCount
プロパティで指定される列の数です。
デリミタ付きテキストのソースの場合、次のプロパティが必要です。
oracle.hadoop.exttab.tableName
oracle.hadoop.exttab.defaultDirectory
oracle.hadoop.exttab.dataPaths
oracle.hadoop.exttab.columnCount
またはoracle.hadoop.exttab.columnNames
oracle.hadoop.connection.url
oracle.hadoop.connection.user
このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。
デリミタ付きテキストのソースの場合、次のプロパティはオプションです。
oracle.hadoop.exttab.recordDelimiter
oracle.hadoop.exttab.fieldTerminator
oracle.hadoop.exttab.initialFieldEncloser
oracle.hadoop.exttab.trailingFieldEncloser
oracle.hadoop.exttab.locationFileCount
例2-6に、デリミタ付きテキスト・ファイルの記述に使用可能なすべてのプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してデータ・ファイルを記述し、不要なオプション・プロパティを削除します。XMLテンプレートの詳細は、「構成ファイルの作成」を参照してください。
例2-6 デリミタ付きテキスト・ファイルのプロパティを使用した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.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>
例2-7では、SALES_DT_XTAB
という外部表をデリミタ付きテキスト・ファイルから作成します。
例2-7 デリミタ付きテキスト・ファイルの外部表の定義
Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracle
ユーザー)としてログインし、ファイルシステム・ディレクトリを作成します。
$ mkdir /scratch/sales_dt_dir
データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。
$ sqlplus / as sysdba SQL> CREATE OR REPLACE DIRECTORY sales_dt_dir AS '/scratch/sales_dt_dir' SQL> GRANT READ, WRITE ON DIRECTORY sales_dt_dir TO scott;
外部表を作成します。
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に必要な変更をすべて行います。
ステップ2のDDLを実行して、Oracle Databaseに表定義を作成します。
ExternalTable -publish
コマンドを使用して、外部表の場所ファイルにデータのURIを公開します。
-createTable
コマンドは、Oracle Databaseにメタデータを作成し、HDFSのデータ・ファイルのUniversal Resource Identifier (URI)を場所ファイルに移入します。ただし、次のような場合、外部表の作成とは別のステップとしてURIを公開します。
既存の外部表に新しいデータを公開する場合。
ExternalTable
ツールを使用せずに、外部表を手動で作成した場合。
どちらの場合も、-publish
を指定したExternalTable
コマンドを使用して、HDFSのデータ・ファイルのURIを外部表の場所ファイルに移入できます。「場所ファイルの管理」を参照してください。
公開用のExternalTable構文
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -publish [--noexecute]
ExternalTableコマンドライン・ツールの例
例2-8では、HADOOP_CLASSPATH
を設定し、例2-3で作成された外部表にHDFSのデータ・パスを公開します。この環境変数の設定の詳細は、「システムへのOracle SQL Connector for HDFSの構成」を参照してください。
例2-8 データ・ポンプ形式ファイルの外部表への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.exttab.connection.user=scott -publish
この例の詳細は次のとおりです。
OSCH_HOME
は、Oracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスです。
SALES_DP_XTAB
は、例2-3で作成された外部表です。
hdfs:/user/scott/data/
は、HDFSデータの場所です。
@myhost:1521/orcl
は、データベース接続文字列です。
-listLocations
コマンドは、場所ファイルのメタデータと内容を表示できるデバッグおよび診断ユーティリティです。このコマンドを使用すると、Oracle外部表の場所ファイルの完全性を確認できます。
このコマンドを使用するには次のプロパティが必要です。
oracle.hadoop.exttab.tableName
JDBC接続プロパティ。「接続プロパティ」を参照してください。
-listLocationsのExternalTable構文
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -listLocations [--details]
-getDDL
コマンドは、既存の外部表の定義を出力するデバッグおよび診断ユーティリティです。このコマンドは、PL/SQL DBMS_METADATA
パッケージのセキュリティ・モデルに従います。このパッケージを使用すると、権限のないユーザーが各自のオブジェクトのメタデータを参照できます。
このコマンドを使用するには次のプロパティが必要です。
oracle.hadoop.exttab.tableName
JDBC接続プロパティ。「接続プロパティ」を参照してください。
-getDDLのExternalTable構文
hadoop jar OSCH_HOME/jlib/orahdfs.jar \ oracle.hadoop.exttab.ExternalTable \ [-conf config_file]... \ [-D property=value]... \ -getDDL
データへのアクセスに外部表が使用されるため、外部表のすべての機能と制限が適用されます。問合せは、自動ロード・バランシングと並列で実行されます。ただし、外部表では、更新、挿入および削除操作は許可されず、索引を作成できません。外部表にアクセスすると、表の完全スキャンが常に実行されます。
Oracle SQL Connector for HDFSでは、ORACLE_LOADER
アクセス・ドライバが使用されます。hdfs_streamプリプロセッサ・スクリプト(Oracle SQL Connector for HDFSに付属)は、入力データをORACLE_LOADER
が処理できる形式に変更します。
関連項目:
|
場所ファイルは、外部表のLOCATION句で指定されるファイルです。Oracle SQL Connector for HDFSは、データ・ファイルのUniversal Resource Identifier (URI)のみを含む場所ファイルを作成します。データ・ファイルには、HDFSに格納されるデータが含まれます。
外部表で並列処理を有効にするには、外部表のLOCATION句で複数のファイルを指定する必要があります。ファイルの数(並列度とも呼ばれる)は、表の読取り時に外部表で開始される子プロセスの数を決定します。子プロセスのアイドル状態を回避するには、並列度をデータ・ファイルの数と同程度に少なくすることが理想的です。
Oracle SQL Connector for HDFSのコマンドライン・ツールExternalTable
は、外部表の場所ファイルを管理します。場所ファイルの管理には、次のような操作があります。
名前の競合の確認後、データベース・ディレクトリに新しい場所ファイルを生成
データベース・ディレクトリの既存の場所ファイルを必要に応じて削除
データのURIを新しい場所ファイルに公開
新しい場所ファイルに一致するように外部表のLOCATION
句を変更
サポート対象データソースの場所ファイルの管理については、次のトピックで説明します。
データ・ポンプ・ファイルにアクセスするには、ORACLE_LOADER
アクセス・ドライバが必要です。このドライバでは、各場所ファイルがHDFSの単一のデータ・ポンプ・ファイルに対応する必要があります。空の場所ファイルは許可されないため、外部表の場所ファイルの数は、HDFSのデータ・ファイルの数と厳密に一致する必要があります。
Oracle SQL Connector for HDFSは、場所ファイルの管理を自動的に引き継ぎ、外部表の場所ファイルの数とHDFSのデータ・ポンプ・ファイルの数が同じになるようにします。
ORACLE_LOADER
アクセス・ドライバには、場所ファイルの数に関する制限はありません。各場所ファイルは、HDFSの1つ以上のデータ・ファイルに対応できます。外部表の場所ファイルの数は、oracle.hadoop.exttab.locationFileCount
構成プロパティで示されます。
「接続プロパティ」を参照してください。
-D
オプションを指定したコマンドラインでExternalTable
ツールに構成プロパティを渡すか、構成ファイルを作成してから-conf
オプションを指定したコマンドラインでそのファイルを渡すことができます。これらのオプションは、実行するコマンド(-createTable
、-publish
、-listLocations
または-getDDL
)の前に置く必要があります。
たとえば、次のコマンドでは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>
例2-9に構成ファイルを示します。これらのプロパティの説明については、「Oracle SQL Connector for HDFS構成プロパティ・リファレンス」を参照してください。
例2-9 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.exttab.dataCompressionCodec</name> <value>org.apache.hadoop.io.compress.DefaultCodec</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
コマンドライン・ツールで使用される構成プロパティの一覧を示します。プロパティは次のカテゴリに編成されます。
一般的なプロパティ
デリミタ付きテキスト・ファイルから作成される外部表の列の数。列名はC1、C2、... Cnのように設定されます。nはこのプロパティの値です。
このプロパティは、oracle.hadoop.exttab.columnNames
が設定される場合は無視されます。
oracle.hadoop.exttab.sourceType=text
の場合、-createTable
コマンドでこのプロパティを使用します。
デリミタ付きテキスト・ファイルから外部表を作成する場合、次のいずれかのプロパティを設定する必要があります。
oracle.hadoop.exttab.columnNames
oracle.hadoop.exttab.columnCount
デリミタ付きテキスト・ファイルから作成される外部表の列名のカンマ区切りリスト。このプロパティを設定しない場合、列名はC1、C2、... Cnのようになります。nはoracle.hadoop.exttab.columnCount
プロパティの値です。
列名はSQL識別子として読み取られます。引用符で囲まれていない値は大文字に変換され、二重引用符で囲まれている値は入力したとおりに使用されます。
oracle.hadoop.exttab.sourceType=text
の場合、-createTable
コマンドでこのプロパティを使用します。
デリミタ付きテキスト・ファイルから外部表を作成する場合、次のいずれかのプロパティを設定する必要があります。
oracle.hadoop.exttab.columnNames
oracle.hadoop.exttab.columnCount
データ・ファイルの圧縮に使用される圧縮コーデック・クラスの名前。このプロパティは、データ・ファイルを圧縮する場合に指定します。オプション。
このプロパティは、org.apache.hadoop.io.compress.CompressionCodec
インタフェースを実装する圧縮コーデックのクラス名を指定します。このコーデックはすべてのデータ・ファイルに適用されます。
Hadoopでは、次を含む複数の標準コーデックを使用できます。
デフォルト値: なし
完全修飾されたHDFSパスのカンマ区切りリスト。このパラメータを使用すると、パスの指定に特別なパターン一致文字を使用して、入力を制限できます。表2-1を参照してください。-createTable
および-public
コマンドでデータ・ポンプ・ファイルまたはデリミタ付きテキスト・ファイルを使用する場合、このプロパティは必須です。Hiveデータソースの場合、このプロパティは無視されます。
たとえば、/data/s2/
内のすべてのファイルと、/data/s7/
、/data/s8/
および/data/s9/
内のCSVファイルのみを選択するには、次の式を入力します。
/data/s2/,/data/s[7-9]/*.csv
外部表は、リストされたすべてのファイルおよびリストされたディレクトリ内のすべてのファイルに含まれるデータにアクセスします。これらのファイルで1つのデータセットを構成します。
データセットには、圧縮ファイルを含めることも、非圧縮ファイルを含めることもできますが、両方を含めることはできません。
表2-1 パターン一致文字
文字 | 説明 |
---|---|
? |
任意の1文字に一致します。 |
* |
0文字以上の文字に一致します。 |
[ |
文字セット{a, b, c}内の1文字に一致します。 |
[ |
文字の範囲{a...b}内の1文字に一致します。文字aは、b以下である必要があります。 |
[^ |
文字セットまたは範囲{a}外の1文字に一致します。カレット(^)は、左カッコの直後に付ける必要があります。 |
\ |
文字cの特別な意味を無効にします。バックスラッシュ(\)は、エスケープ文字です。 |
{ |
文字列セット{ab, cd}内の文字列に一致します。カンマの前にエスケープ文字(\)を付けて、パス区切りとしてのカンマの意味を無効にします。 |
{ |
文字列セット{ab, cde, cfh}内の文字列に一致します。カンマの前にエスケープ文字(\)を付けて、パス区切りとしてのカンマの意味を無効にします。 |
パス・フィルタ・クラス。Hiveデータソースの場合、このプロパティは無視されます。
Oracle SQL Connector for HDFは、デフォルトのフィルタを使用して、先頭がドットまたはアンダースコアの隠しファイルを除外します。このプロパティを使用して別のパス・フィルタ・クラスを指定する場合、デフォルトのフィルタの他にも使用するフィルタが機能します。そのため、使用するフィルタで受け入れられる表示ファイルのみが考慮されます。
Oracle外部表のデフォルトのディレクトリを指定します。このディレクトリは、ディレクトリ・オブジェクトを明示的に指定しない入力ファイルおよび出力ファイルのすべてに使用されます。
有効な値: 既存のデータベース・ディレクトリの名前
引用符で囲まれていない名前は大文字に変更されます。二重引用符で囲まれている名前は変更されないため、大文字と小文字を区別する場合は、二重引用符で囲まれた名前を使用します。一重引用符で囲まれている名前は、デフォルトのディレクトリ名に使用できません。
-createTable
コマンドではこのプロパティが必要です。
oracle.hadoop.exttab.sourceType=text
の場合、外部表のフィールドの終端文字を指定します。オプション。
デフォルト値: , (カンマ)
有効な値: 次のいずれかの形式の文字列
1つ以上の規則正しい出力可能文字(\u
による開始は不可)。たとえば、\tはタブを表します。
\u
HHHH
形式の1つ以上のエンコード文字。HHHH
は、UTF-16の文字をビッグ・エンディアンの16進で表したものです。たとえば、\u0009はタブを表します。16進数の桁は大文字と小文字を区別しません。
2つの形式を組み合せないでください。
入力データ表を含むHiveデータベースの名前。
oracle.hadoop.exttab.sourceType=hive
の場合、-createTable
コマンドでこのプロパティが必要です。
既存のHive表の名前。
oracle.hadoop.exttab.sourceType=hive
の場合、-createTable
コマンドでこのプロパティが必要です。
デリミタ付きテキスト・ファイルから作成される外部表の開始フィールド囲み文字を指定します。オプション。
デフォルト値: null。外部表定義に囲み文字は指定されません。
oracle.hadoop.exttab.sourceType=text
の場合、-createTable
コマンドでこのプロパティを使用します。
有効な値: 次のいずれかの形式の文字列
1つ以上の規則正しい出力可能文字(\u
による開始は不可)
\u
HHHH
形式の1つ以上のエンコード文字。HHHH
は、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。
2つの形式を組み合せないでください。
外部表の場所ファイルの目的の数を指定します。データ・ポンプ・ファイル以外のファイルにのみ適用可能です。
デフォルト値: 4
データ・ファイルがデータ・ポンプ形式の場合、このプロパティは無視されます。それ以外は、場所ファイルの数は次のいずれか少ない方になります。
データ・ファイルの数
このプロパティの値
少なくとも1つの場所ファイルが作成されます。
場所ファイルの数の詳細は、「並列処理の有効化」を参照してください。
ログ・ファイル、不正なファイルおよび廃棄ファイルが格納されるデータベース・ディレクトリを指定します。ファイル名は、外部表で使用されるデフォルトの値になります。たとえば、ログ・ファイルの名前は、表名の後に_%p.logが続きます。
これは、-createTable
コマンドのオプションのプロパティです。
ファイル名のデフォルトの拡張子を次に示します。
ログ・ファイル: log
不正なファイル: bad
廃棄ファイル: dsc
有効な値: 既存のOracleディレクトリ・オブジェクト名。
引用符で囲まれていない名前は大文字になります。引用符で囲まれている名前は変更されません。例2-2に、値が変換される場合の例を示します。
プリプロセッサのデータベース・ディレクトリを指定します。ファイルシステム・ディレクトリには、hdfs_streamスクリプトが含まれる必要があります。
デフォルト値: OSCH_BIN_PATH
プリプロセッサのディレクトリは、外部表のPREPROCESSOR
句で使用されます。
デリミタ付きテキスト・ファイルから作成される外部表のレコード・デリミタを指定します。オプション。
デフォルト値: \n
oracle.hadoop.exttab.sourceType=text
の場合、-createTable
コマンドでこのプロパティを使用します。
有効な値: 次のいずれかの形式の文字列
1つ以上の規則正しい出力可能文字(\u
による開始は不可)
\u
HHHH
形式の1つ以上のエンコード文字。HHHH
は、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。
2つの形式を組み合せないでください。
ソース・ファイルのタイプを指定します。
有効な値は、datapump
、hive
およびtext
です。
デフォルト値: text
-createTable
操作と-publish
操作の場合、このパラメータの値が必要です。
外部表のスキーマで修飾された名前。次の形式で表されます。
schemaName.tableName
schemaNameを省略すると、スキーマ名はデフォルトで接続ユーザー名に設定されます。
デフォルト値: なし
すべての操作で必須のプロパティ。
デリミタ付きテキスト・ファイルから作成される外部表の終了フィールド囲み文字を指定します。オプション。
デフォルト値: null。デフォルトでoracle.hadoop.exttab.initialFieldEncloser
の値に設定されます。
oracle.hadoop.exttab.sourceType=text
の場合、-createTable
コマンドでこのプロパティを使用します。
有効な値: 次のいずれかの形式の文字列
1つ以上の規則正しい出力可能文字(\u
による開始は不可)
\u
HHHH
形式の1つ以上のエンコード文字。HHHH
は、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。
2つの形式を組み合せないでください。
接続プロパティ
次のようなThinスタイル・サービス名形式のデータベース接続文字列を指定します。
jdbc:oracle:thin:@//host_name:port/service_name
サービス名が不明な場合は、特権ユーザーとして次のSQLコマンドを入力します。
SQL> show parameter service
Oracle Walletが外部パスワード・ストアとして構成されている場合、プロパティ値は、ドライバ接頭辞jdbc:oracle:thin:@
で始まる必要があり、db_connect_string
は、ウォレットに定義されている資格証明と完全に一致する必要があります。
このプロパティは、他のすべての接続プロパティより優先されます。
デフォルト値: 定義されていません。
有効な値: 1つの文字列
Oracle Databaseのログイン名。externalTable
ツールによって、パスワードの入力が求められます。Oracle Walletを外部パスワード・ストアとして使用する場合を除き、このパラメータは必須です。
デフォルト値: 定義されていません。
有効な値: 1つの文字列
tnsnames.oraファイルに定義されたTNSエントリ名を指定します。
このプロパティは、oracle.hadoop.connection.tns_admin
プロパティと一緒に使用されます。
デフォルト値: 定義されていません。
有効な値: 1つの文字列
tnsnames.oraファイルを格納するディレクトリを指定します。データベース接続文字列でTransparent Network Substrate (TNS)のエントリ名を使用するようにこのプロパティを定義します。TNSNamesをJDBC Thinドライバとともに使用する場合は、このプロパティまたはJavaのoracle.net.tns_admin
プロパティを設定する必要があります。両方のプロパティを設定した場合、このプロパティがoracle.net.tns_admin
より優先されます。
Oracle Walletを外部パスワード・ストアとして使用する場合、このプロパティを設定する必要があります。「oracle.hadoop.connection.wallet_location」を参照してください。
デフォルト値: Java oracle.net.tns_admin
システム・プロパティの値
有効な値: 1つの文字列
接続の資格証明が格納されるOracle Walletディレクトリへのファイル・パス。
デフォルト値: 定義されていません。
有効な値: 1つの文字列
Oracle Walletを外部パスワード・ストアとして使用する場合、次のパラメータを設定します。
oracle.hadoop.connection.wallet_location
oracle.hadoop.connection.url
またはoracle.hadoop.connection.tnsEntryName
oracle.hadoop.connection.tns_admin
大量のデータを処理する場合、並列処理はきわめて重要です。外部表を使用する場合、必ず次の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;