この章では、Oracle Direct Connector for Hadoop Distributed File System (Oracle Direct Connector)を使用して、Hadoop分散ファイルシステム(HDFS)とOracle Databaseとの間のデータ・アクセスを簡単にする方法について説明します。
この章のトピックは、次のとおりです。
Oracle Direct Connectorを使用すると、外部表を利用してOracle DatabaseからHDFSに読取りアクセスできます。
外部表は、データベース外のデータの場所を識別するOracle Databaseオブジェクトです。Oracle Databaseは、外部表の作成時に指定されたメタデータを使用してデータにアクセスします。外部表への問合せによって、ユーザーは、データがデータベースの表に格納されている場合と同様に、HDFSに格納されているデータにアクセスできます。外部表は、データベースのロード時にデータをステージングして変換するために使用されることが多くあります。
次のような場合にOracle Direct Connectorを使用します。
HDFSファイルに格納されているデータへのアクセス
Oracle Loader for Hadoopによって生成されたCSVファイルおよびデータ・ポンプ・ファイルへのアクセス
Oracle Data Integratorによって抽出および変換されたデータのロード
Oracle Direct Connectorでは、ORACLE_LOADER
アクセス・ドライバが使用されます。
注意: Oracle Loader for Hadoopによって生成されたデータ・ポンプ・ファイルにアクセスする前に、Oracle Direct Connectorにデータベース・パッチを適用する必要があります。このパッチをダウンロードするには、http://support.oracle.com に移動し、Oracle Bug#13079417を検索します。 |
関連項目:
|
HDFS用の外部表は、SQLのCREATE TABLE
コマンドで次のPREPROCESSOR
句を使用する以外は、他の外部表と同様に作成します。
PREPROCESSOR "HDFS_BIN_PATH:hdfs_stream"
HDFS_BIN_PATH
は、Oracle Direct Connectorがインストールされているbin
サブディレクトリの名前です。「Oracle Direct Connectorのインストール」を参照してください。
データ・ポンプ・ファイルにアクセスするには、次のアクセス・パラメータも指定する必要があります。
EXTERNAL VARIABLE DATA
HDFS用の外部表を作成するための基本的なSQL構文は、次のとおりです。
CREATE TABLE [schema.]table ( column datatype, ... ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY directory ACCESS PARAMETERS ( PREPROCESSOR "HDFS_BIN_PATH:hdfs_stream" access_parameters... ) LOCATION (file1,file2...) );
作成する外部表の名前。
表内の列の名前。
列のデータ型。ORACLE_LOADER
でサポートされているものに限ります。データ型変換が自動的に行われます。
Oracle Direct Connectorが、外部表をサポートするファイル(場所ファイル、不正レコート・ファイル、ログ・ファイルなど)を作成するデータベース・ディレクトリの名前。これらのファイルにデータが格納されるディレクトリを使用しないでください。
ORACLE_LOADER
access_parameters
句の追加従属句(レコードやフィールド書式設定など)。
HDFS内のデータの場所を識別する場所ファイルの名前。CSVファイルの場合、並列度がファイルの数によって制限されるため、2つ以上のファイル名を指定します。データ・ポンプ・ファイルの場合、データ・ポンプ・ファイルごとに1つの場所ファイルを指定します。
Oracle Direct Connectorで、これらのファイルはデフォルト・ディレクトリに作成されます。ファイルがすでに存在している場合は、上書きされます。
他のタイプの外部表の場合、場所ファイルにデータが含まれますが、Oracle Direct ConnectorはHDFSにデータを保持します。
外部表を作成したら、この表に問い合せて、プロセッサ・スクリプトが適切に構成されていることを確認します。
SELECT count(*) FROM external_table;
問合せで行もエラーも返されない場合、続行できます。
例2-1では、SCOTT
スキーマにSALES_HDFS_EXT_TAB
という名前の外部表を作成します。
例2-1 HDFS用の外部表の定義
CREATE TABLE "SCOTT"."SALES_HDFS_EXT_TAB" ( "PROD_ID" NUMBER(6), "CUST_ID" NUMBER, "TIME_ID" DATE, "CHANNEL_ID" CHAR(1), "PROMO_ID" NUMBER(6), "QUANTITY_SOLD" NUMBER(3), "AMOUNT_SOLD" NUMBER(10,2) ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY "SALES_EXT_DIR" ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY ',' ( "PROD_ID" DECIMAL EXTERNAL, . . . "TIME_ID" CHAR DATE_FORMAT TIMESTAMP MASK "...", . . . ) PREPROCESSOR "HDFS_BIN_PATH:hdfs_stream" ) LOCATION ( 'sales1','sale2','sales3') );
前述の外部表の作成手順では、Oracle Databaseにメタデータを作成しただけです。前述のとおり、場所ファイルには通常データ値が格納されます。ただし、このケースでは、場所ファイルは空です。Oracle Direct ConnectorのExternalTable
コマンドライン・ツールを実行すると、HDFS内のデータ・ファイルのUniversal Resource Identifier (URI)が場所ファイルに移入されます。ユーザーが外部表に対して問合せを行うと、Oracle Direct Connectorプリプロセッサは、その情報を使用してHDFSでデータを検索し、データベースに送ります。
ExternalTableコマンドでは、プロパティの値を使用して場所ファイルに移入します。これらのプロパティ値はXMLドキュメントに指定することも、コマンドで個々に指定することもできます。
ExternalTable
コマンドの構文は、次のとおりです。
bin/hadoop jar orahdfs.jar oracle.hadoop.hdfs.exttab.ExternalTable [-conf config_file | -D property=value] -publish [-noexecute]
場所ファイルへの移入に必要なプロパティを含むXML構成ファイルの名前を識別します。「構成ファイルの作成」を参照してください。
特定のプロパティに値を割り当てます。
実行計画を生成しますが、アクションは実行しません。
構成ファイルは、次のような非常に単純な構造のXMLドキュメントです。
<?xml version="1.0"?> <configuration> <property> <name>property</name> <value>value</value> </property> . . . </configuration>
これらのプロパティの詳細は、「構成プロパティ」を参照してください。
例2-2に、構成ファイルを示します。
例2-2 Oracle Direct Connectorの構成ファイル
<?xml version="1.0"?> <configuration> <property> <name>oracle.hadoop.hdfs.exttab.tableName</name> <value>SH.SALES_EXT_DIR</value> </property> <property> <name>oracle.hadoop.hdfs.exttab.datasetPaths</name> <value>/data/s1/*.csv,/data/s2/*.csv</value> </property> <property> <name>oracle.hadoop.hdfs.exttab.datasetCompressionCodec</name> <value>org.apache.hadoop.io.compress.DefaultCodec</value> </property> <property> <name>oracle.hadoop.hdfs.exttab.connection.url</name> <value> jdbc:oracle:thin:@example.com:1521/example.example.com </value> </property> <property> <name>oracle.hadoop.hdfs.exttab.connection.user</name> <value>SH</value> </property> </configuration>
ExternalTableコマンドでHDFS内のデータ・ファイルへのリンクの作成に使用される構成プロパティを、次に示します。次のプロパティは必須です。
oracle.hadoop.hdfs.exttab.connection.url oracle.hadoop.hdfs.exttab.datasetPaths oracle.hadoop.hdfs.exttab.tableName
データベース接続文字列のURL。このプロパティは、他のすべての接続プロパティをオーバーライドします。接続するデータベース・ユーザーは、「Oracle Direct Connectorに対するユーザー・アクセス権の付与」に記載されている権限を持っている必要があります。必須。
ウォレットを使用
Oracle walletを外部パスワード・ストアとして使用する場合、プロパティ値は次の形式である必要があります。
jdbc:oracle:thin:@db_connect_string
db_connect_string
は、ウォレット内の資格証明と完全に一致する必要があります。
次の例では、Oracle Net Servicesの構文を使用します。
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=my_db_service_name)))
次の例では、TNSNAMES
エントリを使用します。
jdbc:oracle:thin:@my_tns_entry
「oracle.hadoop.hdfs.exttab.connection.wallet_location」も参照してください。
ウォレットを使用しない
Oracle walletを使用しない場合、次のURL接続方法のいずれかを使用します。
Thin接続:
jdbc:oracle:thin:@//myhost:1521/my_db_service_name jdbc:oracle:thin:username/password@//myhost:1521/my_db_service_name
Oracle Net Services:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521))) (CONNECT_DATA=(SERVICE_NAME=my_db_service_name)))
TNSエントリ名:
jdbc:oracle:thin:@myTNSEntryName
URLにユーザー名とパスワードが含まれない場合、次のパラメータを設定します。
Oracle Databaseユーザー名。
sqlnet.ora
やtnsnames.ora
などのSQL*Net構成ファイルが含まれるディレクトリへのファイル・パス。デフォルトでは、TNS_ADMIN
環境変数の値がこのプロパティに使用されます。
データベース接続文字列でTNSエントリ名を使用する場合、このプロパティを定義します。
tnsnames.ora
ファイルに定義されたTNSエントリ名。このプロパティは、oracle.hadoop.hdfs.exttab.connection.tns_adminとともに使用されます。
org.apache.hadoop.io.compress.CompressionCodec
インタフェースを実装する圧縮コーデックのクラス名。外部表用のデータを復元するには、コーデックの復元クラスをプリプロセッサ・スクリプトで使用します。このコーデックは、データ・セット全体に適用されます。
データ・セットに圧縮ファイルが含まれる場合、このプロパティを指定します。
org.apache.hadoop.fs.PathFilter
インタフェースを実装するパス・フィルタのクラス名。データ・セット内のパスは、このフィルタ・クラスで受け入れられる場合にのみ選択されます。
完全修飾されたHDFSパスのカンマ区切りのリスト。このパラメータを使用すると、パスの指定に特別なパターン一致文字を使用して、入力を制限できます。表2-1を参照してください。必須。
たとえば、/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}内の文字列に一致します。カンマの前にエスケープ文字(\)を付けて、パス区切りとしてのカンマの意味を無効にします。 |
接続情報が格納されるOracle walletへのファイル・パス。Oracle walletを外部パスワード・ストアとして使用する場合、次の追加パラメータを設定します。
URL接続の場合:
TNS名の場合:
スキーマで修飾された次の形式の外部表の名前
schemaName.tableName
Oracle Direct Connector用の外部表の作成の詳細は、「HDFS用の外部表の作成」を参照してください。必須。
大量のデータを扱う場合、並列処理が非常に重要です。外部表を使用する場合、必ず次のSQLコマンドを使用して並列問合せを有効にします。
ALTER SESSION ENABLE PARALLEL QUERY;
Oracle Direct Connectorによって作成された外部ファイルからOracle Databaseにデータをロードする前に、並列DDLを有効にします。
ALTER SESSION ENABLE PARALLEL DDL;
既存のデータベース表にデータを挿入する前に、次のSQLコマンドを使用して並列DMLを有効にします。
ALTER SESSION ENABLE PARALLEL DML;