クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

2016年12月18日
から hiruta
ParquetデータをAmazon Athenaで検証してみました。 #jawsug #gcpug はコメントを受け付けていません。

ParquetデータをAmazon Athenaで検証してみました。 #jawsug #gcpug

BigQueryで公開データとして公開されているNOAA Global Historical Climatology Network の天候データを、エクスポートして、Amazon Athenaで使用してみました。

Column-oriented フォーマットにカテゴリ分けされる Parquetに変換して検証してみました。

ParquentへのConvertはApache Drillを使用

0: jdbc:drill:zk=local> ALTER SESSION SET `store.format` = 'parquet'
. . . . . . . . . . . > ;
+-------+------------------------+
| ok | summary |
+-------+------------------------+
| true | store.format updated. |
+-------+------------------------+
1 row selected (1.655 seconds)

CTASクエリでの変換だと、VARCHARとして扱われてしまうので、カラム毎の型を設定しておく必要があります。それをしないと、Athenaでクエリ実行時、internal errorとなってしまいます。

0: jdbc:drill:zk=local> CREATE TABLE dfs.tmp.`/ghcnd_2016/` AS SELECT
. . . . . . . . . . . > id,
. . . . . . . . . . . > `date`,
. . . . . . . . . . . > `element`,
. . . . . . . . . . . > CAST(`value` AS FLOAT) AS `value`,
. . . . . . . . . . . > mflag,
. . . . . . . . . . . > qflag,
. . . . . . . . . . . > sflag,
. . . . . . . . . . . > `time`
. . . . . . . . . . . > FROM dfs.`/tmp/ghcnd_2016_ja.csvh`;
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
+-----------+----------------------------+
| Fragment | Number of records written |
+-----------+----------------------------+
| 0_0 | 174292 |
+-----------+----------------------------+
1 row selected (3.755 seconds)

気象観測所のデータはCTASクエリによる変換で済ませています。

ParquentのファイルをS3にアップロードし、Athenaのテーブルを作成します。

CREATE EXTERNAL TABLE IF NOT EXISTS athena_test_1.ghcnd_2016 (
id string,
date string,
element string,
value float,
mflag string,
qflag string,
sflag string,
time string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://athena-test-data01/parquent/ghcnd_2016/';
CREATE EXTERNAL TABLE IF NOT EXISTS athena_test_1.ghcnd_stations (
id string,
latitude float,
longitude float,
elevation float,
state string,
name string,
gsn_flag string,
hcn_crn_flag string,
wmoid int
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES (
'serialization.format' = '1'
) LOCATION 's3://athena-test-data01/parquent/ghcnd_stations/';

データ数は以下となっています。

ghcnd_2016 174292
ghcnd_stations 100820

Amazon Athenaの実行結果

Row-orientedのCSVファイルの結果。データスキャンサイズが、Column-orientedの場合に比べて、4倍。

BigQueryでの実行結果

BigQueryと比較して、2秒差、スキャンサイズがBigQueryの1/2の結果になりました。

 

2016年12月9日
から hiruta
Google Cloud Functions で環境変数を使うには(Tipsネタも) #gcpug はコメントを受け付けていません。

Google Cloud Functions で環境変数を使うには(Tipsネタも) #gcpug

Google Cloud Platform(1)  Advent Calender 12/10分で書きました。

Runtime Configurationsはまだα版なので、今後仕様が変わる可能性があるかもしれません。

AWS Lambda、Azure Functionsとかでは、環境変数を扱えるので、Google Cloud Functionsでも使いたい願望が。

現状、Google Cloud functionsで環境変数を扱うことはできない。

ただ、Google Cloud FunctionsのEarly Access用Google Groupに環境変数を対応する予定があるか、聞いたところ、現状Runtime Configuration FundamentalsでGoogle Cloud Client libraryでは、対応しておらず、low-level APIのRuntime Configurationで行う必要がる。(Google Cloud Client libraryで対応してほしい。)

Runtime Configurationが対応しているGoogle APIはv1、v2には対応していないので注意。

https://cloud.google.com/deployment-manager/runtime-configurator/

Runtime Configの作成

gcloud alpha deployment-manager runtime-configs create functions-prod
gcloud alpha deployment-manager runtime-configs variables set TEST-KEY abcd1234efgh5678 --config-name functions-prod 

function auth (callback) {
var google = require('googleapis');
google.auth.getApplicationDefault(function (err, authClient) {
if (err) {
callback(err);
return;
}

if (authClient.createScopedRequired && authClient.createScopedRequired()) {
authClient = authClient.createScoped([
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/cloudruntimeconfig'
]);
}
callback(null, authClient);
});
}

function getVariable(configName, variableName, callback) {
var google = require('googleapis');
var config = google.runtimeconfig('v1beta1');

var fullyQualifiedName = 'projects/' + process.env.GCLOUD_PROJECT +
'/configs/' + configName +
'/variables/' + variableName;

auth(function(err, authClient) {
config.projects.configs.variables.get({
auth: authClient,
name: fullyQualifiedName
}, function(err, variable) {
if (err) {
callback(err);
return;
}
// decode the value as values are saved as base64-encoded strings
callback(null, Buffer.from(variable.value, 'base64').toString());
});
});
}

exports.myFunction = function (req, res) {
getVariable('functions-prod', 'TEST-KEY', function(err, stripeKey) {

// do something involving "stripeKey"

res.send('OK');
});
};

GoogleAPIs Node.js clientは8.0.0で確認。

また、Functionsでエラーになった場合、ErrorReportingと連携できるようになっています。

screencapture-console-cloud-google-errors-13056176819937875897-1481114893469

 

functions.env 変数でRuntime Configの環境変数を取れるようになるらしい。

As an FYI for anyone using the Firebase tools for Cloud Functions, the functions.env variable is built using Runtime Config as well.

Tipsネタをいくつか。

GCSトリガーでfunctionsを実行する際、lacks permissionとか発生するケースが。

edit object default permission でcloud functions用Service Account (Service Account名はCloud functionからBigQueryに登録した際にエラーメッセージの中から見つけました)を登録することで解決。以前はこの設定なくてもうまくいっていたんだけど。

error_2

Google Cloud Clinent library for node.jsのバージョンによって、発生しました。発生したバージョンは、0.35.0。Google Cloud Client library は、0.44もでているようだが、使えないバージョンもあるので、注意が要。動作がOKだったバージョンは、0.28.0でした。

error_3

12/9 の0:00ごろ?WEB Consoleでcloud functionsのインライン編集に対応していました。新規でfunctionsを作成すると、現仕様のサンプルコードが自動生成されます。下記はCloud Vision APIでLabel Detectionを使う例になります。package.jsonの編集にも対応していて、便利です。

inlineditor

 

2016年12月5日
から hiruta
Amazon AthenaのPartitioningについて #jawsug #gcpug はコメントを受け付けていません。

Amazon AthenaのPartitioningについて #jawsug #gcpug

https://cloud.google.com/storage/docs/public-datasets/landsat からダウンロードできるデータで、Amazon Athenaをつかって、クエリを実行してみました。

テーブル構成は以下の通りです。

CREATE EXTERNAL TABLE athena_test.landsat_data_csv (
SCENE_ID STRING,
PRODUCT_ID INT,
SPACECRAFT_ID STRING,
SENSOR_ID STRING,
DATE_ACQUIRED DATE,
COLLECTION_NUMBER STRING,
COLLECTION_CATEGORY STRING,
SENSING_TIME timestamp ,
DATA_TYPE STRING,
WRS_PATH INT,
WRS_ROW INT,
CLOUD_COVER decimal ,
NORTH_LAT decimal,
SOUTH_LAT decimal,
WEST_LON decimal,
EAST_LON decimal,
TOTAL_SIZE decimal,
BASE_URL STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
ESCAPED BY '\\'
LINES TERMINATED BY '\n'
LOCATION 's3://athena-test-data01/csv/';

単一のCSVでは、Partitioningでデータスキャンする容量を減らすことは不可。(Partitioningのために、S3上でフォルダが分かれてファイルが配置されていないといけないため)

Amazon Athenaの課金は、スキャンするサイズによるので、課金にもろ響きます。Athena破産の可能性も。

screencapture-console-aws-amazon-athena-home-1480936289615

データスキャンした容量は、968MB (CSVのファイルサイズと同じなので、全スキャン)が読まれます。

screencapture-bigquery-cloud-google-results-cms-production-1225-bquijob_780f3acf_158cebfd84f-1480937513091

一方、同じクエリでBigQueryで実行させるとほとんどスキャンされないで結果が返る。

BigqueryのようなことがAthenaでできると思ったら、間違いです。

2016年12月4日
から hiruta
GCPUG Shonan vol.9 (re:dash、Data Studio)によるVisualization #gcpug はコメントを受け付けていません。

GCPUG Shonan vol.9 (re:dash、Data Studio)によるVisualization #gcpug

GCPUG Shonan vol.9が本日ありました。お題は、BigQueryのデータのre:dash、DataStudioによるVisualization(可視化)でした。

サンプルデータのBigQueryへのインポート

 bq load --source_format=CSV --field_delimilter=',' --skip_loading_rows=1 --max_bad_records=1000 redash_shonan_handon.taxi gs://bq_shonan_handon/taxi.csv ./schema.json

Cloud Launcherにより、re:dashインスタンスの作成

※re:dash自体は、mac os x上のDocker上にも作ることは可能です。

IAMの設定だけでは、BigQuery Userの権限を与えておいても、re:dashでSELECT SQLすら権限がないよとなっていまいます。

Error running query: { "error": { "errors": [ { "domain": "global", "reason": "accessDenied", "message": "Access Denied: Table XXXXXXXXXXXXXXXXXXX:billing.201612: The user bqclient@XXXXXXXXXXXXXXXXXXX.iam.gserviceaccount.com does not have permission to query table XXXXXXXXXXXXXXXXXXX:billing.201612." } ], "code": 403, "message": "Access Denied: Table XXXXXXXXXXXXXXXXXXX:billing.201612: The user bqclient@XXXXXXXXXXXXXXXXXXX.iam.gserviceaccount.com does not have permission to query table XXXXXXXXXXXXXXXXXXX:billing.201612." } }

BigQueryのdatasetにおいて、Share datasetで最低Service Account名で権限を付与する必要があります。

screencapture-bigquery-cloud-google-queries-cms-production-1225-1480852442942

BigQueryの権限付与もIAMで一括して行ってほしい。

re:dash自体、0.12.0+b2449 (Cloud Launcherのばーじょんは少し古い)となっており、発展途上なところもあり、使い勝手的に?なところもあります。

Google Data Studio ( FREE版はレポートは5つまで)の紹介。re:dashはSQL(legacy SQL/Standard SQL)で組み立てるのが、Data Studioは、クエリの組み立てのカスタマイズは高くない。ただ、緯度経度情報があれば、MAPのコンポーネントがあるので、地図上にBigqueryのデータをplotすることは可能。コンポーネントについては揃っているように見えました。

(おまけ)re:inventで発表されたAmazon Athenaについて

Amazonが、BigQueryを意識して作ったと思いますが、Partitioning しないとCOUNTでもすべてのデータをスキャンしていまうこと。Partitioning Data することで、スキャンする量を制限はできそうですが。

Colossusの仕組みをAthenaで実現するのは不可能ではと思われる。

 

2016年11月13日
から hiruta
GCPUG しょうなん vol.8勉強会に参加しました。 #gcpug はコメントを受け付けていません。

GCPUG しょうなん vol.8勉強会に参加しました。 #gcpug

GCPUG しょうなん 一周年記念パーティとあり、GCP、GAEの2パネルディスカッションで進行しました。

スイートとかN.Gの話とかもありましたので、ここに書けないことも。

  • 東京リージョンの話

asia-east-1だと、時間により速度にむれがあるが、東京リージョンは安定している。

東京リージョンのWindows Serverインスタンスでデータコピーが速い

  • BigQuery

某データウェア製品と比べても、BigQueryはお安くできてしまう。

Bigqueryは、viewとか作成できますが、極力正規化すべき。(来年から価格体系が変わるらしい)

Auditログで、テーブルをフルスキャンする「SELECT *」しているユーザを特定することも。

  • Google Dataflow

GAE → Task Queue →プリエンプティブ インスタンス起動してやっていた処理も、Google Dataflow (Apache Beam)でかなりスマートにできる。 サポート言語は、Java、pythonだけど。

  • GAE

近年のサーバレスアーキテクチャーの流れで、PaaSが再注目。

プロジェクト作成時しかGAEのリージョン指定できないので、海外から東京リージョン(asia-northeast-1)に移行する際、プロジェクト作成から、IAM、Service Accountとかデータストア移行とかが発生する

App Engine Flexible Environment(FE)  1度の処理は保証されるTask Queueが使えるGCE

一周年記念パーティとのこともあり、料理も豪華でした。

15036550_1307693945971247_1726746184250435722_n

15027715_1307693989304576_4623979243900585908_n

15085621_1307705149303460_6262092848792538092_n

 

次回は、12/4予定とのこと。BigQueryとData StudioのVisualizationらしい。

2016年10月2日
から hiruta
CloudSQL Proxyを使用してCloudSQL SEに接続してみた。 #gcpja はコメントを受け付けていません。

CloudSQL Proxyを使用してCloudSQL SEに接続してみた。 #gcpja

CloudSQL インスタンスに接続するのに、通常の3306/tcpを行う方法とは別に、CloudSQL Proxyを使う方法があります。

CloudSQL Proxyを使わない場合、Authorized networksに、GCEインスタンスの外部向けIPアドレス(グローバルIP)を追加する必要があります。追加する必要がないのが、CloudSQL Proxyを使用した接続方法になります。

続きを読む →

2016年9月4日
から hiruta
ubuntuにjupyter notebookを導入 #jupyter はコメントを受け付けていません。

ubuntuにjupyter notebookを導入 #jupyter

9/1に、OSSユーザの勉強会 TensorFlow編でGoogle 中井様(@enakai00)から、jupyterでTensorFlowの話がありましたので、jupyter notebookをUbuntu 14.04に、jupyter notebook & TensorFlowをインストールしてみました。

続きを読む →

2016年7月26日
から hiruta
GCEにシリアルコンソール接続 はコメントを受け付けていません。

GCEにシリアルコンソール接続

getSerialPortOutputでもboot時のメッセージは確認はできますが、この方法だとread-onlyで、アクションを実行させることはできない。

シリアルコンソール接続てものが。

シリアルポート接続の有効化は以下コマンドで完了。

gcloud compute instances add-metadata [INSTANCE_NAME]  \
    --metadata=serial-port-enable=1

シリアルポート接続を有効にすると、Enable connecting to serail portsが有効化されます。Web UIでは有効にできなそう。

screencapture-console-cloud-google-com-compute-instancesDetail-zones-asia-east1-a-instances-instance-group-2-opjd-1469446491789

firewall ruleで22/tcpを閉じた状態でもコンソールのログインプロンプトが出ます。

https://cloud.google.com/compute/docs/instances/interacting-with-serial-console

注意書きにも書かれていますが、SSH鍵、IPアドレス、GCPプロジェクト名がわかっているとどこからでも接続できてしまう。IPベースのアクセス制限に対応してないとのこと