3 HadoopへのOracleデータの格納
次の表に、この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をインストールして使用を開始するには、次のようにします。
ヒント:
専門的な要件を備えたHadoopのパワー・ユーザーの場合は、直接コピーの手動オプションをお薦めします。付録Bの「直接コピーにCopy to Hadoopを使用するための手動によるステップ」を参照してください。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の実行
-
OHSHを起動します。(次の起動コマンドは、推奨に従ってOHSHパスをPATH変数に追加したことを前提としています。)
$ ohsh ohsh>
-
次のリソースを作成します。
-
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>”
-
-
次の
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
操作は、次の操作を実行します。
-
指定したHive表(および関連するData Pumpファイル)を削除します(この名前の表がすでに存在する場合)。
注意:
create or replace
とは異なり、create
操作は失敗し、Hive表および関連するData Pumpファイルがすでに存在する場合はエラーを返します。 -
所定の名前を使用して、新しい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
コマンドを使用して、次の手順を自動的に実行します。
-
Oracleのソース表の内容をローカル・ディスク上のデータ・ポンプ形式ファイルにエクスポートします。
-
データ・ポンプ形式ファイルをHDFSに移動します。
-
データ・ポンプ形式ファイルにマップされる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の列をロードするため。
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で使用できます。
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.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_DECRYPTION
がFALSE
に設定されている場合、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.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/<クラスタの文字列識別子>
。 -
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
ディレクトリにあります。
このトピックは、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 パラメータは、これらの補助スクリプトを実行するためのモードを指定します。
モード・オプションは次のとおりです。
|
--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に移動します。
-
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:"接頭辞をデータファイル名に追加します。名前の変更により、データベース制御ファイル内のポインタが変更されます。物理ファイル名は変更されません。
ヒント:
データファイルが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にログオンします。
-
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;
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を無効にするには、次の手順を実行します。
-
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表領域に対して無効になります。