EmbulkをJavaアプリケーションから呼び出す際に、自作のアウトプットプラグインを使う方法をメモ。
自分の目論見としては、EmbulkでRDBのテーブルからデータを読み込み、Asakusaアプリケーションの入力としたい。
AsakusaFWではImporter(Format・Reader)を作れば独自の読み込み処理が出来るので、Embulkと連携できないかなーと考えた。
そこで、まず、Embulkの出力部分であるアウトプットプラグインの使い方を見てみた。それ自体は意外と簡単。(googleライブラリーのインジェクション機構の使い方は Xtextである程度知っていたおかげでもある)
で、結論から言うと、上記の方式のEmbulk-AsakusaFW連携は難しそう。
Embulkのアウトプットプラグインは、読み込んだデータを受け取るメソッドを実装する。つまり、データが読み込まれると、自分のメソッドが呼ばれる。
AsakusaFWのReaderは、(InputStream等から)データを読み込んでデータモデルに変換するメソッドを実装する。つまり、自分のメソッド内でreadメソッドを呼んでデータを取得する、という形になる。
なので、AsakusaFWのReaderからEmbulkのアウトプットプラグインのデータを読み込む(データを受け渡す)方法が面倒。
(しかもアウトプットプラグインはマルチスレッドだし)
PipedInputStream,PipedOutputSreamを使えば出来そうな気もするけど、せっかくパースされたデータをアウトプットプラグインで受け取っているのに、またバイナリーに変換して渡すのはどうなの、と思う(苦笑)
ConcurrentLinkedQueueとかを用いれば出来るかもしれないが。
結局、Embulkは素直に独立したツールとして使うのが良さそう。
つまり、AsakusaFWとEmbulkの連携は、例えばEmbulkでRDBから読み込んでHDFS上に書き出し、AsakusaFWでHDFSから読み込むという形にする。
ちなみに、RDBからのデータ読み込みだと、WindGateよりEmbulkの方が良さそう。(RDBへの書き込みは試してない)
WindGateはポータブルなデータ転送ツールなので、あまり凝ったことはしていないし(エラー時のリトライくらいはあるけど)、今後もWindGateが強化されることは無いだろう。
(WindGate-SSH(JDBCによる読み込み→MapRクラスターへのssh転送→MapR FSへの書き込み)とEmbluk(JDBCによる読み込み→NFSマウントされたMapR FSへの書き込み)という処理だと、Embulkの方が速い)
(WindGateはシングルスレッドでしか動作しないが、Embulkは(インプットプラグイン次第だが)マルチスレッドで動作するし)
なお、今まで当ブログでは「PG(Hadoop)」というカテゴリーを作り、その中でHadoopおよびHadoop派生関連(Asakusa Frameworkとか)を扱ってきたけれど、そろそろそぐわなくなってきた気がするので「PG(分散処理)」に名称を変えた。
なにせ、EmbulkをHadoopカテゴリーに入れるのはさすがに違和感があるので(笑)