Bulk Loadに特化したOSS Embulk
まだ出始めなのでプラグインが少ないため、自己学習のため簡単なものを作ってみました
理解しているとは言えませんが、参考になればと思い、私が作った内容をシェアします
作成したプラグイン
指定ディレクトリ配下のファイルリストを取得するだけのinputプラグインです
下記githubにあげてみました
ソースコード
モジュール・クラス
モジュールはEmbulk
クラスは任意の名前ですが、InputPluginを継承してください
また0.5(or 0.4?)からEmbulk配下にmodule Inputが必要となっています
またファイル名がinput_xxxからxxxx(プラグイン名のみ)に変わり、ディレクトリ構成がembulk/lib配下からembulk/lib/inputに変わったのでファイル名とディレクトリにも留意ください
module Embulk
module Input
class InputFileInformation < InputPlugin
実装メソッド
以下の3種類を実装する形になります
- self.transaction
- initialize
- run
self.transaction
ここでは3つの変数を定義します
まず一つはtask
ここにはconfig.ymlで記載した内容など実行する際に必要な情報を詰め、後続に渡します
なおconfig.paramのdefault属性を付与しない場合は必須項目となり、設定しない例外が発生します
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プラグインが最終的に作成するスキーマ構造を定義します
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とベタ打ちしています
threads = 1
これらを定義した後にrunに渡すためにyieldを実行します
commit_reports = yield(task, columns, threads)
initialize
今回は使いませんでしたがrun実行前の処理と思っています
run
名前の通り実際の処理を記述する場所です
self.transactionで作成したスキーマ定義(columns)と同じ順序で@page_builderにaddし、最後に@page_builder.finishで確定させます
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を指定します
gem 'aws-sdk', "~> 1.59.1"
3. もう一度bundleコマンドを実行します
java -jar embulk.jar bundle ./embulk_bundle
この手順を踏むとGemfile.lockが更新され、依存するライブラリが登録されます
後は「テスト方法」と同様の手順で実行すればOKです
手順は以上となります
私のようなOSS初心者でも非常に簡単にプラグインが作成できるので、ぜひ作成してEmbulkにコントリビュートしてもらえればと思います