壁への叫び声

誰にも届かない一方通行のつぶやき

embulkの利用に苦しんだ話

BIによるデータ解析をするため、社内の各システムからBI用の
DBに情報を集約することになった。

初期開発はベンダが参戦しており、
digdag(スケジューラソフト) と embulk(データ転送ソフト)を使ったデータの自動連係が実現されていた。

ベンダが撤退した後のBIデータのお守りを任されたのが私です。

ボスからの指令は、新しくダッシュボードを作成したい。他システムの
データを活用したいから、データ連携を実装してくれというものです。

ETL(Extract Transform Loadの略)も知らない人間がいきなりこんなところにぶち込まれたわけです。
手も足も出ませんが、お仕事はやらざるえません。
単語の意味を調べつつお仕事が始まりました。

 

 

まずはざっくりとした流れを整理しました。
アプリケーションの役割を調べ、どのように連携をしているのか。
一つずつ整理していくと以下のような流れです。

社内システムにてデータを蓄積する。

毎日cronを使い、シェルを実行する。

シェルはdigdagを実行することが目的。

digdagが処理のフローを制御する。
制御しているのは、SQLの実行とembulkによるデータ整理。(ログ出力や例外管理も)

embulkにより整理されたデータは、SQLプラグインを通し、BI用DBへ格納される。
格納されたデータはdigdagがコールするSQLにより、さらに修正される。

以上がETLサーバで実行されていること。
(連携データの中には、csv等もあったため、ファイルサーバ利用もあったため複雑なところも多かった・・・)

BIソフトはBI用DBに格納されたデータを見に行くだけなので、
データさえ入っていれば操作は苦労しない。

ここまでがざっくりとした処理の流れです。

 

担当初期はBIを使うことを目的としたため、BI用DBへ入り込み、データを直接格納していました。
ただ、このままの運用を続けると私はロボットになってしまうため、自動化しなければなりません。
ここからが本題です。
embulkを使えるようになろう!(digdagも)

というわけでembulkを勉強し始めました。

3分後挫折です。
意味が理解できない。

なぜかみんな本体とプラグインをインストール後設定ファイルを記述し始める。
しかも設定ファイルと言いつつ、データのやり取りを記述している。
それは設定なのか?実行のためのプログラムではないのか?

しかも記述方法はみんなご存じのこれね(ymlこれは私の勉強不足ですごめんなさい。)ってな感じ。

設定ファイルの書き方の説明もないものですから、置き去りになってました。
で次に出てくるのが完成した設定ファイル。

今からマラソンが始まるから準備運動をしようと考えていた私に対して、ゴールしましたという宣言。
キューピー3分クッキングでもやり方を説明した後に3時間煮込んだものがこちらですと出してくれるというのに、
オープニングトーク終わった時点で、今日のレシピを口に突っ込まれました。


一流のエンジニアならばこんな状態だとしても、それを飲み込み自分の血肉にすることができるでしょうが、
私は牛のような三流エンジニアです。かみ砕いた後、反芻しないと血肉になりません。
噛んでないので窒息死です。

取り合えず一度死んだため、現実逃避として書いているのがこの文章です。

ここから先は勉強した私が書いてくれる内容になるはずです。
わかりやすそうなページを見つけたため進めそうな気がしてきました。

exampleの実行でお試しファイルの作成
なるほど。お試しでやってみるということですね。
できれば全体像を把握してから進みたかったのですが、ないものは仕方ない。
seed.ymlを作成できました。

guess機能を実行します。
???
英語力も皆無ですので、わかりません。調べてみると推測する。なるほど。
学習レベル:中学以上の水準
初めて見ました。私の通っていた学校では使わない単語だったようです。
今回覚えたので、wordleで使ってみます。

続きを読むと第一段階でのやりたいことがわかりました。
seed.yml→インプットとなるデータのパスを記載する。(DBならばサーバ情報やテーブル名を記載することで代用できそう)
seedを引数にしてguess機能を実行すると、
データを読み取り、インプット情報となる、カラム名称や型を推測しインプット情報を具体化する。
自分でこれができるならば不要ではありますが、初学者には助かる機能です。
seedから発芽しました。budです。(英語力皆無なので調べました。)
guessの実行結果はbud.ymlとしましょう。

bud.ymlには現在インプット情報がしっかり記載されています。アウトプットは標準出力のままです。
guessはあくまで推測なので、これを修正する必要もあるでしょう。
とりあえずあっているとして、先へ進みます。

preview機能
これは何となくわかりそうです。
データの更新等の機能を実行せず、現在の仕様でのアウトプットを確認できる機能でしょう。
今はインプットとアウトプットだけなので、嬉しさはあまりなさそうですが、
本来ならばデータ整理などの構文も追加できるはずなのでよく使う機能になりそうです。

run機能
ymlを実行する機能ですね。
あれ?やっぱりymlを設定ファイルというのには違和感を感じます。
最初に感じたプログラムということには、違うものだと認識できました。

というところで解説が終わりました。
うん。まだ1/3程しかわかってない気がする。
ただ今の状態でゲスするならばアウトプットに関しては出力先を指定してあげればguess機能が補完してくれそうな気がします。
データの整理については、もっと調べる必要がありそうです。
また、インプットとアウトプットを利用するにあたり、それに該当するプラグインを導入し、プラグインのreadmeから情報を
取得する必要がありそうです。

探す記事でどうしてもわかりにくい理由がこのプラグインベースのシステムであるため、
利用者によって勝手が変わってしまうため記事では説明しにくいのが理由な気がします。

とりあえずの方針として種を用意してそれを機能とreadmeで補完しながら育てるのがよさそうな気がしてきました。
ということで一度動かしてみます。