Oracle Event Processingでは、HadoopおよびNoSQLDBカートリッジによりビッグ・データをサポートします。Hadoopは、Oracle CQLプロセッサがHadoop分散ファイルシステム(HDFS)の大容量データにアクセスするための拡張カートリッジです。HDFSは、非リレーショナル・データ・ストアです。NoSQLは、Oracle CQLプロセッサがOracle NoSQL Databaseの大容量データにアクセスするための拡張カートリッジです。Oracle NoSQLDB Databaseには、キー/値のペアでデータが格納されます。
この章の内容は次のとおりです。
Hadoopはオープンソース・テクノロジであり、これを使用してクラスタにまたがって分散された膨大なデータ・セットにアクセスできます。Hadoopソフトウェアの特徴の1つに、リレーショナル・データベースに保存されていない膨大な量のデータへのアクセスを可能にするということが挙げられます。Oracle Event Processingのデータ・カートリッジは、Cloudera distribution for Hadoop (CDH)バージョン3u5に基づきます。
このマニュアルの内容は、読者がHadoopシステムにすでに精通していて、運用しているものと想定しています。Hadoopの詳細は、HadoopプロジェクトのWebサイトhttp://hadoop.apache.org/
を参照してください。
注意:
HadoopをLinux環境でのみ実行している場合でも、UNIXおよびWindowsでHadoopデータ・カートリッジを使用できます。
Hadoop分散ファイル・システム上のファイルのデータを処理できるイベント処理ネットワークに既存のHadoopデータ・ソースを統合するには、Hadoopデータ・カートリッジを使用できます。データ・ソースを統合すると、Hadoopシステム上のファイルからデータを組み込むOracle CQL問合せコードを記述できます。
Hadoopシステムを統合する際には、次のガイドラインに留意してください。
Hadoopクラスタは、その独自のメカニズムによって起動され、アクセス可能であることが必要です。Oracle Event Processingによってこのクラスタが直接管理されることはありません。
Hadoopシステムのファイルは、Oracle CQLで単一キーを使用する結合のみをサポートします。ただし、関連付けられたイベント・タイプのプロパティをキーとして使用できます。すなわち、型がバイト配列であるキーを除いて、文字列型以外の型のキーを使用できます。
結合には等号演算子を使用する必要があります。その他の演算子は、結合条件ではサポートされません。
Hadoopファイルのデータを表すために定義するイベント・タイプの場合、タプルベースのイベント・タイプのみがサポートされます。
イベント・タイプ指定でのプロパティの順序は、Hadoopファイルでのフィールドの順序と一致させる必要があります。
NullPointerExeptionの発生を回避するため、サーバーのシャットダウンまたはアンデプロイを実行する前に、Hadoopデータ・カートリッジの処理を完了するまで待ちます。
Oracle CQLに対応する次のHadoopのデータ型のみがサポートされます。それ以外のデータ型では、構成上の例外が発生が発生します。
表5-1 Oracle CQLとHadoop間のデータ型マッピング
Oracle CQLデータ型 | Hadoopデータ型 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hadoopデータ・ソースがOracle Event Processingアプリケーションでどのように使用されるかを理解するには、大量の顧客の購入データにリアル・タイムで迅速にアクセスする必要があるアプリケーションによるシナリオを考えてみます。
この場合、Hadoopに格納されているデータには、全店の顧客全員によるすべての購入が含まれています。データの値には、顧客ID、店舗ID、製品IDなどが含まれます。購入データには、各店舗での売れ筋製品についての情報が含まれます。データを管理可能な状態にレンダリングするには、データを調べ、上位購買者(購買奨励策の送付先)のリストを作成するために、MapReduce関数が使用されます。
このデータは、製品のお薦め情報や購買奨励策(クーポンなど)を顧客に送るために設計されたサービスの一部として、モバイル・アプリケーション・メーカーにより収集および管理されます。データは複数の小売業者から収集され、小売業者ごとに別々に管理されます。
Oracle Event Processingアプリケーションは、上位購入者に購買奨励策を提供するために設計されたクライアント側のモバイル・アプリケーションに中間層ロジックを提供します。これは次のように機能します。
既存のHadoopシステムにあるファイルをイベント処理ネットワークに統合することで、Oracle Event Processingに付随するHadoopサポートを使用できます。ファイルを統合することにより、Oracle CQLコードからそのファイルのデータにアクセスできます。
ここでは、以下の項目について説明します。
Oracle Event ProcessingからHadoopを使用するには、まずOracle Event ProcessingサーバーとHadoopサーバーの両方で次のように構成を変更する必要があります。
Oracle Event Processingサーバーで、サーバーのbootclasspathにHadoop構成ファイル(core-site.xml
、hdfs.xml
およびmapred.xml
)を追加します。
Hadoopサーバーで、Pig JARファイルをlibディレクトリにコピーし、hadoop-env.sh
に定義されたHADOOP_CLASSPATH
の一部として含めます。
注意:
カートリッジを介したHadoopデータ・ソースとの接続には、多くの入出力操作が必要になる可能性があり、アプリケーションのデプロイ解除でタイムアウトになったり、エラーが発生して、アプリケーションを再びデプロイできなくなったりします。Hadoopカートリッジを使用するアプリケーションのデプロイを解除する前には、必ずアプリケーションへのイベント・フローを中断してください。
既存のHadoopシステムからのファイルの統合は、既存のリレーショナル・データベースから表を統合する方法と似ています。Hadoopファイルの場合、Hadoopサポート用に特別に追加されたOracle Event ProcessingスキーマのXML要素file
を使用できます。
ファイルの要素は、http://www.oracle.com/ns/ocep/hadoopネームスペースからのものです。そのため、EPNアセンブリ・ファイルは、そのネームスペースを参照する必要があります。file
要素には次の属性があります。
id
: EPN内のそのファイルを一意に識別します。この属性値を使用して、プロセッサ内のデータ・ソースを参照します。
event-type
: ファイルのデータのバインド先であるイベント・タイプの参照。イベント・タイプは、EPNで定義されている必要があります。
path
: Hadoopファイル・システム内のファイルへのパス。
separator
: オプション。Hadoopファイル内の行を別々のフィールドに分解するときに使用するキャラクタ・デリミタ。デフォルトのデリミタはカンマ( , )文字です。
operation-timeout
: オプション。操作が完了するまでの最大待機時間(ミリ秒単位)。
統合するHadoopファイルをファイル要素で指定して、表ソース要素を使用して、ファイルのデータを使用するOracle CQLプロセッサ用のデータ・ソースとしてそのファイルを追加します。
次の例では、http://www.oracle.com/ns/ocep/hadoop
ネームスペース(およびhadoop
接頭辞)がBean要素で参照されることに注意してください。file
要素では、イベント・タイプ・リポジトリで定義されたCustomerDescription
イベント・タイプの他に、CustomerDescription.txt
ファイルがデータとして参照されています。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:wlevs="http://www.bea.com/ns/wlevs/spring" xmlns:hadoop="http://www.oracle.com/ns/ocep/hadoop" xsi:schemaLocation=" http://www.bea.com/ns/wlevs/spring http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd http://www.oracle.com/ns/ocep/hadoop http://www.oracle.com/ns/ocep/hadoop/ocep-hadoop.xsd"> <!-- Some schema references omitted for brevity. --> <!-- Event types that will be used in the query. --> <wlevs:event-type-repository> <wlevs:event-type type-name="SalesEvent"> <wlevs:class>com.bea.wlevs.example.SalesEvent</wlevs:class> </wlevs:event-type> <wlevs:event-type type-name="CustomerDescription"> <wlevs:properties> <wlevs:property name="userId" type="char"/> <wlevs:property name="creditScore" type="int"/> <wlevs:property name="address" type="char"/> <wlevs:property name="customerName" type="char"/> </wlevs:properties> </wlevs:event-type> </wlevs:event-type-repository> <!-- Input adapter omitted for brevity. --> <!-- Channel sending SalesEvent instances to the processor. --> <wlevs:channel id="S1" event-type="SalesEvent" > <wlevs:listener ref="P1"/> </wlevs:channel> <!-- The file element to integrate CustomerDescription.txt file from the Hadoop system into the EPN. --> <hadoop:file id="CustomerDescription" event-type="CustomerDescription" path="CustomerDescription.txt" /> <!-- The file from the Hadoop system tied into the query processor with the table-source element. --> <wlevs:processor id="P1"> <wlevs:table-source ref="CustomerDescription" /> </wlevs:processor> <!-- Other stages omitted for brevity. --> </beans>
Hadoopファイルをイベント処理ネットワークに統合すると、Oracle CQLコードからそのファイルを問い合せることができます。
次の例は、HadoopシステムのファイルをEPNに追加する方法を示しています。ファイルがEPNに追加されると、次の例のようにOracle CQLコードからの問合せが可能です。
次の例では、プロセッサがSalesEventインスタンスをチャネルから受信しますが、HadoopシステムのファイルにもCustomerDescriptionインスタンスと同様にアクセスできます。Hadoopファイルは、基本的に顧客をリストするCSVファイルです。どちらのイベント・タイプにもuserId
プロパティがあります。
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" xmlns:n1="http://www.bea.com/ns/wlevs/config/application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <processor> <name>P1</name> <rules> <query id="q1"><![CDATA[ SELECT customerName, creditScore, price, item FROM S1 [Now], CustomerDescription as cust WHERE S1.userId = cust.userId AND S1.price > 1000 ></query> </rules> </processor> </n1:config>
Oracle NoSQLデータベースは、分散型のキー値データベースです。このデータベースでは、データはキー値ペアで格納されており、これらのペアは特定のストレージ・ノードに記述されています。高可用性、ノード障害時のラピッド・フェイルオーバー、問合せの最適なロード・バランシングを確保するために、ノードはレプリケートされます。
このマニュアルの内容は、読者がOracle NoSQL Databaseにすでに精通していて、運用しているものと想定しています。Oracle NoSQLの詳細は、Oracle Technology Networkページ(http://www.oracle.com/technetwork/database/database-technologies/nosqldb/documentation/index.html)
を参照してください。
注意:
NoSQLデータ・カートリッジを使用するには、NoSQL Enterprise Editionのライセンスが必要です。
Oracle Event Processing NoSQL Databaseデータ・カートリッジを使用すると、Oracle CQL問合せの一部として、Oracle NoSQL Databaseに保存されたデータを参照できます。カートリッジにより、問合せでは、キーを指定し、そのキーに関連付けられた値のフィールドを参照することで、Oracle NoSQL Databaseストアから値を取得できます。
Oracle NoSQL Databaseを統合する際には、次のガイドラインに留意してください。
NoSQL Databaseは、その独自のメカニズムによって起動され、アクセス可能であることが必要です。Oracle Event Processingによって直接管理されることはありません。
このリリースのカートリッジは、Oracle NoSQL Database APIリリース2.1.54を使用してデータベースへのアクセスを提供します。
問合せでキーとして使用されるプロパティは、String
型であることが必要です。結合では単一のキーのみを使用できます。
結合には等号演算子を使用する必要があります。その他の演算子は、結合条件ではサポートされません。
NoSQL Databaseを使用するランナウェイ問合せはサポートされません。ランナウェイ問合せの実行時間は、オプティマイザが予測する実行時間より長くなります。
Oracle Event Processing NoSQLカートリッジはカートリッジID com.oracle.cep.cartridge.nosqldb
を使用します。
Oracle Event Processing NoSQL Databaseデータ・カートリッジをCQLアプリケーションで使用するには、そのアプリケーションの1つ以上のアプリケーション・スコープ・カートリッジ・コンテキストでカートリッジを宣言および構成する必要があります。
既存のNoSQL Databaseの統合は、リレーショナル・データベースの表を統合する方法と似ています。NoSQL Databaseの場合、EPNアセンブリ・ファイルを次の方法で更新します(手順3の例を参照)。
次の例は、イベント処理ネットワークをNoSQL Databaseに接続する方法を示しています。store
要素は、ホストkvhost-alpha上のポート5000またはホストkvhost-beta上のポート5010を使用して最初の接続を行い、"kvstore-customers"という名前のストアへのアクセスを提供します。Oracle CQLプロセッサP1を定義し、キー/値ストアのデータを"CustomerDescription"という名前のリレーションとしてP1で使用できるようにします。
ストアは、"CustomerDescription"の名前を使用して、Oracle CQL問合せ内で参照できます。ストアから取得される値はすべて、CustomerDescriptionクラスのシリアライズ・インスタンスです。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:osgi="http://www.springframework.org/schema/osgi" xmlns:wlevs="http://www.bea.com/ns/wlevs/spring" xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/osgi http://www.springframework.org/schema/osgi/spring-osgi.xsd http://www.bea.com/ns/wlevs/spring http://www.bea.com/ns/wlevs/spring/ocep-epn.xsd http://www.oracle.com/ns/oep/nosqldb http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd"> <!-- Provide access to the CustomerDescription class, which represents the type of values in the store. --> <wlevs:event-type-repository> <wlevs:event-type type-name="CustomerDescription"> <wlevs:class>com.bea.wlevs.example.CustomerDescription</wlevs:class> </wlevs:event-type> <wlevs:event-type type-name="SalesEvent"> <wlevs:class>com.bea.wlevs.example.SalesEvent</wlevs:class> </wlevs:event-type> </wlevs:event-type-repository> <!-- The store element declares the key-value store, along with the event type to which incoming NoSQL data will be bound. --> <nosqldb:store store-name="kvstore-customers" store-locations="kvhost-alpha:5000 kvhost-beta:5010" id="CustomerDescription" event-type="CustomerDescription"/> <wlevs:channel id="S1" event-type="SalesEvent"> <wlevs:listener ref="P1"/> </wlevs:channel> <!- The table-source element links the store to the CQL processor. --> <wlevs:processor id="P1"> <wlevs:table-source ref="CustomerDescription" /> </wlevs:processor> </beans>
Oracle CQL問合せでstore
要素により指定したストア内のエントリを参照する場合、それらのエントリの値は、イベントタイプ属性で指定した型のシリアライズ・インスタンスであることが必要です。イベント・タイプ・クラスはjava.io.Serializable
を実装する必要があります。
有効でないシリアライズ形式のストアから問合せで値を取得する場合、または指定されたクラスのシリアル化形式でない値の場合は、Oracle Event Processingで例外が発生し、イベント処理が停止します。複数のstore
要素を宣言して、同一または異なるストアから異なるデータ型の値を返すことができます。
NoSQL Databaseをイベント処理ネットワークに統合すると、Oracle CQLコードからデータにアクセスできます。問合せでは、WHERE
句で等価リレーションを指定することで、ストアのエントリを検索できます。
<n1:config xsi:schemaLocation="http://www.bea.com/ns/wlevs/config/application wlevs_application_config.xsd" xmlns:n1="http://www.bea.com/ns/wlevs/config/application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <processor> <name>P1</name> <rules> <query id="q1"><![CDATA[ SELECT customerName, creditScore, price, item FROM S1 [Now], CustomerDescription as cust WHERE S1.userId = cust.userId AND creditScore > 5 ></query> </rules> </processor> </n1:config>
この例では、S1チャネルおよびCustomerDescription NoSQLデータ・ソースのデータを表すイベント・タイプ・インスタンスがいずれもJavaBeansクラスとして実装されています。どちらのイベント・タイプもJavaBeansクラスであるため、Oracle CQL問合せでは、イベントのユーザーIDとWHERE
句内の顧客の説明のIDをどちらもJavaBeansプロパティとして扱って等価とすることで、特定のイベントに関連付けられた顧客の説明にアクセスできます。
WHERE S1.userId = CustomerDescription.userId
この句では、イベントのuserId
フィールドの値で指定されたキーを持つストアからエントリを取得することを要求します。ストアからのエントリ取得では、等価リレーションのみがサポートされます。
ストアからエントリが選択されると、そのストアから取得された値のフィールドは、問合せのSELECT
の部分、またはWHERE
句内の追加の句で参照することができます。
SELECT
句で指定したcreditScore
値では、ストアから取得したCustomerDescription
オブジェクトのcreditScore
フィールドの値が問合せの出力に含まれます。WHERE
句のcreditScore
に対する参照でも、問合せはCustomerDescription
creditScore
フィールドの値が5より大きいイベントにさらに制限されます。
ストアからのエントリ取得に使用されるキーは、値をスラッシュ(/)で始めるか、スラッシュを省略するかのいずれかの方法で書式を設定できます。
等価リレーションの左側に指定した値がスラッシュで始まる場合、キーは1つ以上の主要コンポーネントを(必要な場合はマイナー・コンポーネントも)指定するフル・キーとして扱われます。キー・パスの構文の詳細は、http://docs.oracle.com/cd/NOSQL/html/javadoc/index.html
のOracle NoSQL Database APIドキュメントにあるoracle.kv.Key
クラスに関する情報を参照してください。
たとえば、SalesEvent
オブジェクトのuserId
フィールドに値"/users/user42/-/custDesc"がある場合、その値はusersを1つ目の主要コンポーネントとして、ユーザーIDのuser42を2つ目の主要コンポーネントとして、そしてcustDescというマイナー・コンポーネントを指定するフル・キー・パスとして処理されます。
便宜上、等価リレーションの左側に指定した値がスラッシュで始まっていない場合は、キー全体を構成する1つの主要コンポーネントとして処理されます。
ストアからエントリを取得するために使用されるキーは、Oracle CQL問合せでアクセスされる1つのフィールドで完全な形で指定する必要があります。特に、複数のコンポーネントを指定したキー・パスがキー/値ストア内のエントリにアクセスするために必要な場合、問合せによってアクセスされる1つのフィールドにフル・キー・パス式を格納する必要があります。