Embulkのカスタマイズ(新規プラグインの作成)方法のメモ。
|
|
|
Embulkでは、プラグインを作る為のソース類一式(プロジェクト)を初期生成するコマンドも用意されている。
newコマンドを使ってプロジェクトを作成するが、引数無しで実行すると、作成できるプロジェクト(プラグイン)の種類の一覧が表示される。
$ embulk new 2015-10-03 08:22:03.596 +0900: Embulk v0.7.5 Usage: newcategories: 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
S3やHDFS上のファイルとか)を扱う入出力が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プラグインの指定を追加する必要がある。
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を実行する。
作成したプラグインを試しに実行する場合は、previewやrunコマンド等の引数に「-L プロジェクトの場所
」を付ける。
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]
〜
version = "0.1.1"
〜