3 HadoopへのOracleデータの格納

Copy to HadoopおよびHDFS内のOracle Database表は、Oracle Database表をHadoopクラスタ上のHDFSファイル・システムにオフロードするための2つのOracle Big Data SQLリソースです。

次の表に、この2つのツールを比較します。

表3-1 Copy to HadoopとHDFS内のOracle表領域の比較

Copy to Hadoop HDFS内のOracle表領域
Oracle Database表をHDFS内に格納されているOracle Data Pumpファイルにコピーします。 Oracle Databaseの表またはパーティションは、元のOracle内部形式でHDFSの表領域内に格納されます。
Hive外部表を通したアクセスと、Oracle Big Data SQLによるデータベースからのアクセス。 元のOracle Database表からの直接アクセス。外部表は不要です。
データは、Hadoopエコシステムの他のプロセスで(Hiveを通して)使用することも、Oracle Databaseで(Oracle Big Data SQLを通して)使用することも可能です。 データは、Oracle Databaseでのみ直接使用できます。データは、Hadoopの他のプロセスでアクセスできません。

3.1 Copy to Hadoopの使用方法

Copy to Hadoopを使用してOracle Database表をHadoopにコピーする方法について説明します。

3.1.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.1.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.1.2.1 Copy to Hadoopの表アクセス要件

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

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

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

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

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

3.1.3 Oracle Shell for Hadoop LoadersのCopy to Hadoopとの使用

3.1.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.1.4 例によるCopy to Hadoop

3.1.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.1.4.2 Copy to Hadoop製品キットでの例の使用

OHSH製品キットでは、OHSHのインストール先のパスにexamplesディレクトリが作成されます。この項では、キットのいくつかの例について説明します。

3.1.4.2.1 デフォルトのコピー方法でのCopy to Hadoopの使用

これは、OHSHとCopy to Hadoopがすでにインストールおよび構成されていることを前提としています。

Copy to Hadoop製品キットの次の例は、データをロードするデフォルトの方法でCopy to Hadoopを使用する方法を示しています。このコードは、キットがインストールされているexamplesディレクトリ(<OHSH_KIT>/examples)にあります。

例3-1 createreplace_directcopy.ohsh

このスクリプトでは、create or replace操作を使用して、Oracle表のFIVDTIからcp2hadoop_fivdtiというHive外部表を作成します。その後、10000行のHive表がロードされます。デフォルトのロード方法であるdirectcopyを使用してマップ・ジョブをHadoopに対して実行し、Oracle表を入力スプリットに分割します。この結果作成されるHive外部表には、すべての分割が含まれます。

create or replace hive table hive0:cp2hadoop_fivdti \ 
from oracle table olhp: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 olhp: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.1.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表のFIVDTIからcp2hadoop_fivdtiというHive表を作成します。stageコマンドを使用して、次の手順を自動的に実行します。

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

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

  3. データ・ポンプ形式ファイルにマップされるHive外部表をHDFSに作成します。

create or replace hive table hive0:cp2hadoop_fivdti \
from oracle table olhp: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 olhp:fivdti \
using stage where "(i7 < 30)";

手動オプション

createreplace_stage.ohshおよびload_stage.ohshのサンプル・スクリプトで示されている2ステップ方式では、段階的コピーの実行に必要なタスクの一部を自動化します。しかし、ステップを手動で実行するには次のような理由があります。

  • 複数のOracle Databaseソース表から列をロードするため。

  • TIMESTAMPZまたはTIMESTAMPLTZの列をロードするため。

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

3.1.5 Hiveのデータの問合せ

次のOHSHコマンドは、Oracle表からコピーした後のHive表の行数を表示します。

%hive0 select count(*) from cp2hadoop_fivdti;

3.1.6 Copy to Hadoopでの列マッピングおよびデータ型変換

Copy to Hadoopでの列マッピングおよびデータ型変換に関するヘルプを参照してください。

3.1.6.1 列マッピングの概要

Hive表の列は、データ・ポンプ・ファイルに格納されたメタデータで提供されるOracle列と同じ名前が自動的に設定されます。Hive表のユーザーが指定した列定義はいずれも無視されます。

3.1.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.1.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.1.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のインストール」を参照してください。

3.2 HDFSへのOracle表領域の格納

HDFSにOracle読取り専用表領域を格納して、Big Data SQL Smart Scanを使用すると、その表領域に格納されているデータの問合せ処理をHadoopクラスタにオフロードできます。Big Data SQL Smart Scanは、データのローカル処理を実行します。この処理では、Oracle Databaseにデータを返す前にHadoopクラスタで問合せ結果をフィルタ処理します。ほとんどの場合、これはかなりのパフォーマンスの最適化となります。Smart Scanに加えて、HDFSの表領域の問合せには、ネイティブのOracle Databaseアクセス構造とパフォーマンス機能も活用します。これには、索引付け、ハイブリッド列圧縮、パーティション・プルーニング、Oracle Databaseインメモリーなどの機能も含まれます。

HDFSの表領域内の表、パーティションおよびデータは、元のOracle Database内部形式を維持します。これはデータ・ダンプではありません。Hadoop (または他のNoSQLシステム)のデータにアクセスするための他の手段とは異なり、Oracle外部表を作成する必要はありません。対応するOracle表領域をHDFSにコピーした後、元のOracle表を参照してデータにアクセスします。

永続オンライン(読取り専用)およびオフラインの表領域(ASM表領域など)は、HDFSへの移動に適しています。

注意:

HDFSに割り当てられた表領域は変更されない可能性があるため、オフライン表領域はオフラインのままにしておく必要があります。オフライン表領域の場合は、この機能によってHDFSへのハードのバックアップが提供されます。

Oracle SQL Developerを使用してこの項の操作を実行する場合は、Oracle Databaseサーバーにオンプレミスの場所からアクセスできることを確認してください。通常、これにはVPN接続が必要です。

3.2.1 HDFS内の表領域の利点および制約

HDFSにOracle Database表領域を格納する理由をいくつか次に示します。

  • データはOracle Database内部形式のままであるため、リソースを大量消費するデータ型変換がI/Oで不要です。

  • 索引付け、ハイブリッド列圧縮、パーティション・プルーニング、Oracle Databaseインメモリーなど、Oracle Databaseのあらゆるパフォーマンス最適化を適用できます。

  • Oracleユーザーベースのセキュリティが維持されます。Oracle Data RedactionやASO透過的暗号化などの他のOracle Databaseセキュリティ機能は、有効になっていれば、引き続き有効です。HDFSでは、HDFS透過的暗号化のゾーンに表領域を格納できます。

  • 問合せ処理をオフロードできます。Oracle Big Data SQL Smart ScanがHDFSのOracle Database表領域に適用されます。通常、Smart Scanにより、問合せのパフォーマンスを大幅に向上させることができます。Smart Scanを使用すると、問合せ処理のワークロードの多くは、表領域が存在するHadoopクラスタ上のOracle Big Data SQLサーバー・セルにオフロードされます。その後、Smart Scanは、問合せ条件を満たすデータのみが処理のためにデータベース層に返されるように、Hadoopノード上で述語フィルタリングをインプレースで実行して無関係のデータを除外します。データベースに返す前にSmart Scanの述語フィルタリングでデータセットを抜き出せる程度まで、データの移動およびネットワーク・トラフィックが削減されます。

  • 表領域内の各表には、管理対象となるただ1つのオブジェクト(Oracle内部表自体)が存在します。Oracle Databaseでアクセス可能となるため、通常HDFSで使用されている他のファイル形式で格納されているデータは、外部表およびビューのオーバーレイを必要とします。

  • Oracle内部パーティション化では常にそうであるように、パーティション化された表および索引は、別の表領域内にパーティションを保持でき、その一部はExadataやZFSSAなどのストレージ・デバイスに存在することもできます。この機能により、HDFSは別のストレージ・オプションとして追加されます。

HDFS内のOracle表領域の使用に関しては制約がいくつかあります。HDFSに格納されている全データと同様、HDFSに格納されているOracle Databaseの表、パーティションおよびデータは変更不可能です。更新するには、データを削除して置き換えます。この形式のストレージは、アーカイブを目的としたオフロードの表およびパーティションに最適です。また、OD4Hを除いて、HDFSのOracle表領域内のデータは、Hadoop環境の他のツール(Spark、Oracle Big Data Discovery、Oracle Big Data Spatial and Graphなど)ではアクセスできません。

3.2.2 HDFS内の表領域とデータ暗号化について

HDFS内のOracle Database表領域では、ASO (Oracle Advanced Security)透過的表暗号化の他、HDFS透過的暗号化を使用できます。

Oracle Database ASO暗号化が設定された表領域

Oracle Databaseでは、ASO透過的暗号化を表領域にまたは表領域内のオブジェクトに対して有効にできます。表領域が、その後HDFSに移動された場合でも、この暗号化は維持されます。このデータに対する問合せの場合、CELL_OFFLOAD_DECRYPTION設定により、データの復号をOracle Big Data SQLでするかOracle Databaseでするかが決まります。

  • CELL_OFFLOAD_DECRYPTION = TRUEの場合は、暗号化キーがHadoop内のOracle Big Dataサーバー・セルに送信され、データがセルで復号化されます。

  • CELL_OFFLOAD_DECRYPTION = FALSEの場合は、暗号化キーはセルに送信されないため、セルはTDE復号化を実行できません。データは、復号化のためにOracle Databaseに返されます。

デフォルト値はTRUEです。

注意:

CELL_OFFLOAD_DECRYPTIONFALSEに設定されている場合、Smart Scanでは、暗号化されたデータを読み取ることができないため、Hadoop側での問合せ結果セットのフィルタリングによってパフォーマンスを向上させることができません。TDE列暗号化では、暗号化された列のみのSmart Scan処理が妨げられます。TDE表領域暗号化では、表領域全体のSmart Scan処理が妨げられます。

HDFS透過的暗号化ゾーン内の表領域

問合せアクセスやSmart Scanのデータ・フィルタリング機能に対して何の影響もなしに、Oracle Database表領域をHDFS透過的暗号化のゾーンに移動できます。

3.2.3 HDFSへの表領域の移動

Oracle Big Data SQLには、Oracle DatabaseからHadoopのHDFSファイル・システムに表領域を移動するためのオプションが2つあります。

  • bds-copy-tbs-to-hdfsの使用

    スクリプトbds-copy-tbs-to-hdfs.shでは、Oracle Databaseの既存の表領域を選択できます。このスクリプトは、HDFSへの選択した表領域の移動を自動化し、必要なSQL ALTER操作およびデータファイル権限の変更を実行します。表領域が再配置されるDataNodeは、スクリプトによって事前に決定されます。このスクリプトでは、FUSE-DFSを使用して、Oracle DatabaseからHadoopクラスタ内のHDFSファイル・システムにデータファイルを移動します。

    bds-copy-tbs-to-hdfs.shは、クラスタのインストール・ディレクトリにあります – $ORACLE_HOME/BDSJaguar-3.2.0/<クラスタの文字列識別子>

  • HDFSへの表領域の手動による移動

    bds-copy-tbs-to-hdfs.shにかわる別の方法として、表領域をHDFSに移動するステップを手動で実行できます。既存の表領域を移動するか、または新しい表領域を作成し、オフロードする表およびパーティションを選択して追加することができます。この場合、FUSE-DFSまたはHDFS NFSゲートウェイ・サービスのいずれかを設定して、データファイルをHDFSに移動できます。

スクリプト化された方法の方が便利です。手動による方法には、柔軟性が多少あります。どちらの方法もサポートされます。

作業を開始する前に:

インストレーション・ガイドの前提条件に関する項に記載されているように、いずれの方法でも次に示すRPMが事前にインストールされている必要があります。
  • fuse

  • fuse-libs

# yum -y install fuse fuse-libs

これらのRPMは、OracleのパブリックYUMリポジトリで使用できます。

3.2.3.1 bds-copy-tbs-to-hdfsの使用

Oracle Databaseサーバーでは、スクリプトbds-copy-tbs-to-hdfs.shを使用し、Oracle表領域を選択してHDFSに移動できます。このスクリプトは、Oracle Big Data SQLのインストール時に、データベース・インストール・バンドルから抽出したbds-database-installディレクトリにあります。

Big Data SQL Cloud Service以外のトピックこのトピックは、Oracle Big Data SQL Cloud Serviceには該当しません。

構文

bds-copy-tbs-to-hdfs.shの構文は、次のとおりです。

bds-copy-tbs-to-hdfs.sh
bds-copy-tbs-to-hdfs.sh --install
bds-copy-tbs-to-hdfs.sh --uninstall
bds-copy-tbs-to-hdfs.sh --force-uninstall-script
bds-copy-tbs-to-hdfs.sh --tablespace=<tablespace name> [-pdb=<pluggable database name>]
bds-copy-tbs-to-hdfs.sh --list=<tablespace name> [--pdb=<pluggable database name>]
bds-copy-tbs-to-hdfs.sh --show=<tablespace name> [--pdb=<pluggable database name>]

次の表で、追加のコマンドライン・パラメータについて説明します。

表3-3 bds-copy-tbs-to-hdfs.shのパラメータ・オプション

パラメータ・リスト 説明
パラメータなし FUSE-DFSステータスを返します。
--install FUSE-DFSサービスをインストールします。サービスがすでにインストールされている場合、アクションは実行されません。
--uninstall FUSE-DFSサービスをアンインストールして、マウントポイントを削除します。
--grid-home Oracle Gridホーム・ディレクトリを指定します。
--base-mountpoint デフォルトでは、マウントポイントは/mntの下にあります。ただし、一部のシステムでは、このディレクトリへのアクセスが制限されています。このパラメータを使用すると、別の場所を指定できます。
--aux-run-mode Oracle Big Data SQLは標準のユーザー(スーパーユーザーでない)としてデータベース側にインストールされているため、ルートやGridユーザーとして実行する必要があるタスクでは、インストーラを使用してbds-copy-tbs-to-hdfs.shの一時停止中にシェルを作成し、それらのアカウントの下で他のスクリプトを実行する必要があります。--aux-run-mode パラメータは、これらの補助スクリプトを実行するためのモードを指定します。

--aux-run-mode=<mode>

モード・オプションは次のとおりです。

  • session – 生成されたセッションを使用します。

  • su — 別のユーザーとして実行します。

  • sudo — sudoを使用します。

  • ssh — セキュア・シェルを使用します。

--force-uninstall-script このオプションは、ルートとして実行しFUSE-DFSのアンインストールを強制する2番目のスクリプトを作成します。

注意:

このオプションの使用は、システムのリカバリ、停止したシステムの終了、FUSE-DFSサービスの削除が必要になるその他の状況に制限してください。強制的にアンインストールを行うと、データベースが不安定な状態になる可能性があります。これを選択する責任は、カスタマが負うものとします。このオプションを使用した場合のリスクを示す警告メッセージが表示されます。
--tablespace=<tablespace name> [--pdb=<pluggable database name>] HadoopクラスタのHDFS内のストレージに、指定されたPDB内の指定された表領域を移動します。PDBが存在しない場合は、--pdb引数は破棄されます。
--list=<tablespace name> [--pdb=<pluggable database name> 指定された名前と等しいまたは指定された名前が含まれる名前の表領域をリストします。--pdbパラメータは、オプションのスコープです。--list=*は、すべての表領域を返します。--pdb=*は、すべてのPDB内の表領域の名前で一致するものを返します。
--show=<tablespace name> [--pdb=<pluggable database name> 名前が指定された名前と等しいまたは指定された名前を含むもので、すでにHDFSに移動された表領域を表示します。--pdbパラメータは、オプションのスコープです。--show=*は、すべての表領域を返します。--pdb=*は、すべてのPDB内の表領域の名前で一致するものを返します。

使用方法

次のようにbds-copy-tbs-to-hdfs.shを使用して表領域をHDFSに移動します。

  1. oracle Linuxユーザーとしてログオンし、ディレクトリをデータベース・バンドルが抽出されたbds-database-installディレクトリに変更します。このディレクトリでbds-copy-tbs-to-hdfs.shを見つけます。

  2. FUSE-DFSがインストールされていることを確認します。

    $ ./bds-copy-tbs-to-hdfs.sh
  3. FUSE-DFSサービスをインストールします(前述の確認で見つからなかった場合)。このコマンドは、FUSE-DFSサービスも起動します。

    $ ./bds-copy-tbs-to-hdfs.sh --install

    このスクリプトでマウント・ポイントが検出されない場合は、2番目のスクリプトが起動します。要求されたら、このスクリプトをrootとして実行します。HDFSマウントを設定します。2番目のスクリプトは別のセッションで実行でき、必要に応じてこのセッションに戻れます。

    RACデータベースの場合: 「Install FUSE_DFS on All Nodes」:

    RACデータベースでは、スクリプトによってデータベースのその他のノードにFUSE-DFSをインストールするように求められます。

  4. 選択したPDBまたはすべてのPDB内の対象となる表領域のリストを作成します。表領域の名前と場所がすでにわかっている場合は、このステップをスキップできます。

    $ ./bds-copy-tbs-to-hdfs.sh --list=mytablesapce --pdb=pdb1
  5. リストから表領域を選択した後、oracleとしてbds-copy-tbs-to-hdfs.shを再実行しますが、今回は、--tablespaceパラメータ(および指定した場合は--pdbパラメータ)を渡します。スクリプトにより、表領域がHDFSファイル・システムに移動します。

    $ ./bds-copy-tbs-to-hdfs.sh --tablespace=mytablespace --pdb=pdb1

    このコマンドにより、HDFS内の表領域が自動的にSmart Scanの対象となります。SQLでこれを実行するには、表領域の定義で"hdfs:"接頭辞をデータファイル名に追加します。名前の変更により、データベース制御ファイル内のポインタが変更されます。物理ファイル名は変更されません。

ヒント:

データファイルがASMに格納されている場合は、RMANを使用して抽出を行います。現時点では、RMANはASMからHDFSへの直接コピーをサポートしていません。これにより、エラーが発生します。

回避策として、--staging-dirパラメータを使用できます。これにより、2段階コピー(最初にファイル・システムのディレクトリ、その後HDFSへ)を実行できます。--staging-dirで指定されたファイル・システムのディレクトリには、ASMデータファイル用に十分な領域が必要です。
$ ./bds-copy-tbs-to-hdfs.sh --tablespace=mytablespace --pdb=pdb1 --staging-dir=/home/user
非ASMデータファイルの場合、--staging-dirは無視されます。

この手順を完了した後、表領域はオンラインに戻り、アクセスできるようになります。

3.2.3.2 HDFSへの表領域の手動による移動

bds-copy-tbs-to-hdfs.shにかわる別の方法として、次の手動によるステップを使用してOracle表領域をHDFSに移動できます。

注意:

ASM表領域の場合、まず、RMANまたはASMCMDを使用して表領域をファイルシステムにコピーする必要があります。

Oracle Big Data SQLにはFUSE-DFSが組み込まれており、ここでの説明ではFUSE-DFSを使用してHDFSファイル・システムに接続します。かわりにHDFS NFSゲートウェイ・サービスを使用することもできます。Hadoopディストリビューション用のドキュメントには、その方法に関する説明が記載されています。

次のステップはすべてOracle Databaseサーバーで実行します。Linuxシェル・コマンドはすべてrootとして実行します。SQLコマンドの場合は、oracleユーザーとしてOracle Databaseにログオンします。

  1. FUSE-DFSをインストールしていない、または起動していない場合は、bds-copy-tbs-to-hdfs.sh --installを実行します。このスクリプトにより、FUSE-DFSが(まだインストールされていない場合は)インストールされた後、起動します。

    スクリプトでは、マウント・ポイント/mnt/fuse-<clustername>-hdfsが自動的に作成されます。

    注意:

    スクリプトbds-copy-tbs-to-hdfs.shと互換性があるのは、FUSE-DFS 2.8のみです。
  2. SQLで、CREATE TABLESPACEを使用して表領域を作成します。それをローカルの.dbfファイルに格納します。移入後、そのファイルをHadoopクラスタに移動します。単一のbigfile表領域をお薦めします。

    次に例を示します。
    SQL> CREATE TABLESPACE movie_cold_hdfs DATAFILE '/u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf' SIZE 100M reuse AUTOEXTEND ON nologging;
    
  3. MOVE句を指定したALTER TABLEを使用して表領域にオブジェクトを移動します。

    次に例を示します。
    SQL> ALTER TABLE movie_fact MOVE PARTITION 2010_JAN TABLESPACE movie_cold_hdfs ONLINE UPDATE INDEXES;
    オブジェクトの現在のステータスをチェックし、変更を確認する必要があります。その場合、どの表領域にパーティションが属しているかを確認します。
    SQL> SELECT table_name, partition_name, tablespace_name FROM user_tab_partitions WHERE table_name='MOVIE_FACT';
  4. 表領域を読取り専用にして、オフラインにします。

    SQL> ALTER TABLESPACE movie_cold_hdfs READ ONLY;
    SQL> ALTER TABLESPACE movie_cold_hdfs OFFLINE;
  5. データファイルをHDFSにコピーしてから、ファイル権限を読取り専用に変更します。

    hadoop fs -put /u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf /user/oracle/tablespaces/
    hadoop fs –chmod 440 /user/oracle/tablespaces/movie_cold_hdfs1.dbf
    

    Oracle Big Data SQLの一般的なセキュリティ上の措置として、適切なHDFSファイル権限を適用して不正な読取り/書込みアクセスを防止します。

    hadoop fsコマンドを実行する前に、$ORACLE_HOME/bigdatasql/hadoop_<clustername>.envをソーシングする必要がある場合があります。

    それにかわる方法として、LINUX cpコマンドを使用してファイルをFUSEにコピーできます。

  6. RENAME DATAFILE句を指定したALTER TABLESPACE文を使用して、データファイルの名前を変更します。

    重要:

    次のSQLの例のファイル・パスに対する"hdfs:"接頭辞に注目してください。これは、ファイルをスキャンする必要があることをSmart Scanに指示するキーワードです。また、Smart Scanでは、ファイルが読取り専用である必要があります。クラスタ名はオプションです。

    また、下のSQL文を実行する前に、ディレクトリ$ORACLE_HOME/dbs/hdfs:<clustername>/user/oracle/tablespaces/mnt/fuse-<clustername>-hdfs/user/oracle/tablespaces/movie_cold_hdfs1.dbfを指す、ソフト・リンクmovie_cold_hdfs1.dbfが含まれている必要があります。

    SQL> ALTER TABLESPACE movie_cold_hdfs RENAME DATAFILE '/u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf' TO 'hdfs:<clustername>/user/oracle/tablespaces/movie_cold_hdfs1.dbf';

    データファイルの名前を変更すると、データベース制御ファイルのポインタのみが変更されます。この手順では、物理的にデータファイルの名前を変更しません。

    表領域は単一のクラスタ上に存在する必要があります。データファイルが複数存在する場合、これらは同じクラスタを指す必要があります。

  7. 表領域をオンラインに戻してテストします。
    SQL> ALTER TABLESPACE movie_cold_hdfs ONLINE;
    SQL> SELECT avg(rating) FROM movie_fact;
    

完全なコード例を次に示します。ここでは、3つのパーティションをOracle Databaseのローカル・ストレージからHDFS内の表領域に移動します。

mount hdfs
select * from dba_tablespaces;

CREATE TABLESPACE movie_cold_hdfs DATAFILE '/u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf' SIZE 100M reuse AUTOEXTEND ON nologging;

ALTER TABLE movie_fact 
MOVE PARTITION 2010_JAN TABLESPACE movie_cold_hdfs ONLINE UPDATE INDEXES;
ALTER TABLE movie_fact 
MOVE PARTITION 2010_FEB TABLESPACE movie_cold_hdfs ONLINE UPDATE INDEXES;
ALTER TABLE movie_fact 
MOVE PARTITION 2010_MAR TABLESPACE movie_cold_hdfs ONLINE UPDATE INDEXES;

-- Check for the changes 
SELECT table_name, partition_name, tablespace_name FROM user_tab_partitions WHERE table_name='MOVIE_FACT';

ALTER TABLESPACE movie_cold_hdfs READ ONLY;
ALTER TABLESPACE movie_cold_hdfs OFFLINE;

hadoop fs -put /u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf /user/oracle/tablespaces/
hadoop fs –chmod 444 /user/oracle/tablespaces/ movie_cold_hdfs1.dbf

ALTER TABLESPACE movie_cold_hdfs RENAME DATAFILE '/u01/app/oracle/oradata/cdb/orcl/movie_cold_hdfs1.dbf' TO 'hdfs:hadoop_cl_1/user/oracle/tablespaces/movie_cold_hdfs1.dbf';
ALTER TABLESPACE movie_cold_hdfs ONLINE;

-- Test
select avg(rating) from movie_fact;

3.2.4 HDFS内の表領域に対するSmart Scan

Smart Scanは、データが存在する場所に処理を移行するOracleパフォーマンス最適化です。Big Data SQLでは、Smart Scanによって"hdfs:"接頭辞がパスに含まれるデータファイルが検索されます。この接頭辞は、データファイルがスキャンの対象となることを示すキーです。

表領域データをHDFSおよび表領域に移動してデータファイルのパスの先頭に"hdfs:"タグを付けると、そのようなファイル内のデータにアクセスする問合せでは、デフォルトでBig Data SQL Smart Scanを利用します。Big Data SQL Smart Scanのパフォーマンス最適化がすべて適用されます。これにより、ストレージ層からデータベース層に移動されるデータ量が大幅に削減されます。このようなパフォーマンス最適化には、次のものがあります。

  • Hadoopクラスタの超並列処理能力を利用してソースでデータをフィルタリングします。

  • ストレージ索引を利用して、スキャンされるデータ量を削減できます。

  • データ・マイニング・スコアリングをオフロードできます。

  • 暗号化されたデータのスキャンをオフロードできます。

Smart Scanの無効化または有効化

初期化パラメータ_CELL_OFFLOAD_HYBRID_PROCESSINGにより、Smart Scan for HDFSが有効か無効を判別します。デフォルトは有効です。

HDFS内の表領域に対してSmart Scanを無効にするには、次の手順を実行します。

  1. initまたはパラメータ・ファイルでパラメータをFALSEに設定します。

     _CELL_OFFLOAD_HYBRID_PROCESSING=FALSE 

    アンダースコア接頭辞は、このパラメータ名に必要です。

  2. Oracle Databaseインスタンスを再起動します。

SQLでALTER SYSTEMディレクティブを使用して、この変更を動的に実行することもできます。その場合、再起動は必要ありません。

SQL> alter system set _cell_offload_hybrid_processing=false;

Smart Scanを無効にする理由の1つに、Oracle表領域データファイルをHDFSから移動して、元の場所に戻す必要がある場合があります。

_CELL_OFFLOAD_HYBRID_PROCESSINGTRUEに再設定すると、Smart Scanを再度有効にできます。

注意:

_CELL_OFFLOAD_HYBRID_PROCESSINGFALSEに設定すると、Smart ScanはHDFS内に存在するOracle表領域に対して無効になります。