SnowflakeにEmbulkでデータをETL(AWS S3編)

はいさーい!ちゅらデータでPHP書いているaipaです。
みなさまEmbulkというOSSはご存知でしょうか。小さいデータから巨大なデータまでいろんなデータソースへバルク処理してくれるぱっとみシンプルだけど知れば知るほど多機能なすごいやつです。

今回はEmbulkを使って、AWS S3からSnowflakeへデータを保存するまでの手順を紹介します。Embulkはデータソースごとにpluginが用意されており、OSSで用意されたinとoutのpluginを組み合わせることでETLを簡単に実現することができます。

S3に対応したinput plugin「embulk-input-s3」はすでに知らていると思いますが、なんと!snowflakeに対応したplugin、「embulk-output-snowflake」があります!

これなら簡単に試すことが出来ますね!!
そんな風に考えてた時期が僕にもありました


はじめに

  • Embulkを使って、S3からSnowflakeへデータを飛ばそう
  • Dockerを使ってEmbulkを実行する

 

この記事を作成するにあたって使用した環境について

認証情報の用意(AWS)

S3へアクセス可能なIAMユーザーの用意とアクセスキーを発行します。

今回の記事では省略します。
https://qiita.com/rh_/items/24ed1cebbdc3a731aabb

認証情報、DB等の用意(Snowflake)

Snowflakeへの登録手順、今回書き込むリソースの用意などはこの記事では省略します。
ユーザー名、パスワード、アカウントURL、作成するDB、WH名などをメモしておいてください。

 

Embulk実行環境の用意

今回は、Dockerを使ってEmbulkを実行できる環境を用意します。
めんどくさそう?大丈夫、すぐできます。

沖縄のDockerおじさんとのことhotoさんのお力をお借りします。
https://qiita.com/hoto17296/items/a7d69172050fa9aab045

Dockerおじさんが用意したDockerfileを少し修正します。
今回S3 → Snowflakeを行うにあたり利用するデータをpluginを使って用意します。 

 1. embulk-input-randomjで用意したdummyデータをembulk-output-s3でS3へ保存する
 2. 1で保存したデータをembulk-input-s3で取得し、embulk-output-snowflakeでSnowflakeへ保存する

そのため、利用するpluginをDockerfileへ追記しておきます。


Dockerfileが用意できたら、イメージをビルドします。


Dockerfileが用意できたら、イメージをビルドします。

準備おkです!!!

 

データの用意

先程記載した手順に沿って、Embulkを実行していきます。
エディタを利用してdummyデータ作成用のconfig.ymlを作成します。

※${}の箇所はご自分の環境や準備したリソースにあわせて修正してください。(以後、黄色のハイライト表示)

用意ができましたら、早速実行していきましょう。

うまくいったようです!それではブラウザでS3のBucketを確認してみましょう。

アップロードされていました!これでデータの準備も完了しました。

 

S3 → SnowflakeでETL

それではSnowflakeへデータをETLしていきたいと思います。

ETLを実行するためのconfig.ymlを用意していきましょう。
最初に細かく設定していくのも良いですが、先程用意したデータは列の数が多く手で用意するのは面倒なので、Embulkのguessオプションを使って少し楽をしたいと思います。

最低限の設定だけ記載しているseed.ymlを作成します。

guessオプションを実行して、inputの列やファイルフォーマットを自動推測します。

できました!この量のテキストをちまちま入力するのは面倒だと思うのでとても便利ですね!

次にoutputのsnowflakeの設定を用意します。
項目の意味などはドキュメントを参考にしました。
https://github.com/trocco-io/embulk-output-snowflake

はい。これで準備が整いました。いざETL!!ETL!!!ETL!!!!

おや・・・・?
どうやらだめなようです。

「Error: org.embulk.config.ConfigException:」なので、入力必須の項目があるようです。
エラーにも記載がありますが、「url」が必要とのこと。はて???

https://github.com/trocco-io/embulk-output-snowflake
githubのREADME.mdを確認してもそのような項目は見当たりません。またソースコードをみてもそのような設定も見当たりませんでした。

はて???

腑に落ちない状況ですがとりあえずエラーに従うことにしました。

6行目に「url」を追記しました。

もう一度試してみます。

エラーが変わりましたが、またもやよくわからないエラーが。。。

どうやらdriverがないとのこと。ドライバー?????
もう一度githubのコードをよく読む僕、見つからない設定
https://github.com/trocco-io/embulk-output-snowflake/blob/master/build.gradle

そもそもビルドするときに依存で一緒にまとめられるようにビルド設定されてるようだけどなぜ????

ワケガワカラナイヨ

わけがわからないので、ぐーぐるのインデックスの海をさまよっているところ下記サイトを見つけました。
https://rdoc.info/gems/embulk-output-snowflake

RubyDocInfo???(Rubyはあまり詳しくない)、Rubyで実装されていたのか?など疑問に思っていたのも束の間


なんと!!「driver_path」と「url」の項目があります!!!
どうやらgem installでインストールされている「embulk-output-snowflake」は別物のようです(多分)
これに従い、設定の修正とdriverのインストールを行いました。

ドライバーをダウンロードしてきて、config.ymlを修正しました。

こーんーどーこーそーーー!!

orz

なーーんーーでーーやーーねーーーん

次回へ続く
冗談さておき、マジでもうよくわかりません。

ここまでの流れを整理しましょう。
●githubにある「embulk-output-snowflake」がgemでインストールされない
●infoにある「embulk-output-snowflake」がgemでインストールされるようだけどうまく動かない

もう記事書くのあきらめようかな?とか思っていましたが、githubのREADME.mdみていると
https://github.com/trocco-io/embulk-output-snowflake

ここに目がいきました。なるほど、ビルドして動かしてみるのもありだなと思いました。

RubyDoc.infoのpluginはソースがどこにあるのかわからないですが、githubのやつはcloneしてビルドすれば動かせるのではと思いました。ということで早速やっていきましょう。

Dockerおじさんに習って、ビルド環境もDockerコンテナでできないかなと探してたところ、下記記事が見つかりましたので参考にしました。
https://qiita.com/TakiTake@github/items/60b27581166efad24354

あとからわかったことですが、この記事で利用するDocker imageにはgitがインストールされていません。今回のビルドにはgitコマンドが必要なので、Docker imageを新規で作成する必要があります。
https://hub.docker.com/r/takitake/gradle-alpine/dockerfile

そして、なぜかcurlコマンドが必要なのにインストールされておらず、docker build途中でエラーになるため、そいつもインストールするようにしておきます。

Dockerfileが用意できたら、イメージをビルドします。

イメージ用意できたら、プロジェクトをビルドしていきます。

おk!

それではembulkから読み込んでみたいと思います。
自作した(僕が作ったわけじゃないけど)Pluginを読み込むには?でぐぐると下記記事が。
https://gist.github.com/hiroyuki-sato/b9d76bd882efa6e29ae16e01396c82ae

githubのディレクトリをのぞいてみると、「lib」ディレクトリの最下層にrbファイルがある。embulkのオプションの「-I」で指定することでインストールすることなく動作確認することができるようだ。

というわけで試す(藁にもすがる思い)

お!???エラーが変わったぞ!!!

どうやら「host」を設定せよというエラーに変わりました。この項目はgithubのソースに含まれています。これはうまくビルドできたのではないでしょうか!?

というわけで修正します。

修正後再度実行!

!!!!!!!!!!!!!!

やたーーーーーー!!!!

できました!!!!

snowflakeへログインしてデータが入っているか確認します。

入っているようです!やったー!!!

 

まとめ

すぐできると思っていた内容にめちゃめちゃハマりました。

とりあえずは、githubのpluginをcloneしてきてビルドすれば動くことが確認できたのでもし試す人いましたらこの手順通りにやると良いのかなと思います。

それではー

 

Snowflakeに関するお問い合わせはサービス/研修のお問い合わせからご連絡ください。



DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。

このページをシェアする: