Embulk-plugin-inputの作り方

  • 42
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Bulk Loadに特化したOSS Embulk
まだ出始めなのでプラグインが少ないため、自己学習のため簡単なものを作ってみました
理解しているとは言えませんが、参考になればと思い、私が作った内容をシェアします

作成したプラグイン

指定ディレクトリ配下のファイルリストを取得するだけのinputプラグインです
下記githubにあげてみました

https://github.com/tadaichiro/embulk-plugin-input-fileinfo

ソースコード

モジュール・クラス

モジュールはEmbulk
クラスは任意の名前ですが、InputPluginを継承してください
また0.5(or 0.4?)からEmbulk配下にmodule Inputが必要となっています

またファイル名がinput_xxxからxxxx(プラグイン名のみ)に変わり、ディレクトリ構成がembulk/lib配下からembulk/lib/inputに変わったのでファイル名とディレクトリにも留意ください

fileinfo.rb
module Embulk
  module Input
    class InputFileInformation < InputPlugin

実装メソッド

以下の3種類を実装する形になります

  • self.transaction
  • initialize
  • run

self.transaction

ここでは3つの変数を定義します

まず一つはtask
ここにはconfig.ymlで記載した内容など実行する際に必要な情報を詰め、後続に渡します

なおconfig.paramのdefault属性を付与しない場合は必須項目となり、設定しない例外が発生します

fileinfo.rb
def self.transaction(config, &control)

  rootdir = config.param('rootdir', :string)
  ext = config.param('extension', :string, default: '*')
  sizelowerlimit = config.param('sizelowerlimit', :long, default: 0)

次にcolumns
これはinputプラグインが最終的に作成するスキーマ構造を定義します

fileinfo.rb
columns = [
  Column.new(0, 'FILE_NAME', :string),
  Column.new(1, 'FILE_PATH', :string),
  Column.new(2, 'FILE_SIZE_RAW', :long)
]

なおColumnに適用できる属性は下記5つとなります

  • :boolean
  • :long
  • :double
  • :string
  • :timestamp

参照: https://github.com/embulk/embulk/blob/master/lib/embulk/column.rb

そしてthreads
これは実行スレッド数を定義します
今回は単なるファイル検索のためスレッドを1とベタ打ちしています

fileinfo.rb
threads = 1

これらを定義した後にrunに渡すためにyieldを実行します

fileinfo.rb
commit_reports = yield(task, columns, threads)

initialize

今回は使いませんでしたがrun実行前の処理と思っています

run

名前の通り実際の処理を記述する場所です
self.transactionで作成したスキーマ定義(columns)と同じ順序で@page_builderにaddし、最後に@page_builder.finishで確定させます

fileinfo.rb
Dir.glob(rootdir + '/**/*') {|f|

  next unless FileTest.file?(f)

  s = File::stat(f)

  next if ext != "*" && File::extname(f) == ext 
  next if s.size < sizelowerlimit * 1024 * 1024

  @page_builder.add([File::basename(f), File::dirname(f), s.size])
}
@page_builder.finish

最低限以上のものを実装すればプラグインとして動作します

テスト方法

テストを実施するためにはまずbundleコマンドを実行します

java -jar embulk.jar bundle ./embulk_bundle

実行後./embulk_bundleフォルダが作成されます
このフォルダ配下にembulkフォルダがあるので、ここに今作成した.rbファイルを置きます

あとは通常と同様にconfig.ymlを作成してguess, preview, runを実行すればプラグインが動作するので、テストができるという手順です

ただしbundleで実行するので必ず-bで先ほど作成したフォルダを指定してください

java -jar embulk.jar run ./config.yml  -b ./embulk_bundle 

gem installするような追加ライブラリを使いたい場合

例えばaws-sdkライブラリのように、通常のRubyならgem installして使うようなライブラリを使いたい場合があるかと思います
その場合以下の手順を踏んでください

1. bundleコマンドでbundle用フォルダを作成する

java -jar embulk.jar bundle ./embulk_bundle

2. 作成されたフォルダ内のGemfileファイルに必要となるライブラリ名を追加します
ここではaws-sdkを指定します

Gemfile
gem 'aws-sdk', "~> 1.59.1"

3. もう一度bundleコマンドを実行します

java -jar embulk.jar bundle ./embulk_bundle

この手順を踏むとGemfile.lockが更新され、依存するライブラリが登録されます
後は「テスト方法」と同様の手順で実行すればOKです

手順は以上となります

私のようなOSS初心者でも非常に簡単にプラグインが作成できるので、ぜひ作成してEmbulkにコントリビュートしてもらえればと思います