Google Cloud Dataproc でデータ解析基盤を構築

# Google Cloud Dataproc でデータ解析基盤を構築
GCP の Google Cloud Dataproc で手軽にビッグデータ解析の基盤が出来るらしいので触ってみました。



## そもそもデータ解析ってなに？
蓄積されたデータを加工して集計しやすい形式にしたり、視覚化して傾向を捉えたり、
簡単な例でいうとデータの並べ替えとかも解析といえば解析になります。

ビッグデータの定義は

```
ビッグデータとは、従来のデータベース管理システムなどでは記録や保管、解析が難しいような巨大なデータ群。
明確な定義があるわけではなく、企業向け情報システムメーカーのマーケティング用語として多用されている。
多くの場合、ビッグデータとは単に量が多いだけでなく、様々な種類・形式が含まれる非構造化データ・非定型的データであり、
さらに、日々膨大に生成・記録される時系列性・リアルタイム性のあるようなものを指すことが多い。
今までは管理しきれないため見過ごされてきたそのようなデータ群を記録・保管して即座に解析することで、
ビジネスや社会に有用な知見を得たり、これまでにないような新たな仕組みやシステムを産み出す可能性が高まるとされている。
```

らしいです。

ビッグデータを解析して何が面白いのかというと、
例えば自動車メーカーで言うとカーナビのデータから事故が発生しやすいポイントを洗い出し、
安全運転のサポートに活用したり、キャッシュレス決済による購買行動を分析することで
最適なターゲットに訴求出来たりと多岐にわたります。

中国のとある企業では、高級車の販売にあたりビッグデータを活用し、
買う確率が高い層に訴求することで半年のノルマを数時間で達成したという話もあったりなかったり。

ということで、今回はビッグデータを解析するための足がかりを探ります。



## どうやって実装するの？
ビッグデータ解析にあたっては複数のサーバを稼働させる必要があります。

それら複数のサーバに対して分散して処理をさせることで大量のデータを処理します。

分散処理には Hadoop や Spark を用いますが、それには処理を分散するためのマスタサーバ、
実際に処理を行うスレーブサーバを構築する必要がある。

もちろん解析するデータが大きければ大きいほどそれぞれのサーバのスペック、台数を拡張する必要がある。



## なかなかハードル高い。。
ネットワークの設計からサーバ構築、運用まで含めると、
自前で上記の構成を準備するのは相応のコストがかかります。
Google Cloud Dataproc では分散処理で必要な Hadoop や Spark などのフレームワーク、サーバリソースを簡単に準備することができます。



## とりあえず触る
残念ながら解析したいビッグデータは手元にないので、Spark に標準で付属する円周率計算のサンプルを使って Dataproc を触ってみる。
モンテカルロ法を使って円周率に近い数値を算出するものなので、3.1415... に近い数値が出ていることを確認する。

まずはGCPの管理画面からポチポチ行う。

### 1.クラスタを作成
- クラスタを作成する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/b3da3eab-9b4a-5890-9b12-c232311b8a6c.png" alt="cluster_create01" width="800"/>

### 2.クラスタの設定
- リージョンやクラスタタイプなどを指定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/0695388b-bf1e-decc-1374-2419ac0039df.png" alt="cluster_create02" width="800"/>

### 3.ノードの構成
- マシンタイプやノードの数を指定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/3ca0d890-71f8-89aa-c0f1-09d7ffb7c3da.png" alt="cluster_create03" width="800"/>

### 4.クラスタのカスタマイズ
- クラスタが配置されるネットワークを指定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/7cb55a47-2618-9ff0-1275-b1bc18e7b6bf.png" alt="cluster_create04" width="800"/>

### 5.クラスタ作成完了
- クラスタが作成されました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/9d28f0ff-73e5-6356-7cb6-f3f64eafca93.png" alt="cluster_create05" width="800"/>

- ComputeEngine でノードが作成されていることも確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/2d8334fb-78f9-962a-d250-2bbebd670558.png" alt="cluster_create06" width="800"/>


### 6.ジョブを送信
- 今度は上記作成したクラスタに円周率計算のサンプルのジョブを送信してみます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/8a716e17-d525-4ab3-0ac8-5d018fe3dc54.png" alt="cluster_job01" width="800"/>

### 7.クラスタやジョブの内容を記入
- サンプルを使用するため以下を指定する。

|項目|値|
|---|---|
|ジョブタイプ|Spark|
|メインクラスまたはJAR|org.apache.spark.examples.SparkPi|
|JARファイル|file:///usr/lib/spark/examples/jars/spark-examples.jar|
|引数|1000|

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/f136c5f8-fbfd-742b-494f-e06a1bee7597.png" alt="cluster_job02" width="800"/>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/5d7e7aed-0431-f99a-43d5-8b9877ca73b6.png" alt="cluster_job03" width="800"/>


### 8.ジョブが実行されていることを確認
- 円周率に近い数値が出ているため成功。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/fef8d954-8280-4f0d-f424-7c19f08264c6.png" alt="cluster_job04" width="800"/>

### 9.クラスタ削除
- 処理が終わったらクラスタを削除しておく。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/1ed8595b-7581-8e35-4378-7ff7f61dbdc0.png" alt="cluster_create07" width="800"/>




## コマンドラインでもできるみたいなので叩いてみる
先ほど作ったのと同じ内容のクラスタ、ジョブをコマンドラインからやってみる。
同一VPC内にVMインスタンスを1台立ててそこから実行します。

### 1.クラスタを作成
```
$ gcloud dataproc clusters create cluster-numao02 --subnet=default --zone=asia-northeast1-b --region=asia-northeast1 --no-address --num-workers=2
```
- 作成されていることを確認。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/19312c5d-8210-379c-64d2-de4714c2cb88.png" alt="cluster_create09" width="800"/>

### 2.ジョブを送信
```
$ gcloud dataproc jobs submit spark --cluster cluster-numao02 --class org.apache.spark.examples.SparkPi --jars file:///usr/lib/spark/examples/jars/spark-examples.jar --region asia-northeast1 --project numaotest -- 1000
```
- 円周率に近い数値が出ているため成功。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316809/409b17ff-c6a2-61e9-33c2-5513e648e76c.png" alt="cluster_job05" width="800"/>

### 3.クラスタ削除
- 処理が終わったらクラスタを削除しておく。

```
$ gcloud dataproc clusters delete cluster-numao02 --region=asia-northeast1
```



## 最後に
ビッグデータ解析にあたってネックとなる、サーバリソース、
Spark の実装が Dataproc を使うことで簡単に準備することが出来ました。
今回はサンプルでしたが、実際に解析する場合は、
解析したデータを Cloud Strage に吐き出し、Data Studio で可視化するなど
他サービスとの連携することでより分かりやすくできるので、それはまた追々。


---
[:christmas_tree: FORK Advent Calendar 2020](/advent-calendar/2020/fork)
:arrow_right: 2日目 [strapi+nuxt.jsでアドベントカレンダーを作ろう](/sunnyplace/items/c3f16ad9ca6adb4c9b75) @sunnyplace