Oracle Big Data SQLでは、Apache Hive、HDFS、Oracle NoSQL Database、Apache HBase、その他のNoSQLデータベースなど、複数のビッグ・データ・ソースに格納された非リレーショナル・データに対する問合せをサポートしています。これにより、分散データに対して統一した問合せが可能になり、異なる製品のデータ・ストアのデータがすべてOracleデータベースに格納されているかのようにシームレスに表示および分析できるようになります。
Oracle Big Data SQLを使用すると、手動または既存のアプリケーションによって、Hadoopエコシステム内のデータに対する非常に複雑なSQL SELECT
文を実行できます。たとえば、Oracle Advanced Analyticsのユーザーである場合は、Oracle Big Data SQLを使用してOracle Databaseデータ・マイニング・モデルをHadoopのビッグ・データに拡張することができます。
Oracle Big Data SQLインストールのコンポーネント
Oracle Big Data SQLのアーキテクチャは、Hadoop (またはNoSQL)クラスタ上の並列インストールと連動するOracle Databaseシステム(単一ノードまたはRAC)上のインストールで構成されます。この2つのシステムは、EthernetまたはInfiniBandのどちらかを通じてネットワーク接続できます。Oracle Databaseシステムのコンピュート・ノード上のHadoopおよびHiveクライアントにより、データベースとOracle Big Data SQLプロセス(Oracle Big Data SQLセルと呼ばれる)の間の通信が可能になります。このプロセスは、Hadoopクラスタの各DataNodesで実行されます。このメカニズムによって、Oracle DatabaseはHadoopクラスタ上のデータの問合せが可能になります。
Hadoop HDFSファイル・システム内のデータは不明な形式で保存されているため、SQL問合せには、行内と列内の処理対象データの解析と解釈のための、なんらかの構造が必要になります。Oracle Big Data SQLは、これを実現するために利用できるHadoop構造(特にInputFormatおよびSerDe Javaクラス)を活用します。必要に応じて、Hiveメタデータ定義も使用します。DataNodes上のOracle Big Data SQL処理セルは、この汎用Hadoopインフラストラクチャの上部にあるレイヤーです。セルは、Smart Scanとストレージ索引という2つの重要な機能を提供しています。これらの機能については、この章で説明します
関連項目:
Oracle Big Data SQL構成の両側にソフトウェアをインストールして構成する方法は、『Oracle Big Data SQLインストレーション・ガイド』を参照してください。このガイドの次の各項では、Oracle Big Data SQLの使用方法について説明します。
Oracle Big Data SQLは、外部表で次世代のパフォーマンス向上を実現します。外部表は、データベース外のデータの場所を識別および記述するOracle Databaseオブジェクトです。他のデータベース表に使用するのと同じSQL SELECT
構文を使用して、外部表を問い合せることができます。
外部表はアクセス・ドライバを使用して、データベース外のデータを解析します。外部データのタイプごとに一意のアクセス・ドライバが必要です。Oracle Big Data SQLには、ビッグ・データ用の2つのアクセス・ドライバが含まれています。メタデータがApache Hiveに定義されているデータ用のドライバ、およびHadoop Distributed File Systemに格納されているデータ(メタデータはOracle管理者のみによって指定される)にアクセスするためのドライバです。
外部表への問合せによって、データがOracleデータベースの表に格納されている場合と同様に、HDFSやHive表に格納されているデータにアクセスできます。Oracle Databaseは、外部表の作成時に指定されたメタデータを使用してデータにアクセスします。
Oracle Database 12.1.0.2は、Oracle Big Data SQL用の新しい2つのアクセス・ドライバをサポートしています。
ORACLE_HIVE
: Apache Hiveデータ・ソースに対するOracle外部表を作成できます。HDFSデータ・ソースに対してHive表がすでに定義されている場合、このアクセス・ドライバを使用します。ORACLE_HIVE
は、Hive表が定義されている他の場所(HBaseなど)に格納されているデータにもアクセスできます。
ORACLE_HDFS
: HDFSに格納されているファイルに対するOracle外部表を直接作成できます。このアクセス・ドライバはHive構文を使用してデータ・ソースを記述し、COL_1
、COL_2
などのデフォルトの列名を割り当てます。個別の手順としてHive表を手動で作成する必要はありません。
ORACLE_HIVE
と同じ方法でHiveメタデータ・ストアからメタデータを取得するのではなく、ORACLE_HDFS
アクセス・ドライバは必要な情報をすべてアクセス・パラメータから取得します。メタデータを指定するにはORACLE_HDFS
アクセス・パラメータが必要です。このパラメータは、Oracle Database内の外部表定義の一部として格納されます。
Oracle Big Data SQLは、これらのアクセス・ドライバを使用して問合せのパフォーマンスを最適化します。
Oracle外部表には従来の索引がありません。このような外部表に対する問合せは、通常、全表スキャンを必要とします。HadoopクラスタのDataNode上のOracle Big Data SQL処理エージェントにより、Smart Scan機能(フィルタ述語のオフロードなど)がOracle外部表にまで拡張されます。Smart Scanは、問合せ結果がデータベース・レイヤーに返信される前に、ストレージ・レイヤーで列および述語のフィルタリングを実行するために、Oracle Exadata Database Machineでしばらくの間使用されてきました。Oracle Big Data SQLでは、Smart Scanは、リクエストされた要素のみがOracle Databaseに送信されるようにHadoopサーバーでローカルに実行される最終フィルタリング・パスです。HadoopのDataNodeで稼働しているOracleストレージ・サーバーは、HDFSの様々なデータ形式(CSVテキスト、Avro、Parquetなど)に対してSmart Scansを実行できます。
このSmart Scanの実装では、Hadoopクラスタの超並列処理能力を利用してソースでデータをフィルタリングします。無関係なデータの大部分(全体の最大99パーセントまで)を先んじて破棄できます。これには、次のような利点があります。
クラスタとデータベース間のデータの移動およびネットワーク・トラフィックを大幅に削減します。
非常に小さい結果セットをOracle Databaseサーバーに返します。
問合せ結果の返送速度が大幅に速くなります。これは、ネットワーク上のトラフィックおよびOracle Databaseでのロードが削減されたことによる直接の結果です。
関連項目:
スマート・スキャン対象のデータ・ファイルを設定する方法の詳細は、「HDFSへのOracle表領域の格納」を参照してください。
外部表の概要、およびOracle Databaseドキュメント・ライブラリ内の詳細情報への手引きについては、『Oracle Database概要』を参照してください。
Oracle Big Data SQLでは、ストレージ索引が自動的に管理され、Oracle Databaseに対して透過的です。ストレージ索引には、HDFSに格納されているデータに関するハード・ディスク上のデータ分散のサマリーが含まれています。ストレージ索引により、I/O操作とフラット・ファイルからOracle Databaseブロックにデータを変換するCPUコストを減らすことができます。ストレージ索引を"否定の索引"と考えることができます。Smart Scanは、ストレージ索引からデータがデータのブロック内にないことがわかるため、そのブロックを読み飛ばすことができます。これにより、I/Oを大幅に回避できます。
ストレージ索引は、HDFSに基づいた外部表またはORACLE_HDFSドライバとORACLE_HIVEドライバのいずれかを使用して作成された外部表に対してのみ使用できます。ストレージ索引は、Apache HBaseやOracle NoSQLなどのStorageHandlerを使用する外部表に対しては使用できません。
ストレージ索引はインメモリー領域索引を収集したもので、各領域索引には最大32列のサマリーが格納されています。各分割に領域索引が1つあります。1つの領域索引に格納されているコンテンツは、その他の領域索引とは無関係です。これにより拡張性が高まり、ラッチ競合を回避できます。
各領域索引では、ストレージ索引が領域の列の最小値と最大値を管理します。最小値および最大値は、不要なI/Oの回避に使用されます。これは、I/Oフィルタリングとも呼ばれます。V$SYSSTAT
ビューにあるストレージ索引統計別に保存されたセルのXTグラニュルI/Oバイト数は、ストレージ索引を使用して保存されたI/Oのバイト数を示したものです。
関連項目:
V$SYSSTAT
ビューの詳細は、『Oracle® Databaseリファレンス』 を参照してください
次の比較を使用する問合せはストレージ索引によって改善されます。
等価(=)
不等価(<、!=または>)
以下(<=)
以上(>=)
IS NULL
IS NOT NULL
Oracle Big Data SQLサービスが受け取った問合せに含まれる比較述語が領域の列の最大値よりも大きい場合や最小値よりも小さい場合に、ストレージ索引が自動的に構築されます。
注意:
WHERE問合せ句に頻繁に出現する列に基づいて表内の行を順序付けると、ストレージ索引の効果が上がります。
ストレージ索引は、すべての非言語データ型で動作し、非言語索引に似た言語データ型でも動作します。
例1-1 ストレージ索引を使用したディスクI/Oの回避
次の図に、表および領域索引を示します。この表の列Bには、1から8までの範囲の値があります。一方の領域索引には最小値として1、最大値として5が格納されています。もう一方の領域索引には、最小値として3、最大値として8が格納されています。
SELECT * FROM TABLE WHERE B < 2;
例1-2 ストレージ索引による結合パフォーマンスの向上
ストレージ索引を使用すると、表の結合で不要なI/O操作をスキップできます。たとえば、次の問合せでは、I/O操作を実行し、ファクト表の最初のブロックにのみブルーム・フィルタを適用しています。ブルーム・フィルタは、結合パフォーマンスの向上のために重要です。この例では、ファクト表ではなくディメンション表に述語があります。ブルーム・フィルタは"dim.name=Hard drive
"に基づいて作成されて、このフィルタがファクト表に適用されます。そのため、ディメンション表にフィルタがある場合でも、ディメンション問合せの結果に基づいて、そのソース(つまりHadoop)でデータにフィルタを適用できます。これにより、関係するストレージ索引などの最適化も可能になります。
SELECT count(*) FROM fact, dimension dim WHERE fact.m=dim.m and dim.product="Hard drive";
ファクト表の2番目のブロックに対するI/Oは、最小値/最大値の範囲(5,8)がブルーム・フィルタに存在しないため、ストレージ索引によって完全に回避されます。
多くのビッグ・データ・システムでは、ファイルタイプそのもの(Apache Parquetなど)またはHiveのパーティション化やStorageHandler APIを使用して、述語のオフロード機能が一部のレベルでサポートされています。Oracle Big Data SQLでは、述語をOracle Databaseからサポート・システムにプッシュすることで、このようなオフロード機能を利用しています。たとえば、述語のプッシュダウンによって次の動作が自動的に行われるようになります。
パーティション化されたHive表に対する問合せは、パーティション列に対するフィルタ述語に基づいてプルーニングされます。
Apache ParquetおよびApache ORCファイルに対する問合せでは、内部索引(これらのファイル形式内に含まれる構造など)に照らして述語を検証することで、I/O回数を削減します。
Oracle NoSQL DatabaseまたはApache HBaseに対する問合せは、SARGable述語を使用して、リモート・データ・ストアでデータのサブスキャンを行います。
述語のプッシュダウンを有効にするために必要なデータ型
述語のプッシュダウンでは、Hiveデータ型とOracleデータ型の間に特定のマッピングが存在することが必要です。これらのマッピングを次の表に示します。
Hiveデータ型 | Oracleデータ型にマッピング |
---|---|
CHAR(m) |
CHAR(n)、VARCHAR2(n) (n >= m) |
VARCHAR(m) |
CHAR(n)、VARCHAR2(n) (n >= m) |
string |
CHAR(n)、VARCHAR2(n) |
DATE |
DATE |
TIMESTAMP |
TIMESTAMP(9) Hive TIMESTAMPにはナノ秒、9桁の小数秒が入ります。 |
TINYINT |
NUMBER(3)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も有効。 |
SMALLINT |
NUMBER(5)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も有効。 |
INT |
NUMBER(10)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も有効。 |
BIGINT |
NUMBER(19)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も可 |
DECIMAL(m) |
m = nのNUMBER(n)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も有効。 |
FLOAT |
BINARY_FLOAT |
DOUBLE |
BINARY_DOUBLE |
BINARY |
RAW(n) |
BOOLEAN |
CHAR(n)、VARCHAR2(n) (n >= 5)、値TRUE、FALSE |
BOOLEAN |
NUMBER(1)が望ましいが、NUMBERまたはNUMBER(n) (任意の値n)も有効。値0 (false)、1 (true)。 |
Hadoopデータに対する問合せには、レコード数が数百万になる可能性があるラージ・オブジェクトの処理を伴うことがあります。こうしたオブジェクトをフィルタ処理や解析のためにOracle Databaseに戻すことは非効率です。Oracle Big Data SQLでは、Hadoopクラスタ上の専用処理セルにCLOBの処理をプッシュ・ダウンすることで大幅なパフォーマンス向上を実現できます。Hadoopでフィルタ処理すると、Oracle Databaseに戻す行の数が少なくなります。解析することで、フィルタ処理した各行内の列から返されるデータの量が少なくなります。
CLOB処理はユーザーのニーズに適合するように無効化または再有効化できます。
リリース3.2では、この機能は現時点でCLOBデータを返すJSON式にのみ適用されます。ストレージ・レイヤーの評価に適格なJSONフィルタ式には、単純化された構文のJSON_VALUEおよびJSON_QUERYが含まれます。
将来のリリースでは、その他のCLOB型(substrやinstrなど)に加えてBLOBデータにも同じサポートが提供されます。
Oracle Big Data SQLは、次に示すサイズ制約の範囲内で、HadoopにCLOBの処理をプッシュ・ダウンできます。
CLOB列のフィルタリングは最大サイズが1 MB。
ストレージ・サーバーでの評価に利用できる実際のデータ量は、使用される文字セットに応じて異なることがあります。
列の解析は最大32 KB。
この制限は、CLOBデータ型のストレージからの選択リストの投影を表します。
列のサイズがこれらの2つの値を超える場合にのみ、処理がOracle Databaseに戻されます。
例1-3 JSONドキュメントの処理
{"ponumber":9764,"reference":"LSMITH-20141017","requestor":"Lindsey Smith","email”: “Lindsey@myco.com”, “company”:”myco” …}
CREATE TABLE POS_DATA ( pos_info CLOB ) ORGANIZATION EXTERNAL ( TYPE ORACLE_HDFS DEFAULT DIRECTORY DEFAULT_DIR LOCATION ('/data/pos/*') ) REJECT LIMIT UNLIMITED;
SELECT p.pos_info.email, p.pos_info.requestor FROM POS_DATA p WHERE p.pos_info.company=’myco’
この問合せ例では、次の2つのデータ除外の最適化が実施されます。
データは、Hadoopクラスタ内のOracle Big Data SQLセルでフィルタ処理されます。「myco」という会社に関連するレコードのみが解析されます(解析後、該当するレコードから選択されたデータのみがデータベースに返されます)。
クラスタ内のOracle Big Data SQLセルは、フィルタ処理されたレコードのセットを解析して、各レコードから要求された2つの属性(p.pos_info.email
とp.pos_info.requestor
)の値のみがデータベースに返されます。
次の表では、CLOB処理のプッシュダウンがサポートされる別の例を示します。前述したように、投影(CLOB列の選択側のリファレンス)は32 KBのCLOBデータに制限されていて、述語のプッシュダウンは1 MBのCLOBデータに制限されています。
問合せ | コメント |
---|---|
SELECT count(*) FROM pos_data p WHERE pos_info is json; |
この場合、述語によりJSON形式に準拠する列のみが返されるようになります。 |
SELECT pos_info FROM pos_data p WHERE pos_info is json; |
前の場合と同じ述語ですが、CLOB値が投影されるようになっています。 |
SELECT json_value(pos_info, '$.reference') FROM pos_data p WHERE json_value(pos_info, '$.ponumber') > 9000 |
ここでは、述語はJSONドキュメントのフィールドに対して発行されます。また、投影されたCLOB JSON値の上部にあるフィールド"reference"を取得するJSON値も実行しています。 |
SELECT p.pos_info.reference FROM pos_data p WHERE p.pos_info.ponumber > 9000; |
これは前の例と同様に機能しますが、簡略化された構文で表現されています。 |
SELECT p.pos_info.email FROM po_data p WHERE json_exists(pos_info, '$.requestor') and json_query(pos_info, '$.requestor') is not null; |
この例は、述語としてjson_exists とjson_query も使用できるようにする方法を示しています。 |
Oracle Big Data SQLでは、パフォーマンス分析のためのデータを提供できる統計が多数用意されています。
5つの主要なセルのXTおよびストレージ索引の統計
問合せがオフロード可能である場合、次のXT関連の統計は、どのようなIOの節約がオフロードおよびSmart Scanに期待できるかを判断するのに役立ちます。
cell XT granules requested for predicate offload
リクエストされるグラニュルの数は、HDFSブロック・サイズ、Hadoopデータ・ソースの分割可能性、およびHiveパーティションの回避の有効性など、多数の要素によって異なります。
cell XT granule bytes requested for predicate offload
スキャンのためにリクエストされるバイト数。これは、Hiveパーティションの回避後およびストレージ索引の評価前に調査されるHadoop上のデータのサイズです。
cell interconnect bytes returned by XT smart scan
XTスマート・スキャンによってOracle Databaseに返されるI/Oのバイト数。
cell XT granule predicate offload retries
DataNode上で実行されるBig Data SQLプロセスで、リクエストされた操作を完了できなかった回数。Oracle Big Data SQLは、失敗したリクエストをそのデータのレプリカを含んだ他のDataNodes上で自動的に再試行します。retries値はゼロになります。
cell XT granule IO bytes saved by storage index
ストレージ・セル・レベルで、ストレージ索引によるフィルタリングで除去されたバイト数。これは、ストレージ索引によって提供された情報に基づいてスキャンされなかったデータです。
これらの統計は、問合せを実行する前後に、次のようにして確認できます。この例は、問合せの実行前で、null値を示しています。
SQL> SELECT sn.name,ms.value FROM V$MYSTAT ms, V$STATNAME sn WHERE ms.STATISTIC#=sn.STATISTIC# AND sn.name LIKE '%XT%'; NAME VALUE ----------------------------------------------------- ----- cell XT granules requested for predicate offload 0 cell XT granule bytes requested for predicate offload 0 cell interconnect bytes returned by XT smart scan 0 cell XT granule predicate offload retries 0 cell XT granule IO bytes saved by storage index 0
問合せの有効性を検証するには、問合せの実行後に、次のようにこれらの統計の一部または全部を確認できます。
SQL> SELECT n.name, round(s.value/1024/1024) FROM v$mystat s, v$statname n WHERE s.statistic# IN (462,463) AND s.statistic# = n.statistic#; cell XT granule bytes requested for predicate offload 32768 cell interconnect bytes returned by XT smart scan 32
ヒント:
The Data Warehouse Insiderで公開されているブログ「Big Data SQL Quick Start」には、これらの統計を使用してOracle Big Data SQLのパフォーマンスを分析する方法を示す一連のコードおよび機能のウォークスルーが掲載されています。第2回、第7回および第10回を参照してください。
Oracle Big Data SQLは、データが存在するHadoopシステムの他、データを問い合せるOracle Databaseサーバーにもコンポーネントをインストールする必要があります。
インストールの詳細は、次のリソースを参照してください。
『Oracle Big Data SQLインストレーション・ガイド』
このガイドでは、サポートされているHadoopシステム/Oracle Databaseサーバーの組合せのためのインストールおよび構成の手順を説明します。
Oracle Big Data SQLマスター互換性マトリクス
Oracle Engineered Systems。
その他のシステム。
Linux OSのディストリビューションとバージョン。
Hadoopディストリビューション。
必要とされるパッチを含むOracle Databaseのリリース。