狠狠撸

狠狠撸Share a Scribd company logo
沖縄と私とGCP
GCPを業務で使用して
得られた失敗と知見
By 川上博@pialab
自己紹介
川上 博(33)♂
?元はSIerで客先常駐
?ほぼJava言語ばかり、Python?Go少々
?サーバサイドのコードだけ書いていた
?客先でクラウド基盤ツールの案件に放り込まれる
?クラウドへの熱を抱えたまま数年???
?縁あって現在の会社「PIALab.」(ピアラボ)へ
個人:Facebookで「hiroshi kawkami」と検索
会社:「PIALab」と検索
弊社システム
ユースケース
?他社様データを日時でアップロード
?アップロード先はCloud Storage(gsutil)
?格納先はBIGQuery
?お客さん毎にBucket、Datasetを分ける
?他社様システムには手を加えることは不可
?S-JISでアップロードするお客様がいる
?現在はお客様毎にETLしているが、将来的に汎用
的なものを作成し、どんなデータが来てもBQに格
納したい
ファイルアップロード Cloud
Storage
BIG
Query
ファイルアップロード Cloud
Storage
これを
ETL処理 BIG
Query
こうしたい
そうだCloudDataflow
があるじゃない
CloudDataflow
を使ってみた
?バッチ?ストリーム処理を並列で処理
?各GCPサービスをシームレスにコール
?今の所Javaのみ(今後対応予定)
?ETL(Extract/Transform/Load)にも使える
どんなサービスか
バッチ?ストリームを並列で処理
?ソースコードがデプロイされるとInstanceが自動で起動
?処理内容を判断して必要なリソース分Instanceをスケール
?データをRecord単位でInstance上に分散、並列処理する
?処理が終了すると自動でサーバを停止、削除(※バッチモードのみ)
各GCPサービスをシームレスにコール
対象サービス
?Cloud Datastore
?Cloud Pub/Sub
?Cloud Storage
?Cloud BIGTable
?BIGQuery
※小難しい認証処理はSDKが肩代わりしてくれるよ
実装イメージ
public static void main(String[] args) {
Pipeline p = Pipeline.create(new PipelineOptions());
p.begin()
.apply(PubSubIO.Read.topic("input_topic")
.apply(ParDo.Of(new ExtractTags())
.apply(Count.perElement())
.apply(ParDo.Of(new ExPandPrefixes())
.apply(Top.largestPerKey(3))
.apply(PubSubIO.Write.topic("output_topic")
p.run();
}
インプット
アウトプット
public static void main(String[] args) {
Pipeline p = Pipeline.create(new PipelineOptions());
p.begin()
.apply(Create.of("Hello", "World"))
.apply(ParDo.of(new DoFn<String, String>() {
@Override
public void processElement(ProcessContext c) {
c.output(c.element().toUpperCase());
}
}));
p.run();
}
#processElement()
部分が分散並列処理されます
他の箇所に変数宣言しても参照
できません
指定可能なinput/output
- Cloud Datastore
- Cloud Storage
- Cloud BIGTable
- Cloud PubSub
- BIGQuery
?Input
基本 「xxxxIO.Read」のように記述
例:DatastoreIO.Read()、PubSubIO.Read()
?OutPut
基本 「xxxxIO.Write」のように記述
例:TextIO.Write()、BIGQueryIO.Write()
※Cloud StorageはTextIOなので注意!!!
処理イメージ
デプロイ?起動までの流れ
?コマンドラインまたはEclipseからデプロイ
?デプロイするとライブラリ(jar)とJavaソースがCloud Storageに格納
?Compute Engine でインスタンス起動
?処理開始
デプロイ?起動の方法
?コマンドラインから
- Mavenコマンドで実行(mvn compile exec:java???)
- 各種起動オプションを指定(--project=sample-project)
?Eclipseから
- Eclipse Pluginが用意されている(Eclipse 4.4 以降)
- 新規Cloud Dataflowプロジェクト作成も簡単に
- CloudDataflow用の実行設定メニューで起動オプション指定可
=>ぜひEclipse Plugin使いましょう
処理モードについて
?BatchMode
- 一括処理
- 処理終了後、Jobは待機しない
- 処理が終了するとInstance数が0に(Instanceをたたむ)
?StreamMode
- リアルタイム処理
- 処理終了後もジョブは待機状態
- 待機状態でInputがあれば処理実行されます
- 基本Instance数は0にならない
- Inputは原則PubSubのみ(PubsubIO.Read)
- ジョブの終了はブラウザもしくはコマンドラインから
※起動オプションで切り替え。処理中に変更は出来ない
実际やってみます
gcpug_okinawa_#2_hiroshi_kawakami
困ったこと
?Input(Cloud Storage)/Output(BIGQuery)を動的
に変更したい
?だがxxxxIO.Read、xxxxIO.Writeが基本固定
?「ComputeEngine経由でCommand Lineから実行
しろ」と公式は言ってる???
?AppEngine野郎としてはComputeEngine使ったら
負けかなと思っている
助けて?骋辞辞濒驳濒别えも?ん???
Googleサポートチームにメールしました
やっててよかったゴールドサポート…
※実際には英語でやりとりしています
公式には書いていないけどAppEngineからコール出来るよ?
ままま、まじですか?やってみます???。
出来ないよー。問題のソースを送るので原因教えて下さい
起動オプションが違うよー。
workerMachineTypeはn1-standard-1以上を設定しなきゃダメだよ
あざーーっす、やってみまーす
うわーん出来ないよー。問題のソース(ry
オプションが(ry
うーん、このままだとエンドレスなので
サンプルコードをGitHubの公開リポジトリに作成するから参考にしてよ
あああ、ありがとうございます。助かります。。。
1ヶ月ぐらいかかるよ。ごめんねー。
※実際には英語でやりとりしています
1ヶ月たったよ。。。
ごめんごめん、もうちょっとかかるかな。てへぺろ
というわけで
実际やってみます
の予定でしたが???
すみません、间に合いませんでした
実際動かせたら公開します
PIALabブログ
https://pialab.co.jp
Facebook GCPUG
https://www.facebook.com/groups/1531859033770693/?fref=ts
とりあえず目のつく所に共有しますのでしばしお待ち下さい
CloudDataflow
まとめ
?重たい処理をサービス跨いで実行したい人はぜひ
?リアルタイム処理を〃
?バッチモードだと終了後インスタンス0に
?ストリームモードだと課金怖い
?Eclipse Pluginはぜひ使っていこう
?AppEngineから起動できるかも(未確認)
最後に
野望というかお願いです
GCPUG沖縄のFacebookグループ作成しまし
た!!!Facebookで「GCPUG OKINAWA」と検索
ぜひ参加してください
GCPの知見を共有していきましょう!!!
さらに???
■bq_sushi
BIGQueryを肴に酒を飲むというマニアックな会
とそのFacebookグループ
Facebookで「#bq_sushi」と検索
■GCPUG全体のグループ
Googleで「GCPUG」と検索
URLが「gcpug.jp」のページです
さらにさらに???
?GCPUG Okinawa、もしくは別でGCPについてのハンズオ
ンメインの勉強会を開催したい。できれば月1ぐらいで
?手を動かすのが苦じゃない方に参加いただきたい
?AppEngine、BIGQuery、ContainerEngine等の各種サー
ビスについて興味がある方
?何回か1回ゲストに来てもらう or リモートで
ハンズオンしてもらいたいなー
※沖縄行きたいのでゲストで来ますも全然OKです!!!
?Googleさん、今日の登壇者の皆様どうですか?
?#bq_sushiとリモート中継とかおもしろそう

More Related Content

gcpug_okinawa_#2_hiroshi_kawakami