Edited at
Fringe81Day 17

ScioのREPLで大量データ処理をリモート実行する

本記事はFringe81アドベントカレンダー2018の17日目の投稿です。

データ量多くても変わらないコードで実行できる分散型データ処理を追い求めてScioに行き着きました。

前回に続き手軽に実行できるScioでのデータ処理について書きます!


 Scioとは?

ScioApacheBeamおよびDataflowのScala版APIです。

音楽配信サービスで有名なSpotifyが主導で開発しています。

付加機能が充実していて本家のJava版より簡潔に実装、実行できるためオススメです。

REPLは手元で手軽に書けて、直ぐにリモートDataflow実行も出来るのでお手軽にデータ処理を書くために使えます。


 作るモノ

BigQueryの一般公開データセットとしてアクセスできる

StackOverflowの質問データ(タイトル)に対し、word-countを実行して情報を付加して新規tableへ書き出す処理をGCPのDataflowでフル実行します。

コードは基本的に前回と同じものを使うので解説は前回記事を参考にしていただければと思います。

リモート実行用の変更については後ほど解説します。


 Scio-REPLのススメ!

Scio-REPLは手元で軽い処理をサッと書くのに使い勝手が良いです。

手元PCでのローカル実行とGCPでのリモート実行も簡単に切り替えられます。

バッチの必要なく一回だけ実行して済むような処理はScio-REPLで作ってしまうのが早いです!


 リモートモードで起動

java -jar scio-repl-0.5.6.jar --project=[project-id] --stagingLocation=gs://[gcs上のtmpディレクトリ指定] --runner=DataflowRunner


 実行するコード

リモート実行する場合は、

sc:(ScioContext)の文脈上で処理する必要があります。そのため、「sc.close」も必要です。

@BigQueryType.fromQuery("SELECT id,title,0 AS wordcount FROM `bigquery-public-data.stackoverflow.posts_questions`")

class Row

sc.typedBigQuery[Row]().map(r => Row(r.id, r.title, r.title.map(_.split("[^a-zA-Z']+").length))).saveAsTypedBigQuery("[project-id]:out.wcquestions")

sc.close


 実行

stackoverflowのパブリックデータ:bigquery-public-data:stackoverflow.posts_questions、1,600万件(約25GB)分をリモート実行した結果です。(ローカル実行しようとするとtimeout等で実行厳しい量です...)

全処理が約9分で終わりました。

スクリーンショット 2018-12-17 8.12.56.png


 Scio-REPLの使いところについて

25GB、1600万件のデータ処理というローカルで実行するにはチト厳しいデータ処理をサクッと実行できました。

調査やレポート作成などでバッチ化するまでもないけど重めのデータ処理をする必要がある場合に、ちょうどいい実行環境と思います。


 課題

ワーカーノードがスケールせず1台で処理完了してしまいました。

もう少し工夫すればもっと効率的にスケールできると思うので、この点に関してのは引き続き調べて行きたいと思います。

スクリーンショット 2018-12-17 8.13.19.png