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をインストールして使用を開始するには、次のようにします。

  1. 『Oracle Big Data SQLインストレーション・ガイド』のCopy to HadoopおよびOracle Shell for Hadoop Loadersのインストール手順を実行します。
    インストレーション・ガイドで説明されているように、前提条件となるソフトウェアがHadoopクラスタ(Oracle Big Data Applianceまたは別のHadoopシステム上)とOracle Databaseサーバー(Oracle Exadata Database Machineなど)の両方にインストールされていることを確認します。
  2. Oracle Shell for Hadoop Loaders (OHSH)を起動し、HDFS内のデータ・ポンプ形式ファイルへOracle Database内のデータの1ステップの直接コピーまたは2ステップの段階的コピーを実行し、そのファイルからHive外部表を作成します。
    OHSHでは、directcopyがデフォルトで選択され、1ステップの直接コピーが実行されます。これは、2ステップの段階的コピーより速く、データベース・サーバー上にストレージを必要としません。しかし、2ステップの段階的コピーの実行が必要となる場合があります。
    • 複数のOracle Databaseソース表から列をコピーする場合。(1ステップの直接コピーでは、1つの表からのみデータをコピーします。)

    • TIMESTAMPTZまたはTIMESTAMPLTZの列をHiveにコピーする場合。

      タイムゾーンまたはタイム・オフセットに対応するデータ型がHiveには存在しないため、このような列は、Data Pumpファイルに手動でエクスポートする際にTIMESTAMPに型変換する必要があります。

    • ビューからデータをコピーする場合。ビューは、directcopyオプションではサポートされていません。

    手動によるステップを使用する2ステップの段階的コピーについては、「付録A 段階的コピーにCopy to Hadoopを使用するための手動によるステップを参照してください。

  3. 他のHive表と同じように、このHive表に問い合せます。

ヒント:

専門的な要件を備えたHadoopのパワー・ユーザーの場合は、直接コピーの手動オプションをお薦めします。付録Bの「直接コピーにCopy to Hadoopを使用するための手動によるステップ」を参照してください。

3.2.2.1 Copy to Hadoopの表アクセス要件

Copy to Hadoopを使用して表をコピーするには、Oracle Databaseユーザーが次の要件のいずれかを満たす必要があります。

  • ユーザーは、表の所有者であること。または、

  • ユーザーは、別のスキーマ内の表にアクセスし、次の権限を持っていること。

    • その表に対するSELECT権限。

    • select_catalog_role権限(データ・ディレクトリ・ビューに対するSELECT権限を提供)。

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の実行

  1. OHSHを起動します。(次の起動コマンドは、推奨に従ってOHSHパスをPATH変数に追加したことを前提としています。)

    $ ohsh
    ohsh>
  2. 次のリソースを作成します。

    • 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>”
  3. 次の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操作は、次の操作を実行します。

  1. 指定したHive表(および関連するData Pumpファイル)を削除します(この名前の表がすでに存在する場合)。

    注意:

    create or replaceとは異なり、create操作は失敗し、Hive表および関連するData Pumpファイルがすでに存在する場合はエラーを返します。

  2. 所定の名前を使用して、新しい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コマンドを使用して、次の手順を自動的に実行します。

  1. Oracleのソース表の内容をローカル・ディスク上のデータ・ポンプ形式ファイルにエクスポートします。

  2. データ・ポンプ形式ファイルをHDFSに移動します。

  3. データ・ポンプ形式ファイルにマップされる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の列をロードするため。

「付録A 段階的コピーにCopy to Hadoopを使用するための手動によるステップ」を参照してください。

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で使用できます。  

Sparkインストールは、Hiveと連携するように構成する必要があります。Copy to Hadoopのjarを指定して、Sparkシェルを起動します。
prompt> spark-shell --jars orahivedp.jar,ojdbc7.jar,oraloader.jar,orai18n.jar,ora-hadoop-common.jar
SparkシェルでsqlContextの型を確認します。
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のインストール」を参照してください。