プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle CQLデータ・カートリッジによるアプリケーションの開発
12c リリース(12.1.3)
E57539-03
目次へ移動
目次

前
前へ
次
次へ

5 Oracleビッグ・データ・カートリッジ

Oracle Event Processingでは、HadoopおよびNoSQLDBカートリッジによりビッグ・データをサポートします。Hadoopは、Oracle CQLプロセッサがHadoop分散ファイルシステム(HDFS)の大容量データにアクセスするための拡張カートリッジです。HDFSは、非リレーショナル・データ・ストアです。NoSQLは、Oracle CQLプロセッサがOracle NoSQL Databaseの大容量データにアクセスするための拡張カートリッジです。Oracle NoSQLDB Databaseには、キー/値のペアでデータが格納されます。

この章の内容は次のとおりです。

5.1 Hadoopデータ・カートリッジ

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データ・カートリッジを使用できます。

5.1.1 Oracle Event Processing 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データ型

    int

    int

    bigint

    long

    float

    float

    double

    double

    char

    chararray

    java.lang.String

    chararray

    byte

    bytearray

5.1.1.1 使用シナリオ: 購買奨励策を開発するための購入データの使用

Hadoopデータ・ソースがOracle Event Processingアプリケーションでどのように使用されるかを理解するには、大量の顧客の購入データにリアル・タイムで迅速にアクセスする必要があるアプリケーションによるシナリオを考えてみます。

この場合、Hadoopに格納されているデータには、全店の顧客全員によるすべての購入が含まれています。データの値には、顧客ID、店舗ID、製品IDなどが含まれます。購入データには、各店舗での売れ筋製品についての情報が含まれます。データを管理可能な状態にレンダリングするには、データを調べ、上位購買者(購買奨励策の送付先)のリストを作成するために、MapReduce関数が使用されます。

このデータは、製品のお薦め情報や購買奨励策(クーポンなど)を顧客に送るために設計されたサービスの一部として、モバイル・アプリケーション・メーカーにより収集および管理されます。データは複数の小売業者から収集され、小売業者ごとに別々に管理されます。

Oracle Event Processingアプリケーションは、上位購入者に購買奨励策を提供するために設計されたクライアント側のモバイル・アプリケーションに中間層ロジックを提供します。これは次のように機能します。

  1. 小売業者はモバイル・アプリケーション・メーカーと、上位顧客に対する購買奨励策提供のためのプログラムの一部として、購入データを提供することを打ち合せます。店の販売データから定期的にリフレッシュされるデータは、Hadoopシステムに格納され、MapReduce関数を使用して上位購入者が特定されます。
  2. モバイル・アプリケーション・メーカーは、どの小売業者がプログラムをサポートしているかを示して、ダウンロード用にアプリケーションを提供します。
  3. アプリケーション・ユーザーはそれぞれユーザーIDを作成し、これをアプリケーション・メーカーが小売業者からの顧客データに相互に関連付けます。
  4. モバイル・アプリケーションは、Oracle Event ProcessingアプリケーションにユーザーIDとともに位置データを送信するように設計されています。位置データとユーザーIDの情報は、Oracle Event Processingアプリケーションが受信するイベント・データを形成します。
  5. Oracle Event Processingアプリケーションはモバイル・アプリケーションからイベント・データを受信すると、Oracle CQL問合せを使用して次の内容を実行します。
    • ユーザーが参加小売業者の店の近くにいるかどうかを判断します。

    • (Hadoopベースのデータから)そのユーザーがその小売業者の上位購入者であるかどうかを確認します。

    • その小売業者からの購入者として、そのユーザー関連の購入情報を検索します。

    • ユーザーが上位購入者の場合、アプリケーションは、以前購入された製品を現在その製品の購入者に提供されている購買奨励策と対応付けます。

  6. Oracle Event Processingアプリケーションは、ユーザーにインセンティブを積極的に紹介します。

5.1.1.2 データ・カートリッジ名

Oracle Event Processing HadoopカートリッジはカートリッジID com.oracle.cep.cartridge.hadoopを使用します。

5.1.2 Oracle CQLでのHadoopデータ・ソースの使用

既存のHadoopシステムにあるファイルをイベント処理ネットワークに統合することで、Oracle Event Processingに付随するHadoopサポートを使用できます。ファイルを統合することにより、Oracle CQLコードからそのファイルのデータにアクセスできます。

ここでは、以下の項目について説明します。

5.1.2.1 Oracle Event ProcessingとHadoopの統合の構成

Oracle Event ProcessingからHadoopを使用するには、まずOracle Event ProcessingサーバーとHadoopサーバーの両方で次のように構成を変更する必要があります。

  • Oracle Event Processingサーバーで、サーバーのbootclasspathにHadoop構成ファイル(core-site.xmlhdfs.xmlおよびmapred.xml)を追加します。

  • Hadoopサーバーで、Pig JARファイルをlibディレクトリにコピーし、hadoop-env.shに定義されたHADOOP_CLASSPATHの一部として含めます。

注意:

カートリッジを介したHadoopデータ・ソースとの接続には、多くの入出力操作が必要になる可能性があり、アプリケーションのデプロイ解除でタイムアウトになったり、エラーが発生して、アプリケーションを再びデプロイできなくなったりします。Hadoopカートリッジを使用するアプリケーションのデプロイを解除する前には、必ずアプリケーションへのイベント・フローを中断してください。

5.1.2.2 HadoopシステムのファイルのEPNへの統合

既存の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>

5.1.2.3 Oracle CQLでのHadoopデータの使用

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>

5.2 NoSQLデータ・カートリッジ

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のライセンスが必要です。

5.2.1 Oracle CQLプロセッサ問合せ

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を使用するランナウェイ問合せはサポートされません。ランナウェイ問合せの実行時間は、オプティマイザが予測する実行時間より長くなります。

5.2.2 データ・カートリッジ名

Oracle Event Processing NoSQLカートリッジはカートリッジID com.oracle.cep.cartridge.nosqldbを使用します。

5.2.3 Oracle CQLでのNoSQL Databaseの使用

Oracle Event Processing NoSQL Databaseデータ・カートリッジをCQLアプリケーションで使用するには、そのアプリケーションの1つ以上のアプリケーション・スコープ・カートリッジ・コンテキストでカートリッジを宣言および構成する必要があります。

5.2.3.1 NoSQL DatabaseのEPNへの統合

既存のNoSQL Databaseの統合は、リレーショナル・データベースの表を統合する方法と似ています。NoSQL Databaseの場合、EPNアセンブリ・ファイルを次の方法で更新します(手順3の例を参照)。

  1. NoSQLデータ・ソースを参照するために、ネームスペース宣言を追加して、store要素をサポートします。

    変更では、schemaLocation属性にネームスペース・スキーマの場所を、ネームスペースおよび接頭辞の宣言とともに追加する必要があります。

    • http://www.oracle.com/ns/oep/nosqldb http://www.oracle.com/ns/oep/nosqldb/oep-nosqldb.xsd

    • xmlns:nosqldb="http://www.oracle.com/ns/oep/nosqldb"

  2. store要素を追加して、NoSQL Databaseをリレーション・ソースとしてイベント処理ネットワークに統合します。

    ストア要素では、次の属性(すべてが必須)をサポートします。

    • id: CQL問合せでキー/値ストアを参照するために使用される名前。

    • store-name: キー/値ストアの名前で、ストアの作成時にKVStoreConfigクラスで指定した名前と一致させる必要があります。

    • store-locations: ストア内のアクティブ・ノードの1つ以上のホスト名およびポート。属性値は、空白区切りのリストで、各エントリはhostname:portの形式です。指定したホスト名およびポートの値を持つノードは、ストアに最初に接続したときに、順番に接続されます。

    • event-type: このリレーションのためにストア内の値から取得されたすべてのオブジェクトのオブジェクト型。属性値は、wlevs:event型リポジトリ・エントリで指定されたwlevs:event型エントリの名前に対応する必要があります。

  3. table-source要素を追加して、NoSQL Databaseを問合せが実行されるプロセッサに接続します。

次の例は、イベント処理ネットワークを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要素を宣言して、同一または異なるストアから異なるデータ型の値を返すことができます。

5.2.3.2 Oracle CQLでのNoSQLデータの使用

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より大きいイベントにさらに制限されます。

5.2.3.2.1 NoSQLストアからのエントリ取得に使用されるキーの書式設定

ストアからのエントリ取得に使用されるキーは、値をスラッシュ(/)で始めるか、スラッシュを省略するかのいずれかの方法で書式を設定できます。

等価リレーションの左側に指定した値がスラッシュで始まる場合、キーは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つのフィールドにフル・キー・パス式を格納する必要があります。