45
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Embulk-plugin-inputの作り方

Last updated at Posted at 2015-02-03

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

作成したプラグイン

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

ソースコード

モジュール・クラス

モジュールは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にコントリビュートしてもらえればと思います

45
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?