3.4 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.4.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.4.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.4.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.4.3.1 bds-copy-tbs-to-hdfsの使用

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

構文

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.4.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.4.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表領域に対して無効になります。