dskst's diary

Life and Tech Blog

『GCPUG Shonan vol.27 feat.Dataflow』に参加してきた

f:id:dskst9:20180526203048p:plain

GCPUG Shonan vol.27 feat.Dataflow に参加してきました。
初のGCPUG湘南支部ということでドキドキしましたが、アットホームな雰囲気でとても楽しい時間でした。

gcpug-shonan.connpass.com

今回は Dataflow にテンプレートができたということで、ハンズオンを行いました。
テンプレートが出る前まではmvnなどから直接実行していたようです。。

medium.com

Google Cloud Dataflow

ぬきぽんさんの言葉を借りると「パイプラインのストリーミングとバッチ実行をサポートする、フルマネージド データ処理サービス」です。
AWSっ子にとって Dataflow のイメージは Kinesis で取り込んだデータを Lambda で整形してどっかに渡す一連の処理が一つになったというような感じですかね。

Cloud Dataflow Documentation  |  Cloud Dataflow  |  Google Cloud

GitHub - GoogleCloudPlatform/DataflowTemplates: Big Data Apache Beam Templates

Google Cloud Dataflow ってなんだ?

どんなことやったの?

ぬきぽんさんが作ってきてくれた資料をもとに、実際に Dataflow を作成していきました。

docs.google.com

テンプレートの種類は何個かあり、今回は Cloud Storage Text to BigQuery を使います。 Google-Provided Templates  |  Cloud Dataflow Documentation  |  Google Cloud

※上記Googleサイトは英語表記にしないと全部のテンプレートが表示されないので注意。

ハンズオン!

まずはサンプルデータをコピーします。

$ gsutil cp gs://gcpug-shonan-vol27/jinkounosuii_3004.csv gs://{your_bucket}/gcs-to-bigquery/input/
Copying gs://gcpug-shonan-vol27/jinkounosuii_3004.csv [Content-Type=text/csv]...
- [1 files][  1.6 KiB/  1.6 KiB]
Operation completed over 1 objects/1.6 KiB.
$ gsutil cp gs://gcpug-shonan-vol27/schema.json gs://{your_bucket}/gcs-to-bigquery/bigquery-schema/
Copying gs://gcpug-shonan-vol27/schema.json [Content-Type=application/json]...
- [1 files][  653.0 B/  653.0 B]
Operation completed over 1 objects/653.0 B.

UDFのjsも一旦コピります。

$ gsutil cp gs://gcpug-shonan-vol27/udf.js gs://{your_bucket}/gcs-to-bigquery/udf/
Copying gs://gcpug-shonan-vol27/udf.js [Content-Type=application/javascript]...
- [1 files][  1.2 KiB/  1.2 KiB]
Operation completed over 1 objects/1.2 KiB.

udf.js の中身は下記のような内容です。
ここでデータ整形やごにょごにょやって return すると便利に使えるってことですね。

function transform(line) {
   var values = line.split(',');
    var obj = new Object();
   obj.nenji = values[0];
   obj.setaisuu = values[1];
   obj.soujinkou = values[2];
   obj.otoko = values[3];
   obj.onna = values[4];
   obj.zoukasetaisuu = values[5];
   obj.zoukajinkou = values[6];
   obj.zennkaihi = values[7];
   obj.ichisetai = values[8];
   obj.jinkoumitsudo = values[9];
   var jsonString = JSON.stringify(obj);
    return jsonString;
 }

GCS にデータが入ったので、最後に、Dataflow を実行します。

$ gcloud beta dataflow jobs run text-to-bigquery \
    --gcs-location gs://dataflow-templates/latest/GCS_Text_to_BigQuery \
    --parameters javascriptTextTransformFunctionName=transform,JSONPath=gs://{your_bucket}/gcs-to-bigquery/bigquery-schema/schema.json,javascriptTextTransformGcsPath=gs://{your_bucket}/gcs-to-bigquery/udf/udf.js,inputFilePattern=gs://{your_bucket}/gcs-to-bigquery/input/jinkounosuii_3004.csv,outputTable='{your_projectId}:chigasaki_opendata.jinkounosuii',bigQueryLoadingTemporaryDirectory=gs://{your_bucket}/gcs-to-bigquery/temp \
    --staging-location gs://{your_bucket}/gcs-to-bigquery/staging


createTime: '2018-05-26T06:29:54.024021Z'
currentStateTime: '1970-01-01T00:00:00Z'
id: 2018-05-25_23_29_52-10369438685711524736
location: us-central1
name: text-to-bigquery
projectId: {your_projectId}
type: JOB_TYPE_BATCH

これで Dataflow が実行されました。
あくまでも実行が開始されたので、結果の細かいステータスは別途取得しなければいけません。今回は GCP のコンソールから確認しました。

f:id:dskst9:20180526195546p:plain

無事 Bigquery にもデータが入っていました。

なお、途中で失敗したときも追いやすいようなUIになっています。

f:id:dskst9:20180526200830g:plain

Dataflow を使ってみて

まだまだ発展途上な感じはありますが、強力な機能だなと感じました。
UDFさえ作ってしまえばあとは大量データもなんのその、というのは魅力的ですね。
Jsonオブジェクトの処理の問題など課題はありますが、これからに期待です。

Tips

  • DataflowはバックグランドでGCEが立ち上がる
  • メモリに入り切らないデータはくてもGCSに置かれるのでメモリ量を気にしなくても良い
  • ただし、ゾーン(リージョン)の中で合計ディスク容量がある
  • 請求はDetafllow(裏のGCE)の稼働時間分なので、800インスタンスぐらいを数時間可動させても1万円くらい
  • Dataflowは起動時に1分くらいはかかってしまうので、数秒で終わるバッチはいままでのバッチのほうが早い
  • Pythonは2.7、Pythonだと使えないものが多々あるようだ
  • ちなみにKotlinもちゃんと使える
  • Jsonのインプットは、どういった形でUDFに入ってくるのがよくわからないので、一度GCSなどにそのまま吐き出してみてどういった形になっているか見たほうがいい

さいごに

Dataflow 初体験もそうですが、何よりもGCPUG湘南支部初参加なのが嬉しかったです!
GCPをもっと盛り上げていきたいと思っているので、これからもGCPUGに参加していこうと思います。

GCPUG への参加はこちらから。