次の表に、この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の他のプロセスでアクセスできません。 |
この項では、Copy to Hadoopを使用してOracle Database表を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のライセンスが必要です。
Copy to Hadoopをインストールして使用を開始するには、次のようにします。
ヒント:
専門的な要件を備えたHadoopのパワー・ユーザーの場合は、直接コピーの手動オプションをお薦めします。付録Bの「直接コピーにCopy to Hadoopを使用するための手動による手順」を参照してください。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の概要
Oracle Shell for Hadoop Loadersを設定するには、『Oracle Big Data SQLインストレーション・ガイド』の手順に従います。
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 (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
次の例に、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
コマンドを使用して、次の手順を自動的に実行します。
Oracleのソース表の内容をローカル・ディスク上のデータ・ポンプ形式ファイルにエクスポートします。
データ・ポンプ形式ファイルをHDFSに移動します。
データ・ポンプ形式ファイルにマップされる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
の列をロードするため。
次のOHSH
コマンドは、Oracle表からコピーした後のHive表の行数を表示します。
%hive0 select count(*) from cp2hadoop_fivdti;
Hive表の列は、データ・ポンプ・ファイルに格納されたメタデータで提供されるOracle列と同じ名前が自動的に設定されます。Hive表のユーザーが指定した列定義はいずれも無視されます。
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に型変換します。
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.headHive外部表が作成されておらず、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>'")
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ユーザーズ・ガイド』を参照してください。Oracle Databaseでは、HDFSに読取り専用の表領域を格納できるようになりました。その結果、有能なBig Data SQL Smart Scanを使用してそのデータを処理できます。これは、読取り専用のデータをHadoopクラスタにアーカイブするための有効な手段となります。
HDFSの表領域内の表、パーティションおよびデータは、元のOracle Database内部形式を維持します。これはデータ・ダンプではありません。Hadoop (または他のNoSQLシステム)のデータにアクセスするための他の手段とは異なり、Oracle外部表を作成する必要はありません。対応するOracle表領域をHDFSにコピーした後、元のOracle表を参照してデータにアクセスします。
永続オンライン表領域(ASM表領域など)は、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など)ではアクセスできません。
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_DECRYPTION
がFALSE
に設定されている場合、Smart Scanでは、暗号化されたデータを読み取ることができないため、Hadoop側での問合せ結果セットのフィルタリングによってパフォーマンスを向上させることができません。TDE列暗号化では、暗号化された列のみのSmart Scan処理が妨げられます。TDE表領域暗号化では、表領域全体のSmart Scan処理が妨げられます。 HDFS透過的暗号化ゾーン内の表領域
問合せアクセスやSmart Scanのデータ・フィルタリング機能に対して何の影響もなしに、Oracle Database表領域をHDFS透過的暗号化のゾーンに移動できます。
Oracle Big Data SQLには、Oracle DatabaseからHadoopのHDFSファイル・システムに表領域を移動するためのオプションが2つあります。
スクリプト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 Big Data SQLデータベース・バンドルが抽出されたbds-database-install
ディレクトリにあります。
bds-copy-tbs-to-hdfs.sh
にかわる別の方法として、表領域をHDFSに移動する手順を手動で実行できます。既存の表領域を移動するか、または新しい表領域を作成し、オフロードする表およびパーティションを選択して追加することができます。この場合、FUSE-DFSまたはHDFS NFSゲートウェイ・サービスのいずれかを設定して、データファイルを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 --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のパラメータ・オプション
パラメータ・リスト | 説明 |
---|---|
パラメータなし |
FUSE-DFSステータスを返します。 |
--install |
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に移動します。
oracle
Linuxユーザーとしてログオンし、ディレクトリをデータベース・バンドルが抽出されたbds-database-install
ディレクトリに変更します。このディレクトリでbds-copy-tbs-to-hdfs.sh
を見つけます。
FUSE-DFSがインストールされていることを確認します。
$ ./bds-copy-tbs-to-hdfs.sh
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をインストールするように求められます。
選択したPDBまたはすべてのPDB内の対象となる表領域のリストを作成します。表領域の名前と場所がすでにわかっている場合は、この手順をスキップできます。
$ ./bds-copy-tbs-to-hdfs.sh --list=mytablesapce --pdb=pdb1
リストから表領域を選択した後、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:"接頭辞をデータファイル名に追加します。名前の変更により、データベース制御ファイル内のポインタが変更されます。物理ファイル名は変更されません。
RACデータベースの場合: 「Replicate Symlinks to Mountpoints on All Nodes」:
bds-copy-tbs-to-hdfs.sh
を実行しているデータベース・ノード上で、対応するFUSE-DFSマウントポイントを指すデータファイルのsymlinkが$ORACLE_HOME/dbs/hdfs:<cluster name>
内に作成されます。ただし、スクリプトでこれが行われるのはローカル・ノード上でのみです。データベースの各ノード上で同じsymlinkを手動で設定する必要があります。
たとえば、データベースが3つのノードで構成され、Node1上でbds-copy-tbs-to-hdfs.sh
を実行する場合、コピー操作の各データファイルに対して、スクリプトによってNode上のマウントポイントへのsymlinkが作成されます。この例では、データファイルは1つのみです。
$ ls -l $ORACLE_HOME/dbs/hdfs:<cluster>/<path to datafile>/<datafile name> $ORACLE_HOME/dbs/hdfs:<cluster>/<path to datafile>/<datafile name> -> /mnt/fuse-<cluster>-hdfs/user/oracle/<path to datafile>/<datafile name>
Node2およびNode3上にマウントポイントが存在することが分かります(FUSE-DFSがインストールされている場合)。
$ ls -l /mnt/fuse-<cluster>-hdfs/user/oracle/<path to datafile>/<datafile name> $ /mnt/fuse-<cluster>-hdfs/user/oracle/<path to datafile>/<datafile name>
しかし、bds-copy-tbs-to-hdfs.sh
ではこれらの他のノード上にマウントポイントへのsymlinkが作成されず、ユーザーが手動でそれらを追加する必要があります。
$ ln -s /mnt/fuse-<cluster>-hdfs/user/oracle/<path to datafile>/<datafile name> $ORACLE_HOME/dbs/hdfs:<cluster>/<path to datafile>/<datafile name>
この手順を完了した後、表領域はオンラインに戻り、アクセスできるようになります。
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にログオンします。
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のみです。 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;
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';
表領域を読取り専用にして、オフラインにします。
SQL> ALTER TABLESPACE movie_cold_hdfs READ ONLY; SQL> ALTER TABLESPACE movie_cold_hdfs OFFLINE;
データファイルを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にコピーできます。
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';
データファイルの名前を変更すると、データベース制御ファイルのポインタのみが変更されます。この手順では、物理的にデータファイルの名前を変更しません。
表領域は単一のクラスタ上に存在する必要があります。データファイルが複数存在する場合、これらは同じクラスタを指す必要があります。
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;
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を無効にするには、次の手順を実行します。
init
またはパラメータ・ファイルでパラメータをFALSE
に設定します。
_CELL_OFFLOAD_HYBRID_PROCESSING=FALSE
アンダースコア接頭辞は、このパラメータ名に必要です。
Oracle Databaseインスタンスを再起動します。
SQLでALTER SYSTEM
ディレクティブを使用して、この変更を動的に実行することもできます。その場合、再起動は必要ありません。
SQL> alter system set _cell_offload_hybrid_processing=false;
Smart Scanを無効にする理由の1つに、Oracle表領域データファイルをHDFSから移動して、元の場所に戻す必要がある場合があります。
_CELL_OFFLOAD_HYBRID_PROCESSING
をTRUE
に再設定すると、Smart Scanを再度有効にできます。
注意:
_CELL_OFFLOAD_HYBRID_PROCESSING
をFALSE
に設定すると、Smart ScanはHDFS内に存在するOracle表領域に対して無効になります。