https://goo.gl/k2i1iX (本資料のリンク)
簡単スタートアップガイド
コンピュート
ストレージ
アプリケーション
サービス
App Engine
Compute Engine
Container Engine
Cloud
Storage
Cloud
SQL
Cloud
Datastore
BigQuery
Cloud
Endpoints
Kubernetes
本資料の構成
Dataflow編 (Python, Java)
目次
目次
目次
目次
サービス共通編
GCP へのアクセス方法
Cloud Console - �Web ユーザー�インターフェース
Cloud SDK / Cloud Shell
(コマンドライン�インターフェース)
>_
REST-based API
コンソールへのアクセス
Google Cloud Platformを利用するには、Cloud Platform コンソールにアクセスします。
Cloud Platform コンソール:
https://console.cloud.google.com/
→サインアップ済みの方: P.17へ
未だサインアップしていない場合:
トライアルを申し込む
トライアルを申し込む
トライアルを申し込む
トライアルを申し込む
課金情報を入力します。
プロジェクトとは
GCPのリソースが必ず紐づく単位
例: 開発プロジェクトの下にインスタンスが存在
必要に応じてクーポンコードを有効にする
https://console.cloud.google.com/
https://cloud.google.com/redeem
注: クーポンコードを利用するには有料アカウントにアップグレードする必要があります。�有料アカウントでも、適用したクレジット分は無料で利用できます。
課金情報を確認する
課金情報を確認します。
請求先アカウントにプロジェクトが関連づいていることを確認します
クレジットにプロモーションの$300が登録されていることを確認します
課金額の確認方法
[お支払の概要] をクリックすると課金額を確認することができます。
支払い残高
支払履歴
参考:課金とプロジェクトの関係
請求先�アカウント
Project A
請求先�アカウント
Project D
Project B
Project C
クレジットカード
銀行口座
Google�アカウント1
Google�アカウント2
Google�アカウント3
N:N
N:1
1:1
参考:
プロジェクトにアカウントを追加
1
2
3
コマンドラインツール編
コマンドラインツールの選択肢
用途に応じた選択肢
Google Cloud Shellをつかってみよう
Google Cloud Shellとは:
Google Cloud Shellをつかってみよう
Cloud Shellへのアクセス:
Google Cloud Shellをつかってみよう
Cloud Shellへのアクセス:
$ gcloud projects list
コマンドツールをインストールする
Google Cloud Platformの各サービスは、GUIの管理コンソールとともにコマンドツールを提供しています。
インストール方法は以下を参照ください
コマンドツールをインストールする
Linux/Mac OS XまたはWindowsを選択
コマンドツールをインストールする
$ gcloud version
で正しくインストールされていることを確認してください。
注: gcloudが実行出来ない場合は、パスが設定されている�ことを確認してください。
初回実行時はターミナル or コマンドプロンプトを再起動する必要があります
コマンドツールをインストールする
$ gcloud auth login
でOAuth認証を行います。
コマンドツールをインストールする
デフォルトプロジェクトを設定します
$ gcloud config set project <project-id>
$ gcloud config list
で正しく設定されていることを確認
参考:gcloud コマンド
gcloud コマンドTips集
参考:gcloud コマンド
gcloud コマンドTips集 (続き)
参考: gcloudコマンド
gcloudコマンド活用ビデオ�http://youtu.be/4y4-xn4Vi04
参考: 言語設定を変更するには
設定 > 地域固有の表示形式
参考: 言語設定を変更するには
Compute Engine編
今日のゴール
Webサーバを立ち上げる
手順概要
Compute Engineページへのアクセス
VMインスタンスを作成する
(初回は少し時間がかかります)
VMインスタンスを作成する
VMインスタンスを作成する
チェックボックスにチェックする
VMインスタンスを作成する
デフォルトで「インスタンスを削除する際にブートディスクを削除する」が有効になっていることを確認
VMインスタンスを作成する
作成ボタンをクリック
VMインスタンスを作成する
Compute Engine > VM インスタンス より VMインスタンスが作成されたことを確認してください
ログインする
インスタンスにログインする方法は複数あります。
ここでは、二つの方法を紹介します。
ログインする(ブラウザ)
SSHボタンにてログインします
Click
ログインする(ブラウザ)
ブラウザの別ウィンドウにてコンソールが立ち上がることを確認します
ログインする(コマンド)
ログインする(コマンド)
ログインする(コマンド)
(初回はSSHキーの生成プロセスあり)
ログインする(Cloud Shell)
ログインする(Cloud Shell)
ログインする(Cloud Shell)
Cloud Shell が起動する
kkitase@cloudshell:~ (kimi-handson-project)$ gcloud compute --project "kimi-handson-project" ssh --zone "asia-northeast1-a" "www1" ENTER
This tool needs to create the directory [/home/kkitase/.ssh] before being able to generate SSH keys.
Do you want to continue (Y/n)? Y
Enter passphrase (empty for no passphrase): ENTER
Enter same passphrase again: ENTER
kkitase@www1:~$
Webページを提供する
以下の2つのsudoコマンドを実行する
me@my-first-instance$ sudo apt-get update�me@my-first-instance$ sudo apt-get install apache2�...output omitted...
Webページを作成する
以下のechoコマンドをコピー&ペーストして実行する
$ echo "<html><body><h1>Hello World! running on `hostname`</h1></body></html>" | sudo tee /var/www/html/index.html
Webページを作成する
クリックし
https を http に変更
インスタンスを削除する(最後に実行)
インスタンスを削除する(最後に実行)
Click
Compute Engine参考URL (1/2)
Compute Engine参考URL (2/2)
(演習1) リージョン跨ぎの通信
以下の構成でVMインスタンスを作成してください
www1
www2
asia
us
Internet
default
1. asiaリージョンにwww1を作成して、defaultネットワークに接続
2. usリージョンにwww2 を作成して、defaultネットワークに接続 (www1と同じ手順)
ローカル
端末
(演習1) リージョン跨ぎの通信
✔︎ リージョンをまたいでも、プライベートIPアドレスでアクセスできることを確認してください
(演習2) プライベートネットワークを作成する
プライベートネットワークを作成します。
Internet
www1
www3
www2
default
mynetwork
asia
us
europe
FW Rule
FW Rule
FW Rule
FW Rule
FW Rule
FW Rule
(演習2) プライベートネットワークを作成する
(演習2) プライベートネットワークを作成する
(演習2) プライベートネットワークを作成する
(演習2) プライベートネットワークを作成する
新しいインスタンス www3 を作成して mynetwork に接続します
Internet
www1
www3
www2
default
mynetwork
asia
us
europe
FW Rule
FW Rule
FW Rule
FW Rule
FW Rule
FW Rule
(演習2) プライベートネットワークを作成する
新しく作成した
mynetwork
を選択
(演習2) プライベートネットワークを作成する
1. www3にログインして、www1 に対して ping を実行してください
✔︎ ネットワークを跨いでプライベートIPでアクセスできないことを確認してください
2. www3にログインして、www1のPublic IPアドレスに対して ping を実行してください
✔︎ パブリックIPではアクセスできることを確認してください
(演習3)ディスクを追加する
500GBバイトのディスクを作成して、VMインスタンスに追加して使えるようにしましょう。
手順概要は以下のとおりです。
(演習3)ディスクを追加する
(演習3)ディスクを追加する
永続ディスクの情報を入力します。
”作成”ボタンをクリック
(演習3)ディスクを追加する
インスタンスにディスクが追加されたことを確認し、保存をクリック
(演習3)ディスクを追加する
VMインスタンスにログインする
(演習3)ディスクを追加する
利用可能なディスク容量を確認します。
アタッチしたディスクが、まだ利用可能でないことを確認してください
(演習3)ディスクを追加する
ディスクをフォーマットしてマウントします。
例:
sudo mkdir -p /mnt/disk1
(演習3)ディスクを追加する
ディスク名を確認します。
今回追加するディスク。ディスク名で識別できるようになっている
(演習3)ディスクを追加する
フォーマットを実行します
例:
sudo mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/google-disk-1�
(演習3)ディスクを追加する
マウントを実行します
例:
sudo mount -o discard,defaults /dev/disk/by-id/google-disk-1 /mnt/disk1
(演習3)ディスクを追加する
新しいディスクがマウントされ、利用可能になったことを確認します。
(演習4) Stackdriver
Stackdriver をセットアップして、ログ、メトリックを確認する
https://cloud.google.com/monitoring/quickstart-lamp#create_a_workspace
[オプション] Loggingエージェント
Clean-up
リソースごとに削除する場合
プロジェクトごと削除する場合
Kubernetes Engine 編
準備
製品ライフサイクルと DevOps
コンセプト
ビジネス
開発
運用
一般公開
アジャイル
DevOps
文化: 開発と運用を高速に繰り返し行うための組織や考え方
技術: DevOps 文化を支えるための技術やツール
DevOps における技術要件の変化
DevOps を支える技術
マイクロサービスアーキテクチャとは
従来のモノリシック(一枚岩)なアプリケーションとは異なり、
役割や責務ごとに機能を小さなサービスに分割し、それらのサービスが
一つのシステムとして動作する状態を目指したアーキテクチャ。
モノリシック
マイクロサービス
User/Auth
Product
Payment
User
/Auth
Product
Payment
マイクロサービスアーキテクチャの
メリット
DevOps 的に開発と運用を高速に繰り返すには
最適なアーキテクチャ
コンテナとは?
コンテナはアプリケーションコードとその依存性を一つのユニットとしてまとめる
これにより、アプリケーションとインフラを疎結合にすることができる
コンテナ イメージ
依存性
アプリケーション コード
VM vs コンテナ
VM
コンテナ
DevOps とも親和性が高いコンテナ
軽量
仮想マシンに比べて
軽量でシンプル。数十ミリ秒で起動
ポータブル
様々な実行環境に対応し、デプロイメントが容易
効率性
リソース使用量が少なく、コンピュートリソースを細分化して効率的に利用可能
コンテナ管理の課題
Cluster
Node
Node
Node
???
コンテナ
コンテナ
コンテナ
コンテナ
コンテナ
コンテナ
Kubernetes (k8s)
OSS のコンテナオーケストレーションシステム
Google 内部で使われている Borg をインスパイア
オンプレでもクラウドでも運用可能
kubernetesの特徴
Google Kubernetes Engine (GKE)
CI / CD とは?
継続的インテグレーション(CI: Continuous Integration)
一日に何度もビルドを実行し、ソフトウェアをインテグレーションした時に発生する様々な問題を早期に検出する。フィードバックループを短くし、ソフトウェア開発の品質と生産性を向上させる
継続的デリバリー(CD: Continuous Delivery)
ソフトウェア全体のライフサイクルを通じて、常に本番環境にリリースできる状態を保つ
リリースまでの期間を短縮することで、フィードバックループを短くできる
Trunk, Release
branch/tag
git
flow
CD
CI
Local env, Feature branch/PR
deploy to test env
int tests
trigger
build + unit test
artifact registry
bake/
package
sys tests
deploy to qa/staging/prod
trigger
int tests
trigger
build + unit test
引用: [改訂第3版]Jenkins実践入門
GCP で CI / CD
ソースコード
ビルド&テスト
ストレージ
デプロイ
1
2
3
4
5
モニタリング
Container Registry
Cloud Build
Source Repository
Cloud Storage
Cloud Build
Stackdriver
← フィードバックループ
Spinnaker
(OSS)
Cloud Build
サーバーレスな CI/CD プラットフォーム
お客様が VM を用意したりキャパシティの管理をする必要はない
柔軟なビルドステップ
あらゆるサーバーレス CLI ツールをビルドステップとして
組み込むことが可能
デベロッパーフレンドリー
開発者が使い慣れた Git のイベントに応じたトリガー
Spinnaker との連携
GKE 環境での B/G デプロイ、カナリーリリースへの対応
Cloud Build によるワークフロー
workspace
git push
Pull request
Trigger
Container
Registry
Cloud
Storage
Cloud
Functions
Firebase
Kubernetes
Engine
App
Engine
go
docker
gcloud
kubectl
最終的な構成
クラスタを作成する
管理コンソール > [Kubernetes Engine] を選択
クラスタを作成する
[コンテナ クラスタを作成] ボタンをクリック
クラスタを作成する
クラスタテンプレートから “標準クラスタ”を選択し、コンテナクラスタの情報を入力する
“可用性、ネットワーキング、セキュリティ、その他の機能” をクリック
クラスタを作成する
続きのパラメータを入力し、 “作成” をクリック
クラスタを作成する
コンテナクラスタが作成されたことを確認
(作成されるまで数分かかります)
現在の状態
Google Cloud Shell を起動
project
2. Ctrl O で保存
3. Ctrl X で終了
kubectl コマンドをインストールする
$ sudo /google/google-cloud-sdk/bin/gcloud components update kubectl
[Google Cloud Shell] にて以下のコマンドを実行
TIPS: gcloud components list コマンドを実行するとインストールされたコンポーネントの一覧を取得することができます。
コマンド環境を設定する
以下のコマンドを実行して、コマンドの実行環境を設定します。
$ export PROJECT_ID="$(gcloud config get-value project -q)" # プロジェクトIDを設定
$ gcloud config set project ${PROJECT_ID}
$ gcloud config set compute/zone asia-northeast1-a # <zone>
$ gcloud config set container/cluster cluster-1 # <cluster name>
$ gcloud container clusters get-credentials cluster-1 # <cluster name>
現在の状態
アプリケーションを作成
アプリケーション用のディレクトリを作成します
$ mkdir helloNode
$ cd helloNode
アプリケーションを作成
server.jsという名前で以下のファイルを保存します。
var http = require('http');
var handleRequest = function(request, response) {
var os = require('os');
var hostname = os.hostname();
response.writeHead(200);
response.end("<h1>Hello World! == " + hostname + "</h1>\n");
}
var www = http.createServer(handleRequest);
www.listen(8080);
# 「Hello World!」とホスト名を出力する単純なWebアプリ。
アプリケーションの実行確認
以下のコマンドを実行
$ node server.js
別のコンソールより curl localhost:8080 をするとメッセージが出力されることを確認 (もしくは「プレビューのポート」)
Ctrl-C にてサーバプロセスを終了
Dockerコンテナイメージを作成
Dockerfile という名前で以下のファイルを保存します。
FROM node:12.4.0
EXPOSE 8080
COPY server.js /server.js
CMD node server.js
Dockerコンテナイメージを作成
Dockerイメージをビルドします。
$ docker build -t asia.gcr.io/${PROJECT_ID}/hello-node:v1 .
ビルドが完了するまで数分かかります。
Dockerコンテナイメージを作成
Google Container Registry にPushします。(初回は時間がかかります)
$ docker push asia.gcr.io/${PROJECT_ID}/hello-node:v1
※ docker push [Push 先ホスト名]/[プロジェクト名] / [イメージ] : [タグ]
Google Container Registry にPush されたことを確認します。
$ gcloud container images list-tags asia.gcr.io/${PROJECT_ID}/hello-node
Docker コンテナイメージを作成�(Cloud Build)
Google Container Registry にPushします。(初回は時間がかかります)
$ gcloud builds submit --tag asia.gcr.io/${PROJECT_ID}/hello-node:v1 .
Dockerコンテナレジストリを確認
コンソール > ツール > Container Registry
演習: Docker コンテナ基本
演習1. 作成したDocker コンテナを Cloud Shell から実行する
$ docker images #ローカルに登録されているDockerイメージ一覧を取得する
$ docker run -d -p 8080:8080 asia.gcr.io/${PROJECT_ID}/hello-node:v1
# ローカルのDockerイメージからコンテナを起動する
$ curl localhost:8080 #ローカルで起動したWebアプリケーションに接続する
$ docker ps #ローカルで起動しているコンテナ一覧を取得する
$ docker kill <container id> #container idを指定してコンテナを停止する
$ docker rm <container id> #container idを指定してコンテナを削除する
現在の状態
$ docker build
$ docker push
or
$ gcloud build submit
Deployment を作成
hello-node-deployment.yaml というファイル名で以下を保存します。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
name: hello-node
name: hello-node
spec:
replicas: 1
template:
metadata:
labels:
name: hello-node
spec:
containers:
- image: asia.gcr.io/<project id>/hello-node:v1
name: hello-node
ports:
- containerPort: 8080
# Project IDを書き換えます
Deployment を作成
kubectl create コマンドを使ってDeploymentを作成します。
$ kubectl create -f hello-node-deployment.yaml
$ kubectl get deployment
$ kubectl get pods -o wide
作成されたDeployment、Pod を確認します。
現在の状態
$ docker build
$ docker push
or
$ gcloud build submit
演習
演習1. Pod が動作しているNodeにログインしてDockerコンテナが動いていることを確認しましょう。
演習2. 動作中のDocker コンテナを削除してください。どのような動きになるかを確認しましょう。
Serviceを作成
hello-node-service.yaml として以下を保存します。
apiVersion: v1
kind: Service
metadata:
labels:
name: hello-node
name: hello-node
spec:
ports:
- port: 8080
selector:
name: hello-node
type: LoadBalancer
Serviceを作成
kubectl create コマンドを使ってServiceを作成します。
$ kubectl create -f hello-node-service.yaml
$ kubectl get svc
作成されたサービスを確認します。
ネットワークロードバランサーを作成するため、外部IPアドレスが割り当てられるまでにしばらく時間がかかります。
ここまでの構成
Service
port : 8080
name : hello-node
Deployment
replicas=1
Pod
name : hello-node
create
テスト実行
$ kubectl get svc
サービスの外部IPアドレスを確認します。
curl コマンドでアクセスして出力を確認します。
(Webブラウザでもアクセス可能)
$ curl <EXTERNAL IP>:8080
ポッドをスケールアウト
$ kubectl scale deployment/hello-node --replicas=3
kubectl scale コマンドを使うとポッドのレプリカ数を変更できます。
ポッドの数を確認します。
$ kubectl get pods -o wide
ここまでの構成
Service
port : 8080
name : hello-node
Deployment
replicas=3
Pod
name : hello-node
create
Pod
name : hello-node
Pod
name : hello-node
(演習)バージョン変更
Cleanup - Kubernetesコンポーネント
$ kubectl delete svc/hello-node
サービスを削除します。
デプロイメントを削除します。
$ kubectl delete deployment/hello-node
Cleanup - GKE クラスタ
クラスタを削除します。
削除アイコンをクリック
Cleanup - Container Registry
管理コンソール > Storage(GoogleCloudStorage)を選択します。
バケット名 asia.artifacts.<project id>.appspot.com を選択して削除ボタンをクリック
1. バケットを選択
2. 削除ボタンをクリック
参考: kubectl コマンド
$ kubectl logs <POD_NAME>
・Pod のstdout/stderr を確認する
$ kubectl cluster-info
・クラスタのメタ情報を確認する
$ kubectl describe pods/<pod name>
・Pod の状態を確認する
地域をまたがる負荷分散編
準備
環境
今回はHTTPのみを作成します
インスタンスの設定
次の流れでトラフィックを処理するインスタンスを設定します。
VMインスタンスを作成する
インスタンスの起動
インスタンスの追加
Apacheのインストールと設定
$ sudo apt-get update
$ sudo apt-get install apache2
$ hostname=`hostname`
$ echo echo '<!doctype html><html><body><h1>'$hostname'</h1></body></html>' | sudo tee /var/www/html/index.html
※付録の演習で実施しますが、イメージを利用してVMの設定をコピーすることもできます。
TIPS: Google Cloud Shell
project
ファイヤーウォールの設定
インスタンスの動作確認
ロードバランサーの準備
次の流れで作成します。
グローバル静的外部IPアドレスの予約
インスタンスグループの作成
インスタンスグループの作成
ヘルスチェックの作成
負荷分散サービスの設定
ロードバランサの名前指定
バックエンドの設定
ホストとパスのルール
ここでは、すべてのトラフィックをデフォルトのルールで実行するため、ホストやパスのルールは設定しません。
フロントエンドの設定
確認と完了
数分かかります。
インスタンスへのトラフィックの送信
ブラウザからの動作確認
地理的に近い場所からの動作確認
最も近い地域のインスタンスから応答があります。
msatoh@www-1:~$ curl http://130.211.46.248/�<!doctype html><html><body><h1>instance-1</h1></body></html>�msatoh@www-1:~$ curl http://130.211.46.248/�<!doctype html><html><body><h1>instance-2</h1></body></html>
msatoh@www-3:~$ curl http://130.211.46.248/�<!doctype html><html><body><h1>instance-3</h1></body></html>�msatoh@www-3:~$ curl http://130.211.46.248/�<!doctype html><html><body><h1>instance-4</h1></body></html>
TIPS: RPSの確認
web-map ロードバランサの [監視] をクリックするとバックエンドのRPSを確認できます。バックエンドからバックエンドを指定するとどのリージョンからどのリージョンに接続しているか確認できます。
付録:
東京リージョンにインスタンスを移動
付録:
東京リージョンにインスタンスを移動
付録:
東京リージョンにインスタンスを移動
Clean-up
Clean-up : 付録
App Engine(Python)編
今日のゴール
準備
Google Cloud Shell を起動
project
click
コードを作成する(gitコマンドで取得)
githubからコードを取得する (gitコマンドを利用する場合)
$ git clone https://github.com/GoogleCloudPlatform/python-docs-samples
コードを作成する
git cloneしたフォルダに移動します
$ git clone https://github.com/GoogleCloudPlatform/appengine-helloworld-python.git
$ cd python-docs-samples/appengine/standard/hello_world
$ ls
app.yaml main.py main_test.py
コードを作成する
app.yaml (設定ファイル)の中身を確認します
$ vi app.yaml
コードを作成する
: q で終了
コードを作成する
ローカルテストを行う
$ dev_appserver.py .
$ dev_appserver.py .
INFO 2016-02-29 07:23:56,212 devappserver2.py:769] Skipping SDK update check.
INFO 2016-02-29 07:23:56,253 api_server.py:205] Starting API server at: http://localhost:52234
INFO 2016-02-29 07:23:56,257 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO 2016-02-29 07:23:56,259 admin_server.py:116] Starting admin server at: http://localhost:8000
ローカルテストを行う
AppEngineにデプロイする
$ pwd
~/python-docs-samples/appengine/standard/hello_world
$ gcloud app deploy
AppEngineにデプロイする
コードを作成する
main.py のコードを確認します。
$ cat main.py
(演習1) バージョンコントロール
アプリケーションが出力するメッセージを変更して、新しいバージョンとしてデプロイしてみてください。
(演習1) バージョンコントロール
アプリケーションに負荷をかけながらバージョンコントロールしてみてください
(演習1) バージョンコントロール
Cookieベースに設定します。
(演習2) オートスケールを確認
アプリケーションに負荷をかけてサーバインスタンスが自動的にスケールすることを確認
(演習2) オートスケールを確認
(演習2) オートスケールを確認
(演習3) guestbook アプリケーションを作成する
https://cloud.google.com/appengine/docs/python/getting-started/creating-guestbook
※ このアプリケーションをデプロイする場合、インデックス定義ファイルもデプロイする必要があります。またインデックスが作成されるまでしばらく時間がかかることがあります。
$ gcloud app deploy app.yaml index.yaml
AppEngine参考URL
AppEngine参考URL
BigQuery編
フルマネージド DWH
自動でスケールアウト
設定や管理は不要�最大 100,000 行 / 秒のストリーム�サードパーティ ソフトウェアとの容易な統合
ペタバイトクラスのクエリも高速処理
Google BigQuery
複雑なデータ分析をシンプルに
Confidential + Proprietary
分析サービス:BigQuery
Cloud OnAir
Programming
Maintenance
Monitoring
Handling scale
Perf tuning
17 億件のフルスキャンを 6.7 秒で実行
72 GBのフルスキャン
クエリのコスト:0.072 TB * $5/TB = 約36円
Confidential & Proprietary
準備
BigQueryを使ってみる
BigQueryを使ってみる(サンプルの確認)
以下のURLにアクセスしてサンプルのデータセットを確認します。
https://console.cloud.google.com/bigquery?p=bigquery-public-data
※表示されていない場合には
データを追加 ->
一般公開データセットを調べる ->
任意のデータを選択 ->
データセットを表示
を選択してください
BigQueryを使ってみる(サンプルの確認)
画面左側に表示される
リソースbigquery-public-data
のsamplesデータセットをクリックする。
その下にある natality テーブル を選択し、画面の右側に表示される テーブル構造(スキーマ)を確認する
BigQueryを使ってみる(クエリ実行)
Query Tableボタンをクリックすると、テーブルに対してクエリを実行できます。
BigQueryを使ってみる(問3:答え)
3. 最も出生数が多い年は?
SELECT year, COUNT(*) as cnt
FROM `bigquery-public-data.samples.natality`
GROUP BY year
ORDER BY cnt DESC
BigQueryを使ってみる(ハンズオン)
natalityテーブルに対してクエリーを実行し
以下の情報を調べてみましょう
問1: 何人分のデータが含まれているか?
問2: 何年から何年のデータが含まれているか?
問3: 最も出生数が多い年は?
問4: 最も出生数が多い州は?
問5: 年ごとの平均体重の推移は?
※どのようなクエリや関数が実行できるかは、このマニュアルを参照してみてください。
BigQueryを使ってみる(問1:答え)
SELECT COUNT(*)
FROM `bigquery-public-data.samples.natality`
BigQueryを使ってみる(問2:答え)
2. 何年から何年までのデータが含まれているか
SELECT year
FROM `bigquery-public-data.samples.natality`
GROUP BY year
ORDER BY year
BigQueryを使ってみる(問4:答え)
4. 最も出生数が多い州は?
SELECT state, COUNT(*) as cnt
FROM `bigquery-public-data.samples.natality`
WHERE state IS NOT null
GROUP BY state
ORDER BY cnt DESC
BigQueryを使ってみる(問5:答え)
5. 年ごとの平均体重の推移は?
SELECT AVG(weight_pounds), year
FROM `bigquery-public-data.samples.natality`
GROUP BY year
ORDER BY year
テーブルの作成
テーブルにロードし、テーブルの作成を体験します。
地震データ
テーブルの作成(データのダウンロード)
1. 設定ボタンをクリック
2. 30日分、マグニチュード2.5+を選択
4. “Download Earthquakes”ボタンをクリックし、”CSV”を選択してダウンロードする
3. 画面左上の「∨」をクリック
テーブルの作成
新規にデータセットを作成し、その下にテーブルを作成します。
テーブルの作成
テーブルの作成
2. ローカルにダウンロードしたファイルを指定
3. CSVを選択
1. アップロードを選択
初期状態では
“空のテーブル”
となっている
テーブルの作成
テーブル名を入力 (例:eq_20180827)
テーブルの作成(自動スキーマ定義)
参考:テーブルの作成(手動スキーマ定義)
time:string,latitude:float,longitude:float,depth:float,mag:float,magType:string,nst:integer,gap:float,dmin:float,rms:float,net:string,id:string,updated:string,place:string,type:string,horizontalError:string,depthError:string,magError:string,magNst:string,status:string,locationSource:string,magSource:string
参考:テーブルの作成(手動スキーマ定義)
1. ソース・ファイルの一行目がカラム名になっているので、一行スキップする
2. Create Table ボタンをクリック
参考:テーブルの作成(ジョブ履歴の確認)
テーブルの作成
結果をデータポータルに連携
結果をデータポータルに連携
Datastudio Explorerにクエリ結果が連携される
ディメンション、指標 は自動的に選択されてグラフが生成される
結果をデータポータルに連携
ディメンション、指標 とは?
ディメンション:
データのカテゴリのこと。ディメンションの各値は、名前や説明など、カテゴリの特性を指す。
指標:
測定値のこと。合計、カウント、比率などの値を示す
https://support.google.com/datastudio/answer/6402048?hl=ja
結果をデータポータルに連携
グラフ種類を”期間”に変えてみる
結果をデータポータルに連携
データソース名横の鉛筆マークをクリックし、”フィールドを追加”を選択
結果をデータポータルに連携
緯度、経度フィールドを作成する
数式
CONCAT(latitude, “,”, longitude)
※ダブルクォーテーションが正しくコピーされないことがあります。
その場合は、マニュアルでコマンドを打ってください
結果をデータポータルに連携
すべてのフィールドをクリックし、latlonのタイプを変更する
結果をデータポータルに連携
“ディメンション”をlatlonに、”指標”をmagに変更
結果をデータポータルに連携
参考:�テーブルを作成する(bqコマンド)
GSDIR="gs://kf-us"
DATAFILE=$GSDIR/4.5_month.csv
BQ_TABLE="eq.20140815"
SCHEMA=`cat ./schema.txt`
GLOBAL_OPTIONS="--nosync"
CMD_OPTIONS="--skip_leading_rows=1 --max_bad_records=0"
bq $GLOBAL_OPTIONS load $CMD_OPTIONS $BQ_TABLE $DATAFILE $SCHEMA
←自分のプロジェクト内のCloud Storageのバケットを指定する必要あり
←バケットにCSVデータをアップロードする必要あり
←次ページのスキーマをファイルとして作成しておく必要あり
参考:�テーブルを作成する(bqコマンド)
time:string,latitude:float,longitude:float,depth:float,mag:float,magType:string,nst:integer,gap:float,dmin:float,rms:float,net:string,id:string,updated:string,place:string,type:string,horizontalError:string,depthError:string,magError:string,magNst:string,status:string,locationSource:string,magSource:string
schema.txt (以前作成したearthquakeと同じ)
参考:パーティションテーブルを作成する
$ bq mk --time_partitioning_type=DAY earthquake.eq
$ bq --format csv load --skip_leading_rows=1 'earthquake.eq$20160705' $GSDIR/4.5_month.csv "time:string,latitude:float,longitude:float,depth:float,mag:float,magType:string,nst:integer,gap:float,dmin:float,rms:float,net:string,id:string,updated:string,place:string,type:string,horizontalError:string,depthError:string,magError:string,magNst:string,status:string,locationSource:string,magSource:string"
テーブルを作成する
データをロードする
参考:パーティションテーブルを作成する
$ bq query 'SELECT partition_id FROM [earthquake.eq$__PARTITIONS_SUMMARY__]'
$ bq query 'SELECT partition_id FROM [earthquake.eq$__PARTITIONS_SUMMARY__]'
$ bq query "SELECT count(*) FROM [earthquake.eq] where _PARTITION_LOAD_TIME between timestamp('20160705') and timestamp('20160707')"
$ bq query 'SELECT count(*) FROM [earthquake.eq$20160705]'
作成されたパーティションを確認する
$20160706,$20160707も同様にデータをロードして、以下SQLの表示結果を確認する
データポータルでレポートを作成する
データポータルにアクセスする
「新しいレポートの開始」をクリック
データポータルでレポートを作成する
2. 「新しいデータソースを作成」をクリック
1. レポートのタイトルを変更する
データポータルでレポートを作成する
1. BigQueryを選択
2. (初めての場合のみ)承認ボタンをクリックしてアクセス権を許可する
米国出生情報
データポータルでレポートを作成する
データコネクションを作成する
以下を選択する。
BigQuery >
公開サンプル >
samples >
natality >
[今回作成したプロジェクト]
右上の [接続] ボタンをクリックする
データポータルでレポートを作成する
データコネクションを作成する
1. データコネクション名を任意の名前に変更
2. [レポートに追加] ボタンをクリック
データポータルでレポートを作成する
1. [挿入] ボタンをクリック
2. [棒グラフ]をクリック
データポータルでレポートを作成する
ディメンション、指標 は自動的に選択されてグラフが生成される
データポータルでレポートを作成する
ディメンション、指標 とは?
ディメンション:
データのカテゴリのこと。ディメンションの各値は、名前や説明など、カテゴリの特性を指す。
指標:
測定値のこと。合計、カウント、比率などの値を示す
https://support.google.com/datastudio/answer/6402048?hl=ja
データポータルでレポートを作成する
1. ディメンションを[year] に変更(「使用可能な項目」からドラッグ&ドロップ)
データポータルでレポートを作成する
1. 指標 [weight_ponds] を選択
2. フィールドを作成
データポータルでレポートを作成する
カスタムフィールドを作成する
1. 項目名を入力 : birth_count
2. 数式を入力 : COUNT(is_male)
3. [適用] ボタンをクリック
データポータルでレポートを作成する
1. [birth_count] を選択する
データポータルでレポートを作成する
グラフのスタイルを変更する
グラフを選択 >
スタイル >
以下を設定する
棒の数 : 10
データラベルを表示 : チェックボックスをON
データポータルでレポートを作成する
グラフのソート順を変更する
グラフを選択 >
データ >
以下を設定する
並べ替え : year 昇順
参考:データポータル活用例 GCP 課金
アプリ開発 (Google Apps Script)
Google SpreadsheetからBigQueryを呼び出し、結果を表やグラフに描画できるアプリケーションです
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
Googleデベロッパー�コンソールが起動する
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
スクリプト内で使用するので�番号を控えておいてください
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
// 先ほど控えたプロジェクト番号に置き換える
var projectNumber = 'XXXXXXXX';
var ss = SpreadsheetApp.getActiveSpreadsheet();
function onOpen() {
var menuEntries = [ {name: 'Run Query', functionName: 'runQuery'} ];
ss.addMenu('BigQuery', menuEntries);
}
(1/4)
アプリ開発 (Google Apps Script)
function runQuery() {
var sheet = SpreadsheetApp.getActiveSheet();
var sql = 'select TOP(word, 10), COUNT(*) as word_count from publicdata:samples.shakespeare WHERE LENGTH(word) > 12;';
var queryResults;
// Inserts a Query Job with an optional timeoutMs parameter.
try {
var resource = {query: sql, timeoutMs: 1000, userQueryCache: false};
queryResults = BigQuery.Jobs.query(resource, projectNumber);
}
catch (err) {
Logger.log(err);
Browser.msgBox(err);
return;
}
(2/4)
アプリ開発 (Google Apps Script)
while (queryResults.getJobComplete() == false) {
try {
queryResults = BigQuery.Jobs.getQueryResults(projectNumber, queryResults.getJobReference().getJobId());
// If the Job is still not complete, sleep script for
// 3 seconds before checking result status again
if (queryResults.getJobComplete() == false) {
Utilities.sleep(3000);
}
}
catch (err) {
Logger.log(err);
Browser.msgBox(err);
return;
}
}
(3/4)
アプリ開発 (Google Apps Script)
// Update the amount of results
var resultCount = queryResults.getTotalRows();
var resultSchema = queryResults.getSchema();
}
(4/4)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
var resultValues = new Array(resultCount);
var tableRows = queryResults.getRows();
// Iterate through query results
for (var i = 0; i < tableRows.length; i++) {
var cols = tableRows[i].getF();
resultValues[i] = new Array(cols.length);
// For each column, add values to the result array
for (var j = 0; j < cols.length; j++) {
resultValues[i][j] = cols[j].getV();
}
}
// Update the Spreadsheet with data from the resultValues array
sheet.getRange(1, 1, resultCount, tableRows[0].getF().length).setValues(resultValues);
アプリ開発 (Google Apps Script)
アプリ開発 (Google Apps Script)
// Returns a Data Table from a query's result values and schema
function buildDataTable(resultValues, resultSchema) {
var dataTable = Charts.newDataTable();
for (var i = 0; i < resultSchema.getFields().length; i++) {
column = resultSchema.getFields()[i];
columnName = column.getName();
columnType = (column.getType() == 'INTEGER' || column.getType() == 'FLOAT')
? Charts.ColumnType.NUMBER : Charts.ColumnType.STRING;
dataTable.addColumn(columnType, columnName);
}
(次ページに続く)
(1/2)
アプリ開発 (Google Apps Script)
(前ページからの続き)
for (var j = 0; j < resultValues.length; j++) {
dataTable.addRow(resultValues[j]);
}
dataTable.build();
return dataTable;
}
(2/2)
アプリ開発 (Google Apps Script)
var bigqueryDataTable = buildDataTable(resultValues, resultSchema);
var chart = Charts.newBarChart()
.setDataTable(bigqueryDataTable)
.setColors(['green'])
.setDimensions(500, 500)
.setYAxisTitle('Word')
.setXAxisTitle('Count')
.setLegendPosition(Charts.Position.BOTTOM)
.build();
var chart_panel = UiApp.createApplication()
.setTitle('BigQuery Results')
.setWidth('600')
.setHeight('600');
chart_panel.add(chart)
ss.show(chart_panel);
アプリ開発 (Google Apps Script)
BigQuery SQLの特徴
BigQuery SQLの特徴
参考: 全体アーキテクチャ
BigQuery
分析基盤
Cloud Logging
App Engine�Analytics Server
Compute Engine
On-premise / 他社クラウド�
Google Spreadsheet
Stream API
File
3rd party tools
Simba ODBC Driver
データポータル
BigQuery 参考URL
Cloud Storage編
準備
Cloud Storageを使ってみる
Cloud Storage管理コンソールにアクセス
Cloud Storageを使ってみる
バケットの作成
Cloud Storageを使ってみる
Cloud Storageを使ってみる
Cloud Storageを使ってみる
ファイルをアップロードします
Cloud Storageを使ってみる
ファイルのアップロードの確認
Cloud Storage 参考URL
CloudSQL編
準備
Cloud SQLインスタンスを作成する
Cloud SQLインスタンスを作成する
インスタンス名とリージョンを指定
[作成] ボタンをクリック
Cloud SQLインスタンスを作成する
ステータスが[実行可能]になれば完了
接続する
ここでは、Compute EngineのLinuxインスタンスを使って、Cloud SQLへの接続を確認します
仮想マシンの外部IPアドレスを取得する
$ gcloud compute instances list
Linuxインスタンスにsshログインする
$ gcloud compute ssh <your-instance-name>
接続する
Compute Engineの仮想マシンにMySQL Clientをインストールします
$ sudo apt-get update
$ sudo apt-get install mysql-client
接続する
GCEのインスタンスがCloud SQLにアクセスできるよう、Authorized IPの設定を行います
接続する
GCEのインスタンスがCloud SQLにアクセスできるよう、Authorized IPの設定を行います
インスタンスを選択
接続する
接続元クライアントのIPアドレスを登録します
接続する
パブリックIPアドレス
接続する
IPv4 アドレスを割り当てます
接続する
ユーザを作成します
接続する
VMインスタンスより、接続を確認します。
$ mysql --host=sql_instance-IP --user=root --password
接続する
データベース、テーブルを作成します。
CREATE DATABASE guestbook;
USE guestbook;
CREATE TABLE entries (guestName VARCHAR(255), content VARCHAR(255),
entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID));
INSERT INTO entries (guestName, content) values ("first guest", "hello world!");
SELECT * FROM entries;
Cloud SQL 参考URL
(補足)レプリケーションの設定
レプリケーションの設定を行う
https://developers.google.com/cloud-sql/docs/replication?hl=ja
注意事項
・CHANGE MASTER TO MASTER_LOG_FILE…コマンド実行時にマスターサーバでSHOW MASTER STATUSを実行して、ログファイル、ログポジションを確認する
・SLAVE STATUSを確認しながら構成する
・MySQLのトラブルシュートができることが望ましい
Cloud Dataflow�Python SDK編
準備
インストールする
Cloud Shell を起動して以下を実行
$ pip install google-cloud-dataflow --user
Cloud Console にアクセスする (console.cloud.google.com)
Cloud Shellのアイコンをクリック
Hello World
Python をインタラクティブモードで起動
$ python
Hello World
# 必要モジュールをインポート�import apache_beam as beam�# パイプラインを作成�p = beam.Pipeline()�# PCollection を作成してファイルに書き込む�(p� | beam.Create(['hello', 'world']) � | beam.io.WriteToText('./test'))�# パイプラインを実行する�p.run()�# Python インタラクティブモードを抜ける�exit()
以下を実行する
Hello World
出力されたファイルを確認する
more ./test*
Dataflow モデルの基本概念
以下の4つの主要概念を理解する
Dataflowモデル:パイプライン
Group 1
Filter 2
Transform 1
Write
Read
Filter 1
Input
Output
Dataflow モデル:PCollection
Dataflow モデル:変換 (PTransform)
Dataflow モデル: �I/O ソースおよびシンク
Wordcount サンプル
import re
import apache_beam as beam
p = beam.Pipeline('DirectRunner')
(p
| 'read' >> beam.io.ReadFromText('gs://dataflow-samples/shakespeare/kinglear.txt')
| 'split' >> beam.FlatMap(lambda x: re.findall(r'\w+', x))
| 'count words' >> beam.combiners.Count.PerElement()
| 'save' >> beam.io.WriteToText('./word_count'))
p.run()
$ vim wordcount.py
以下のコードを入力
Dataflow モデル
パイプライン
I/Oソース
I/Oシンク
変換
Wordcount サンプル
$ cat word_count-00000-of-00001
(u'pomp', 1)
(u'bounty', 2)
(u'th', 1)
(u'to', 440)
...
$ python wordcount.py
プログラムを実行
出力されたファイルを確認
接続する
ユーザを作成します
クラウド上で実行する
$ vim wordcount.py
wordcount.py を少し修正
修正するポイント:
クラウド上で実行する
import re
import argparse
import apache_beam as beam
argv = None
parser = argparse.ArgumentParser()
parser.add_argument('--output',required=True,help='Output file must be specified')
known_args, pipeline_args = parser.parse_known_args(argv)
p = beam.Pipeline(argv=pipeline_args)
(p
| 'read' >> beam.io.ReadFromText('gs://dataflow-samples/shakespeare/kinglear.txt')
| 'split' >> beam.FlatMap(lambda x: re.findall(r'\w+', x))
| 'count words' >> beam.combiners.Count.PerElement()
| 'save' >> beam.io.WriteToText(known_args.output))
p.run()
クラウド上で実行する
# 環境変数のセット
$ export PROJECT=$(gcloud config list project --format "value(core.project)")
# バケットの作成
$ gsutil mb gs://$PROJECT-$USER
# 実行
$ python wordcount.py --runner DataflowRunner \
--project $PROJECT \
--staging_location gs://$PROJECT-$USER/staging \
--temp_location gs://$PROJECT-$USER/staging \
--job_name $PROJECT-python-wc-$USER \
--output gs://$PROJECT-$USER/output/word_count
コンソールで確認する
生成されたファイルを確認する
$ gsutil ls gs://$PROJECT-$USER/output
gs://fukudak-playground-fukudak/output/word_count-00000-of-00009
gs://fukudak-playground-fukudak/output/word_count-00001-of-00009
gs://fukudak-playground-fukudak/output/word_count-00002-of-00009
gs://fukudak-playground-fukudak/output/word_count-00003-of-00009
gs://fukudak-playground-fukudak/output/word_count-00004-of-00009
gs://fukudak-playground-fukudak/output/word_count-00005-of-00009
gs://fukudak-playground-fukudak/output/word_count-00006-of-00009
gs://fukudak-playground-fukudak/output/word_count-00007-of-00009
gs://fukudak-playground-fukudak/output/word_count-00008-of-00009
Cloud Shell より以下を確認
参考