3.2 Copy to Hadoopの使用
Copy to Hadoopを使用してOracle Database表をHadoopにコピーする方法について説明します。
3.2.1 Copy to Hadoopとは
Oracle Big Data SQLには、Oracle Copy to Hadoopユーティリティが含まれています。このユーティリティを使用すると、Oracleデータの識別とHadoop Distributed File Systemへのコピーが簡単になります。コマンドライン・インタフェースのOracle Shell for Hadoop Loadersを通してアクセスできます。
Copy to HadoopによってHadoopクラスタにエクスポートされたデータは、Oracle Data Pump形式で格納されます。Oracle Data Pumpファイルは、HiveまたはBig Data SQLによって問い合せることができます。Oracle Data Pump形式により、次のようにBig Data SQLによる問合せが最適化されます。
-
データはOracleデータ型として格納される – データ型変換がなくなる
-
データが直接問い合される – Java SerDesに関連するオーバーヘッドを必要としない
データ・ポンプ形式ファイルがHDFS内に存在すると、Apache Hiveを使用してデータを問い合せることができます。Hiveは、Oracle Databaseにアクセスせずにローカルにデータを処理できます。Oracle表が変更されると、Hadoopのコピーをリフレッシュできます。Copy to Hadoopは、比較的静的であり、頻繁にリフレッシュする必要がないOracle表に主に役立ちます。
Copy to Hadoopは、Oracle Big Data SQLでライセンス供与されます。このユーティリティを使用するには、Oracle Big Data SQLのライセンスが必要です。
3.2.2 Copy to Hadoopの使用の概要
Copy to Hadoopをインストールして使用を開始するには、次のようにします。
ヒント:
専門的な要件を備えたHadoopのパワー・ユーザーの場合は、直接コピーの手動オプションをお薦めします。付録Bの「直接コピーにCopy to Hadoopを使用するための手動によるステップ」を参照してください。3.2.3 Oracle Shell for Hadoop LoadersのCopy to Hadoopとの使用
3.2.3.1 Oracle Shell for Hadoop Loadersの概要
Oracle Shell for Hadoop Loadersとは
Oracle Shell for Hadoop Loaders (OHSH)は、Oracle Loader for Apache Hadoop、Oracle SQL Connector for HDFSおよびCopy to Hadoopに使いやすいコマンドライン・インタフェースを提供するヘルパー・シェルです。 コマンドライン・リコール、履歴、親プロセスからの環境変数の継承、 新規または既存の変数の設定、およびコマンドラインでの環境の取替えの実行などの基本的なシェル機能があります。
Oracle Shell for Hadoop Loadersの中心的な機能には次のものが含まれます。
-
Oracle Shell for Hadoop Loadersが対話してロード・タスクを実行する名前付き外部リソースの定義。
-
ロード操作用のデフォルト値の設定。
-
ロード・コマンドの実行。
-
単純な事前および事後ロード・タスクの、オペレーティング・システム、HDFS、HiveおよびOracleへの委任。 これらのタスクには、ロードされるデータの表示およびロード後のターゲット表でのデータの表示が含まれます。
関連項目:
OHSHキットのexamplesディレクトリには、Oracle Shell for Hadoop Loadersを使用してリソースを定義したり、データをロードする多くの例が含まれています。 OHSHロード・メソッドを実行する方法の例と説明の詳細は、<OHSH_KIT>/examples.zip
を解凍し、<OHSH_KIT>/examples/README.txt
を参照してください。
3.2.4 例によるCopy to Hadoop
3.2.4.1 最初の検討: HiveへのOracle表のロードおよびHadoopでのデータの格納
次に示す一連の例は、Copy to Hadoopを使用して、Oracle表からデータをロードし、Hadoopにデータを格納し、OHSHシェル内で関連操作を実行する方法を示しています。これは、OHSHとCopy to Hadoopがすでにインストールおよび構成されていることを前提としています。
例で示す内容
これらの例では、次のタスクを示します。
-
OHSHセッションを開始し、Copy to Hadoopに必要なリソースを作成します。
-
Copy to Hadoopを使用して、選択したOracle Database表からHadoopの新しいHive表にデータをコピーします(作成したリソースを使用します)。
-
load
操作を使用して、最初の例で作成したHive表にデータを追加します。 -
create or replace
操作を使用して、Hive表を削除し、別のレコード・セットを持つ新しい表で置き換えます。 -
Hive表およびOracle Database表のデータを問い合せます。
-
データを他の形式に変換します
ヒント:
Oracle Databaseで小規模な表を選択または作成し、これらの手順を実行することをお薦めします。OHSHの起動、リソースの作成およびCopy to Hadoopの実行
-
OHSHを起動します。(次の起動コマンドは、推奨に従ってOHSHパスをPATH変数に追加したことを前提としています。)
$ ohsh ohsh>
-
次のリソースを作成します。
-
SQL*Plusリソース。
ohsh> create sqlplus resource sql0 connectid=”<database_connection_url>”
-
JDBCリソース。
ohsh> create jdbc resource jdbc0 connectid=”<database_connection_url>”
注意:
この例に示すHiveアクセスの場合は、デフォルトのhive0
リソースのみが必要です。このリソースは、デフォルトのHiveデータベースに接続するようにすでに構成されています。追加のHiveリソースが必要な場合は、次のように作成します。ohsh> create hive resource hive_mydatabase connectionurl=”jdbc:hive2:///<Hive_database_name>”
-
-
次の
create hive table
コマンドにOracle Database表名を含めて、次のコマンドを実行します。このコマンドは、Copy to Hadoopのdirectcopy
メソッドを使用します。directcopy
はデフォルト・モードであり、実際には明示的に指定する必要はありません。ohsh> create hive table hive0:<new_Hive_table_name> from oracle table jdbc0:<Oracle_Database_table_name> from oracle table jdbc0:<Oracle_Database_table_name> using directcopy
Oracle表データは、HadoopにHive表として格納されるようになりました。
Hive表へのデータの追加
既存のHive表にデータを追加するには、OHSHのload
メソッドを使用します。
元のOracle表に時間フィールドがDD-MM-YYという書式で含まれており、対応するHive表を作成したCopy to Hadoop操作後に多数の日次レコードが追加されたとします。
load
を使用して、これらの新規レコードを既存のHive表に追加します。
ohsh> load hive table hive0:<Hive_table_name> from oracle table jdbc0:<Oracle_Database_table_name> where “(time >= ’01-FEB-18’)”
OHSHのcreate or replaceの使用
OHSHのcreate or replace
操作は、次の操作を実行します。
-
指定したHive表(および関連するData Pumpファイル)を削除します(この名前の表がすでに存在する場合)。
注意:
create or replace
とは異なり、create
操作は失敗し、Hive表および関連するData Pumpファイルがすでに存在する場合はエラーを返します。 -
所定の名前を使用して、新しいHive表を作成します。
いくつかのレコードが元のOracle Database表から削除され、Hive表をOracle Database表の新しい状態で再配置する必要があるものとします。Hiveは、レコードに対する更新操作や削除操作をサポートしていませんが、OHSHのcreate or replace
操作で同じ最終結果を得ることができます。
ohsh> create or replace hive table hive0:<new_hive_table_name> from oracle table jdbc0:<Oracle_Database_table_name>
注意:
Copy to HadoopでHadoopにコピーしたデータはHiveから問い合せることができますが、データ自体は実際にはOracle Data Pumpファイルとして格納されています。Hiveは、Data Pumpファイルのみを指します。Hive表の問合せ
OHSHでHiveリソースを呼び出して、HiveQLコマンドを実行できます。同様に、SQL*Plusリソースを呼び出して、SQLコマンドを実行できます。たとえば、次の2つの問合せは、元のOracle Database表と派生のHive表を比較します。
ohsh> %sql0 select count(*) from <Oracle_Database_table_name>
ohsh> %hive0 select count(*) from <Hive_table_name>
ParquetやORCなどその他の形式でのデータの格納
デフォルトでは、Copy to HadoopはData Pumpファイルを出力します。create
操作では、stored as
構文を使用して宛先形式をParquetまたはORCに変更できます。
ohsh> %hive0 create table <Hive_table_name_parquet> stored as parquet as select * from <Hive_table_name>
この例では、Data Pumpファイルを作成しますが、それをすぐにParquet形式にコピーしています。(元のData Pumpファイルは削除されません。)
3.2.4.2 Copy to Hadoop製品キットでの例の使用
OHSH製品キットでは、OHSHのインストール先のパスにexamples
ディレクトリが作成されます。この項では、キットのいくつかの例について説明します。
3.2.4.2.1 デフォルトのコピー方法でのCopy to Hadoopの使用
Copy to Hadoop製品キットの次の例は、データをロードするデフォルトの方法でCopy to Hadoopを使用する方法を示しています。このコードは、キットがインストールされているexamplesディレクトリ(<OHSH_KIT>/examples
)にあります。
次の例では、OHSHとCopy to Hadoopがインストールされ構成されていることが前提となっています。
例3-1 createreplace_directcopy.ohsh
このスクリプトでは、create or replace
操作を使用して、Oracle表OHSH_CP2HADOOP_FIVDTI
からcp2hadoop_fivdti
というHive外部表を作成します。その後、10000行のHive表がロードされます。デフォルトのロード方法であるdirectcopy
を使用してマップ・ジョブをHadoopに対して実行し、Oracle表を入力スプリットに分割します。この結果作成されるHive外部表には、すべての分割が含まれます。
create or replace hive table hive0:cp2hadoop_fivdti \
from oracle table jdbc0:ohsh_cp2hadoop_fivdti using directcopy
次の例と後続のコード・サンプルでは、olhp
がユーザー定義のJDBCリソースです。
例3-2 load_directcopy.ohsh
load_directcopy.ohsh
スクリプトは、createreplace_directcopy.ohsh
で作成したHive表にさらに30行をロードする方法を示しています。このスクリプトでは、directcopy
メソッドも使用しています。
load hive table hive0:cp2hadoop_fivdti from oracle table jdbc0:ohsh_cp2hadoop_fivdti \
using directcopy where "(i7 < 30)";
ヒント:
HadoopのストレージをデフォルトのData Pump形式からParquet形式またはORC形式に変換することもできます。次に例を示します。%hive0 create table cp2hadoop_fivdti_parquet stored as parquet as select * from cp2hadoop_fivdti
元のData Pumpファイルは削除されません。
3.2.4.2.2 段階的コピー方法でのCopy to Hadoopの使用
次の最初の例は、Oracle Shell for Hadoop Loaders (OHSH)をCopy to Hadoopとともに使用して、Oracle DatabaseからHadoopへの2ステップの段階的コピーを実行する方法を示しています。stage
メソッドは、directcopy
メソッドの代替方法です。
2番目の例は、同じ表にさらに行をロードする方法を示しています。ここでも、stageメソッドを使用しています。
どちらの例でも、OHSHおよびCopy to Hadoopがインストールされて構成されていることと、OHSHインストールのexamples
ディレクトリにあるREADME.txt
の説明に従って例が構成されていることを前提としています。次のスクリプトの他、多くのスクリプトもexamples
ディレクトリで入手できます。
例3-3 createreplace_stage.ohsh
このスクリプトでは、create or replace
を使用して、Oracle表OHSH_CP2HADOOP_FIVDTI
からcp2hadoop_fivdti
というHive表を作成します。stage
コマンドを使用して、次の手順を自動的に実行します。
-
Oracleのソース表の内容をローカル・ディスク上のデータ・ポンプ形式ファイルにエクスポートします。
-
データ・ポンプ形式ファイルをHDFSに移動します。
-
データ・ポンプ形式ファイルにマップされるHive外部表をHDFSに作成します。
create or replace hive table hive0:cp2hadoop_fivdti \
from oracle table jdbc0:ohsh_cp2hadoop_fivdti using stage
前述のコマンド(および次のコード例)では、olhp
がユーザー定義のJDBCリソースです。
例3-4 load_stage.ohsh
load_stage.ohsh
スクリプトは、stage
メソッドを使用して、createreplace_stage.ohsh
で作成したHive表にさらに30行をロードする方法を示しています。
load hive table hive0:cp2hadoop_fivdti from oracle table jdbc0:ohsh_cp2hadoop_fivdti \
using stage where "(i7 < 30)";
手動オプション
createreplace_stage.ohsh
およびload_stage.ohsh
のサンプル・スクリプトで示されている2ステップ方式では、段階的コピーの実行に必要なタスクの一部を自動化します。しかし、ステップを手動で実行するには次のような理由があります。
-
複数のOracle Databaseソース表から列をロードするため。
-
型TIMESTAMPZまたはTIMESTAMPLTZの列をロードするため。
3.2.5 Hiveのデータの問合せ
次のOHSH
コマンドは、Oracle表からコピーした後のHive表の行数を表示します。
%hive0 select count(*) from cp2hadoop_fivdti;
3.2.6 Copy to Hadoopでの列マッピングおよびデータ型変換
Copy to Hadoopでの列マッピングおよびデータ型変換に関するヘルプを参照してください。
3.2.6.1 列マッピングの概要
Hive表の列は、データ・ポンプ・ファイルに格納されたメタデータで提供されるOracle列と同じ名前が自動的に設定されます。Hive表のユーザーが指定した列定義はいずれも無視されます。
3.2.6.2 データ型変換について
Copy to Hadoopは、Oracle表のデータを適切なHiveデータ型に自動的に変換します。表3-2に、Oracleデータ型とHiveデータ型の間のデフォルトのマッピングを示します。
表3-2 Oracleデータ型からHiveデータ型への変換
Oracleデータ型 | Hiveデータ型 |
---|---|
NUMBER |
スケールが0、精度が10未満の場合はINT スケールが0、精度が19未満の場合はBIGINT スケールが0より大きく、精度が19より大きい場合はDECIMAL |
CLOB NCLOB |
STRING |
INTERVALYM INTERVALDS |
STRING |
BINARY_DOUBLE |
DOUBLE |
BINARY_FLOAT |
FLOAT |
BLOB |
BINARY |
ROWID UROWID |
BINARY |
RAW |
BINARY |
CHAR NCHAR |
CHAR |
VARCHAR2 NVARCHAR2 |
VARCHAR |
DATE |
TIMESTAMP |
TIMESTAMP |
TIMESTAMP |
TIMESTAMPTZ TIMESTAMPLTZ脚注1 |
サポート対象外 |
脚注1
TIMESTAMPTZおよびTIMESTAMPLTZのデータをHiveにコピーするには、「付録A 段階的コピーにCopy to Hadoopを使用するための手動によるステップ」のステップを実行します。データ・ポンプ・ファイルにエクスポートする場合は、列をTIMESTAMPに型変換します。
3.2.7 Sparkの使用
Copy to HadoopによってエクスポートされたOracle Data Pumpファイルは、Sparkで使用できます。
prompt> spark-shell --jars orahivedp.jar,ojdbc7.jar,oraloader.jar,orai18n.jar,ora-hadoop-common.jar
scala> sqlContext
出力は次のようになります。 res0:org.apache.spark.sql.SQLContext = org.apache.spark.sql.hive.HiveContext@66ad7167
デフォルトのsqlContextがHiveContextでない場合は、これを作成します。scala> val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
複数のOracle Data Pumpファイルに対して1つのHive外部表を指すデータ・フレームdf
を作成できるようになります。scala> val df = sqlContext.table("<hive external table>") <hive external table>:
org.apache.spark.sql.DataFrame = [ <column names> ]
これで、データ・フレームを介してデータにアクセスできます。scala> df.count
scala> df.head
Hive外部表が作成されておらず、Copy to Hadoopによって作成されたOracle Data Pumpファイルしかない場合、Spark内からHive外部表を作成できます。scala> sqlContext.sql(“CREATE EXTERNAL TABLE <hive external table> ROW FORMAT SERDE
'oracle.hadoop.hive.datapump.DPSerDe' STORED AS INPUTFORMAT
'oracle.hadoop.hive.datapump.DPInputFormat' OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION
'/user/oracle/oracle_warehouse/<hive database name>'")
3.2.8 Copy to Hadoopと連携したOracle SQL Developerの使用
Oracle SQL Developerは無償のGUIベースの開発環境で、Copy to Hadoopなど、Oracle Big Data Connectorsを操作するための使いやすいツールを提供します。
Oracle SQL Developerを使用して、データをコピーして新しいHive表を作成したり、またはCopy to Hadoopによって作成された既存のHive外部表にデータを追加したりできます。GUIで、Hiveスキーマの下の「Tables」アイコンを右クリックして、Oracle SQL DeveloperでCopy to Hadoopを起動できます。その後、既存のHive外部表のアイコンを右クリックしてそのHive表を追加できます。
Oracle SQL Developerの入手場所および基本的なインストール方法の手順は、このマニュアルの「Oracle SQL Developerのインストール」を参照してください。