S-JIS[2015-10-03/2023-08-11] 変更履歴

Embulk カスタマイズ

Embulkのカスタマイズ(新規プラグインの作成)方法のメモ。


概要

Embulkでは、プラグインを作る為のソース類一式(プロジェクト)を初期生成するコマンドも用意されている。

newコマンドを使ってプロジェクトを作成するが、引数無しで実行すると、作成できるプロジェクト(プラグイン)の種類の一覧が表示される。

$ embulk new
2015-10-03 08:22:03.596 +0900: Embulk v0.7.5
Usage: new  
categories:
    ruby-input                 Ruby record input plugin    (like "mysql")
    ruby-output                Ruby record output plugin   (like "mysql")
    ruby-filter                Ruby record filter plugin   (like "add-hostname")
    #ruby-file-input           Ruby file input plugin      (like "ftp")          # not implemented yet [#21]
    #ruby-file-output          Ruby file output plugin     (like "ftp")          # not implemented yet [#22]
    ruby-parser                Ruby file parser plugin     (like "csv")
    ruby-formatter             Ruby file formatter plugin  (like "csv")
    #ruby-decoder              Ruby file decoder plugin    (like "gzip")         # not implemented yet [#31]
    #ruby-encoder              Ruby file encoder plugin    (like "gzip")         # not implemented yet [#32]
    java-input                 Java record input plugin    (like "mysql")
    java-output                Java record output plugin   (like "mysql")
    java-filter                Java record filter plugin   (like "add-hostname")
    java-file-input            Java file input plugin      (like "ftp")
    java-file-output           Java file output plugin     (like "ftp")
    java-parser                Java file parser plugin     (like "csv")
    java-formatter             Java file formatter plugin  (like "csv")
    java-decoder               Java file decoder plugin    (like "gzip")
    java-encoder               Java file encoder plugin    (like "gzip")

examples:
    new ruby-output hbase
    new ruby-filter int-to-string

プラグインを作る言語がJavaかRubyか、プラグインの種類はinput/outputかparserか、等に応じて引数を決める。

ちなみにinput/outputとfile-input/file-outputの違いは、ファイル(ローカルファイルとかAmazon S3HDFS上のファイルとか)を扱う入出力がfile-input/file-outputで、それ以外(例えばDBアクセス)はinput/ouputとなるようだ。
ファイルのフォーマットに関するプラグインを作りたい場合はparser/formatter、ファイルの圧縮に関するプラグインの場合はdecoder/encoderを選択する。


プラグインのAPI(プラグインに関するクラスやメソッド)は、Embulkのバージョンによって変わることがある。

古いバージョンのEmbulkでプラグインを作った場合、migrateコマンドを使用することで、ソースを新バージョンのAPIに書き換えてくれるらしい。


プロジェクトの作成例

「example-myformat」という名前のプラグインを作る例。

$ embulk new java-parser example-myformat
2015-10-03 08:57:25.236 +0900: Embulk v0.7.5
Creating embulk-parser-example_myformat/
  Creating embulk-parser-example_myformat/README.md
  Creating embulk-parser-example_myformat/LICENSE.txt
  Creating embulk-parser-example_myformat/.gitignore
  Creating embulk-parser-example_myformat/gradle/wrapper/gradle-wrapper.jar
  Creating embulk-parser-example_myformat/gradle/wrapper/gradle-wrapper.properties
  Creating embulk-parser-example_myformat/gradlew.bat
  Creating embulk-parser-example_myformat/gradlew
  Creating embulk-parser-example_myformat/build.gradle
  Creating embulk-parser-example_myformat/lib/embulk/parser/example_myformat.rb
  Creating embulk-parser-example_myformat/src/main/java/org/embulk/parser/example_myformat/ExampleMyformatParserPlugin.java
  Creating embulk-parser-example_myformat/src/test/java/org/embulk/parser/example_myformat/TestExampleMyformatParserPlugin.java
  Creating embulk-parser-example_myformat/lib/embulk/guess/example_myformat.rb

Plugin template is successfully generated.
Next steps:

  $ cd embulk-parser-example_myformat
  $ ./gradlew package

newコマンドの最後の引数で、作りたいプラグイン名を指定する。
作成されたプロジェクトの名前にはプラグインの種類とプラグイン名が使われる。

プラグインを実際に使う際には、YAMLファイル内に「type: プラグイン名」で自分が作ったプラグイン名を指定することになる。
(プロジェクトを作る際に指定した名前にハイフン「-」が含まれていた場合、実際のプラグイン名ではアンダースコア「_」になる)


プロジェクトを作ったら、Gradleのpackageコマンドを使って最初のビルドを行う。
(newコマンドを実行したら、実行結果として、次にやる作業が表示されている。なんて親切なんだ(笑))

(gradlewコマンドは生成されたプロジェクト内に入っているので、Gradleのインストールといった作業は不要)

$ cd embulk-parser-example_myformat
$ ./gradlew package

プロジェクトをEclipseで扱いたい場合は、build.gradleにEclipseプラグインの指定を追加する必要がある。

プロジェクト/build.gradle:

plugins {
    id "com.jfrog.bintray" version "1.1"
    id "com.github.jruby-gradle.base" version "0.1.5"
    id "java"
    id "eclipse"
}
〜
$ ./gradlew cleanEclipse eclipse

プラグインの単体テスト

プラグインの単体テスト用のクラスは提供されていない。
ただ、各プラグインでEmbulkPluginTesterというクラスを作って使っているようなので、他のプラグインを参考にするのがよさそう。

テストの実装方法の方針としては、EmbulkEmbed自作プラグインを登録してEmbulkを実行する。

Javaパーサープラグイン用のテストクラスを作ってみた


作成したプラグインの試行

作成したプラグインを試しに実行する場合は、previewやrunコマンド等の引数に「-L プロジェクトの場所」を付ける。

example_myformat.yml

in:
  type: file

  parser:
    type: example_myformat

out:
  type: stdout
$ cd /tmp/embulk-parser-example_myformat
$ ./gradlew package

$ cd /tmp/embulk-test-dir
$ embulk run -L /tmp/embulk-parser-example_myformat example_myformat.yml

自作プラグインのソースを修正したら「gradlew package」でコンパイルを行い、その後でEmbulkを実行する。

-Lを付けると、そこで指定したディレクトリー内のclasspathというディレクトリーにあるjarファイルが実行時に使われる。[2017-01-27]


リリースしたら、それを自分の環境にもインストールすると思う。
その後、さらに何か修正をして試したい場合、build.gradle内のバージョンを上げておかないと、「-L」を付けて実行しても認識されない。[2015-10-21]

build.gradle:

〜
version = "0.1.1"
〜

Embulk目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま