HadoopTimes

ストリーミングアーキテクチャ Apache Kafka とMapR Streams による新しい設計手法
技術情報

MapRをRubyと統合する: JRubyで使うMapR-DBとMapR Streams

MapR StreamsとMapR-DBは、どちらもMapR コンバージドデータプラットフォームおける非常に興味深い製品です。本ブログでは、MapR-DBおよびMapR Streamsを使ってRubyコードをネイティブに相互作用させる方法をご説明したいと思います。

筆者は、Ruby開発者で、ちょうど、HBaseとKafkaのためのRubyクライアント/ライブラリが、MapR上で正常に動作していないため、RubyコードをMapR製品とネイティブに相互作用させる方法を調べたところです。結果として、JavaサンプルプログラムをJRubyへ移植する方法を発見することでこの問題を解決できました。

本稿中には、JavaコードをJRubyへ移植する方法(完全なスレッドを備えたJavaによるRubyの実装)をご案内するため、いくつかのJavaサンプルプログラムが含まれています。それでは始めましょう!

本ブログ記事のソースコードはこちらからダウンロードできます。

また、その他の関連性の強いソースコードはこちらです。

基本 – MapR クライアントライブラリのローディング

JRuby は、Javaコードおよびライブラリのインターフェースを実装しつつ、可能な限りRubyの様式を踏襲しています。しかし、Javaのクラスを探し出すためには、Gem または Ruby のソース・ファイルを読み込むのと同様にそれらのJARを読み込む必要があり、すべてを読み込ませるために、多少乱暴な方法を採流ことにしました。(確認した限り、パフォーマンスには影響ありませんでした。)それは、すべてのRubyスクリプトの上部に以下の記述挿入し、すべてのMapR JARを参照することができるようにスクリプトを作成するといった手順です。

Javaをインクルードする

Dir["/opt/mapr/lib/\*.jar"].each { |jar| require jar }

これは、MapRが/opt/maprにインストールされている場合にのみ有効です。しかし、そのデフォルト設定で実行していない場合としても、変更は簡単です。

MapR-DB をJRubyで使用する

これで適切なJARを参照することができたので、後はコードをJavaからRubyへ移植するだけとなります。これは一連の作業で、単純にJavaにおいて使用されたコンストラクトを取ってきて、それらを”Ruby.”に改めるだけです。たとえば、ここに、MapR-DBデモからとった次のコードがあります。

Table table;
if (!MapRDB.tableExists(tableName)) { 
    table = MapRDB.createTable(tableName); // Create the table if not already present } else { 
    table = MapRDB.getTable(tableName); // get the table 
}

移植後:

table = nil
if !MapRDB.tableExists(tableName)
    table = MapRDB.createTable(tableName)
else
    table = MapRDB.getTable(tableName)
end

注意すべきことは、コンストラクタを呼び出す必要があるインスタンスは、次のJava コードになります。

Test test = new Test("arguments");

Rubyコード:

test = Test.new("arguments")

やはり、Javaジェネリックは、JRubyにはないものなので、ほとんどの場合、それらを無視して問題はありません。JRubyコンパイラ/インタプリタが型を判別できないシナリオもあるかもしれませんが、必ず対応策が見つかるはずです。

MapR-DBで動作させる限り、単純にJavaで使用されるものと同じAPIを使用することができます。

(http://maprdocs.mapr.com/apidocs/maprdb_json/51/com/mapr/db/MapRDB.html). 新規のドキュメント作成するために以下の2つの方法があります。

document = MapRDB.newDocument()
      .set("_id", "jdoe")
      .set("first_name", "John")
      .set("last_name", "Doe")
      .set("dob", ODate.parse("1970-06-23"))
table.insertOrReplace(document)

APIの代わりにJSONフォーマットを使用することもできます。

document = MapRDB.newDocument('{"_id" : "test", "first_name" : "John", "last_name" : "Doe", "dob" : "1970-06-23"}')
table.insertOrReplace(document)

JRubyを用いるMapR-DBの基本は、ほぼ上記の通りです。詳細については、ソースコードファイル”maprdb.rb”をご確認ください。注意する点として、デフォルトで作成されたテーブルが、MapR-FS上にあるカレントユーザーのユーザーディレクトリに保存されることです。mapr以外のユーザーとして実行している場合、必ず、あなたのユーザー用にMapR-FS上へ /users/<username>/ ディレクトリを作成し、そのディレクトリへの読み書き権限を設定してください。

JRubyでMapR Streams を使用する

JavaコードをRubyへ移植するためのベースが完成しているので、StreamsコードはMapR-DBコード同様に単純なものです。唯一の違いは、オリジナルのJava Streamsのサンプルが設定を保存するために「プロパティ」ファイルを使用していて、これらのファイルはRubyスクリプトと同一のディレクトリの中に保管され、本コードにより拾得されるようにしていることです。

(プロパティ・ファイルを用いる)わずかな変更を除いて、本コードは、Javaサンプルプログラムからの単純な移植です。プロデューサーとコンシュマーを知るために、私のGithubページで実際のコードを確認してください。その際は、必ず次のMapR コマンドを用いて本ストリームを作成してください。(本コードを実行するユーザーの適切な権限を設定してください。)

maprcli stream create -path /sample-stream

そして次のコマンドを用いて本トピックを作成します。

maprcli stream topic create -path /sample-stream -topic fast-messages

すべてのユーザーに本ストリームとのインタラクトを許可には、次のコマンドを使用してください。

maprcli stream edit -path /sample-stream -produceperm p -consumeperm p -topicperm p

以上で完成です。本サンプルコードは問題なく動作するはずです。 プロデューサーは、100件のメッセージを作成し、それらをストリームに書き出します。コンシュマーは、認識しているすべてのメッセージを拾得します。本Streamの残り部分は、Java API用のドキュメンテーションと同一です。私はJSONメッセージをStream上に移動することをお勧めします。そうすることで、すべてのプロデューサー/コンシュマーがデータを連動できるからです。

今後の展望

RubyをMapR-DBとMapR Streamsで動作させる方法が確認できました。今後、「コンバージドデータプラットフォーム」を使用した新規プロジェクトが誕生することに期待しています。可能性は本当に無限です。将来的には、StreamsとMapR-DB APIをもっと「Ruby様式」のパッケージにラッピングし、Gemとして提供することを考えています。また、MongoDBで用いられるクエリーシンタックスのAPIを模倣するMapR-DBクエリーAPI(APIベースのクエリーではなく、JSONベースのクエリー)を考えています。このGemのソースが完成したら、GitHubに投稿するつもりです。

ご拝読を感謝いたします!

著者情報

Ryan Victory

ライアン・ビクトリ

(COMERICA BANK シニアインフォーメーションセキュリティエンジニア)

MapR-DB : Hadoop上のNoSQLデータベースで業務及び分析ワークロードを統合

MapR-DB : Hadoop上のNoSQLデータベースで業務及び分析ワークロードを統合
MapR-DBは、エンタープライズグレードの高性能なHadoop上のNoSQLデータベースです。

MapRコンバージド・データ・プラットフォームの一機能として提供され、開発者がスケーラブルなアプリケーションを開発し、リアルタイムなデータ分析を可能とする初めてのHadoop上のドキュメントデータベス機能を提供します。

詳細についてデータシートをご確認ください。

無料ダウンロードはこちら

こちらの記事もおすすめです