主コンテンツへ
Oracle® Big Data SQLユーザーズ・ガイド
リリース3 (3.2)
E92089-01
目次へ移動
目次
索引へ移動
索引

前
次

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_catalog_role権限(データ・ディレクトリ・ビューに対するSELECT権限を提供)。

    • その表に対する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 Hadoop、Oracle SQL Connector for HDFSおよびCopy to Hadoopに簡単に使用できるコマンドライン・インタフェースを提供するヘルパー・シェルです。 コマンドライン・リコール、履歴、親プロセスからの環境変数の継承、 新規または既存の変数の設定、およびコマンドラインでの環境の取替えの実行などの基本的なシェル機能があります。 

Oracle Shell for Hadoop Loadersの中心的な機能には次のものが含まれます。

  • Oracle Shell for Hadoop Loadersが対話してロード・タスクを実行する名前付き外部リソースの定義。

  • ロード操作用のデフォルト値の設定。

  • ロード・コマンドの実行。

  • 単純な事前および事後ロード・タスクの、オペレーティング・システム、HDFS、HiveおよびOracleへの委任。 これらのタスクには、ロードされるデータの表示およびロード後のターゲット表でのデータの表示が含まれます。

Oracle Shell for Hadoop Loadersの概要

OHSHキットのexamplesディレクトリには、Oracle Shell for Hadoop Loadersを使用してリソースを定義したり、データをロードする多くの例が含まれています。 これらを実行する例および手順の詳細は、<OHSH_KIT>/examples/README.txtを参照してください。

ヘルプの表示

OHSHシェルには、すべてのコマンドのオンライン・ヘルプがあります。

可能なすべてのOHSHコマンドのリストを表示するには、次のコマンドを実行します。

ohsh> help

特定のコマンドのヘルプを表示するには、helpの後にそのコマンドを続けます。    

ohsh> help show

次の表に、使用可能なヘルプ・カテゴリを示します。

helpコマンド 説明
help load OracleおよびHadoopの表に対するloadコマンドを示します。
help set ロード操作のデフォルト値を設定するためのヘルプを表示します。また、特定の設定により影響を受けるロード・メソッドも示します。
help show デフォルト設定を調査するためのヘルプを表示します。
help shell シェルライクなコマンドを表示します。
help resource 指定リソースを作成および削除するためのコマンドを表示します。

関連項目:

Oracle Shell for Hadoop Loadersを設定するには、『Oracle Big Data SQLインストレーション・ガイド』の手順に従います。

3.1.4 Copy to Hadoopを使用した直接コピーの実行

この例では、Oracle Shell for Hadoop Loaders (OHSH)を使用してOracle DatabaseからHadoopへの1ステップの直接コピーを実行する方法を示します。 

この例では、OHSHおよびOracle Big Data SQLがインストールされて構成されていることと、OHSHインストールのexamplesディレクトリにあるREADME.txtファイルの説明に従って例が構成されていることを前提としています。例のスクリプトは、OHSHインストールのexamplesディレクトリにあります。

例3-1 createreplace_directcopy.ohsh

このスクリプトでは、createまたはreplaceを使用して、Oracle表のFIVDTIからcp2hadoop_fivdtiというHive表を作成した後、そのHive表に10000行をロードします。directcopyコマンドを使用してマップ・ジョブをHadoopに対して実行し、Oracle表を入力スプリットに分割します。次に、すべてのスプリットが含まれるデータ・ポンプ形式ファイルをHDFSに作成し、データ・ポンプ形式ファイルにマップされるHive外部表を作成します。

create or replace hive table hive0:cp2hadoop_fivdti \ 
from oracle table olhp:fivdti using directcopy 

load_directcopy.ohshスクリプトは、directcopyコマンドを使用して、Hive表にさらに30行をロードする方法を示しています。

load hive table hive0:cp2hadoop_fivdti from oracle table olhp:fivdti \
using directcopy where "(i7 < 30)";

必要に応じて、データはOHSHからParquet形式またはORC形式に変換できます。

%hive0 create table cp2hadoop_fivdti_parquet stored as parquet as select * from cp2hadoop_fivdti

3.1.5 Copy to Hadoopを使用した段階的コピーの実行

次の例に、Oracle Shell for Hadoop Loaders (OHSH)を使用して、Oracle DatabaseからHadoopへの2ステップの段階的コピーを実行する方法を示します。

この例では、OHSHおよびBig Data SQLがインストールされて構成されていることと、OHSHインストールのexamplesディレクトリにあるREADME.txtの説明に従って例が構成されていることを前提としています。次のスクリプトの他、多くのスクリプトもexamplesディレクトリで入手できます。

例3-2 createreplace_stage.ohsh

このスクリプトでは、createまたは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

例3-3 load_stage.ohsh

load_stage.ohshスクリプトは、stageコマンドを使用して、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ソース表から列をロードするため。

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

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

3.1.6 Hiveのデータの問合せ

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

%hive0 select count(*) from cp2hadoop_fivdti;

3.1.7 列マッピングおよびデータ型変換について

3.1.7.1 列マッピングの概要

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

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

関連項目:

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へのハードのバックアップが提供されます。

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ディレクトリにあります。

構文

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