クラウドインフラ構築記

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

2016年1月31日
から hiruta
Google Cloud Visionでランドマーク認識 #gcpja はコメントを受け付けていません

Google Cloud Visionでランドマーク認識 #gcpja

Google の画像認識APIであるGoogle Cloud Visionが使えるようになりましたので、少しいじってみました。

Google Cloud Visonは、物体検知、有害コンテンツ検知、ランドマーク検知、OCR、顔検知など画像の情報を抜き出すことが可能です。REST APIでGoogleサイドと通信していると想定される。

Vision用のService Accountを作成し、credentialsの設定をするしておく必要があります。

export GOOGLE_APPLICATION_CREDENTIALS=deeplearning-environment-78bacd3d4b5b.json

Google APIにアクセスするのに、API discovery documentをベースとしたservice objectを作成する。GAリリースしたものは自動でfetchされるのだが、Vision APIは、alphaリリースなので、下記よりダウンロードする必要があります。

https://cloud.google.com/vision/docs/vision_discovery_v1alpha1.json

def get_vision_service():
 credentials = GoogleCredentials.get_application_default()
 with open(API_DISCOVERY_FILE, 'r') as f:
 doc = f.read()

 return discovery.build_from_document(
 doc, credentials=credentials, http=httplib2.Http())
LABEL_DETECTION  ラベル
FACE_DETECTION 顔認識
LANDMARK_DETECTION ランドマーク認識
TEXT_DETECTION OCR
LOGO__DETECTION ロゴ
SAFE_SEARCH__DETECTION  有害情報検知
SUGGESTION_DETECTION

以下ランドマーク認識の例です。以下で画像データをbase64にエンコードし、Vison APIに渡しています。

 with open(photo_file, 'rb') as image:
 image_content = image.read()
 batch_request = [{
 'image': {
 'content': base64.b64encode(image_content)
 },
 'features': [{
 'type': 'LANDMARK_DETECTION',
 'maxResults': 4,
 }]
 }]
 service = get_vision_service()
 request = service.images().annotate(body={
 'requests': batch_request,
 })
 response = request.execute()

IMAG0142

過去デジカメで撮影した写真を解析すると大阪城(Osaka Castle)として認識されています。位置情報もばっしり。

 {u'responses': [{u'landmarkAnnotations': [{u'locations': [{u'latLng': {u'latitude': 34.686777, u'longitude': 135.525799}}], u'score': 0.613115, u'mid': u'/m/024b_g', u'boundingPoly': {u'vertices': [{u'y': 955, u'x': 1545}, {u'y': 955, u'x': 2411}, {u'y': 1346, u'x': 2411}, {u'y': 1346, u'x': 1545}]}, u'description': u'Osaka Castle'}]}]}

TEXT_DETECTIONを使うと、ちらし画像から文字情報を取り出す(OCR)することもできます。

顔認識は、認識したポリゴン点の座標(fdBoundingPoly)を返してくれます。ただ、画像の中のすべての顔を認識してくれない、顔認識に失敗するケースがあるようです。

2016年1月26日
から hiruta
Autorecoveryの致命的な仕様 はコメントを受け付けていません

Autorecoveryの致命的な仕様

インスタンスの自動復旧機能として、Auto recoveryが用意されています。一時的な障害、インスタンスストアがアタッチしている、1日3度のリカバリのリトライに失敗する際、Auto recoveryを諦めるという運用上致命的な仕様があります。諦めたインスタンスの復旧は手動でstop/startを行えること。Autorecoveryを復旧手段に頼るのはやめるのがいいかもしれません。

screencapture-docs-aws-amazon-com-AWSEC2-latest-UserGuide-TroubleshootingInstanceRecovery-html-1453810845891

上記仕様については、トラブルシューティングで記載されております。(トラブルシューティングは英語版ドキュメントのみです。)

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstanceRecovery.html

この一方、GCEは稼働中のVMを0.5sでパケロスなしで別の仮想サーバーに移動してくれる。(http://qiita.com/kazunori279/items/41520689337a644a87b4 にGoogleの中の人が詳しく書いています。)

本ブログ稼働中のGCEインスタンスは100day連続稼働中です。instance template差し替え後止まっていないじゃないかと。

2016年1月24日
から hiruta
GCE間ネットワークのスループット #gcpja はコメントを受け付けていません

GCE間ネットワークのスループット #gcpja

ツイートに以下がありましたので、

iperf3で実際GCE間スループットを計測してみました。Preemptible VMでも制限されることなく、2Gbit/secでます。

同じリージョン間

0.00-10.00  sec  2.33 GBytes  2.00 Gbits/sec  491             sender

異なるリージョン間

.00-10.00  sec   131 MBytes   110 Mbits/sec   59             sender

2Gbits/secのスループットが出るのは、同一リージョンのGCE間になります。
異なるリージョンのGCEでも同じNetworkに属しているなら、Private IPで通信が可能。GCPの場合、リージョンを意識しないシステム構成も可能です。

2016年1月17日
から hiruta
DataFramesとDataSetを試してみました。 #ApacheSpark はコメントを受け付けていません

DataFramesとDataSetを試してみました。 #ApacheSpark

Spark 1.6がリリースされたことで、DataSet、DataFrameを試してみました。

まずは、事前に下記をインストールしておきます。(CentOS7にて)

  • Java7 1.7.0_80
  • Hadoop-2.6.3のインストール※インストールはこちらを参照してください。
  • Development  Toolsをグループインストール

環境変数の設定

export SPARK_DIST_CLASSPATH=$(hadoop classpath)

VMパラメータを設定します。これをしないと、Sparkのビルド途中でout of memoryで失敗します。

export MAVEN_OPTS="-Xmx2g -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=512m"

Spark 1.6のビルドをします。かなり時間がかかりますので、完了まで待ちます。Scalaは、 2.10.4

build/mvn -Pyarn -Phadoop-2.6 -Dhadoop.version=2.6.3 -DskipTests clean package

hadoopデーモンの起動

start-all.sh

DataSetで取り込むAWS IP Rangesをcsv形式で取り組んでおきます。Sparkはjson形式も取り込むことも可能ですが、ip-ranges.jsonそのままだとjson構造が入れ子になっていることもあり、csvにしてからSpark DataSetに取り込みました。

curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[] | {ip_prefix,region,service}' | jq "[.ip_prefix,.region,.service] | @csv" > ip_ranges.txt

Spark Shellを起動します。


$ spark-1.6.0/bin/spark-shell
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Using Spark's repl log4j profile: org/apache/spark/log4j-defaults-repl.properties
To adjust logging level use sc.setLogLevel("INFO")
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 1.6.0
/_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_80)
Type in expressions to have them evaluated.
Type :help for more information.
16/01/17 09:26:46 WARN Utils: Your hostname, localhost.localdomain resolves to a loopback address: 127.0.0.1; using 172.16.10.18 instead (on interface enp0s3)
16/01/17 09:26:46 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
Spark context available as sc.
SQL context available as sqlContext.

scala>

DataFramesスキーマ定義を設定

scala> case class AwsIp(ip_prefix: String, region: String, service: String)

上記で取得したAWS IP rangesのcsvをDataFramesに取り組みます。

scala> val awsip = sc.textFile("/home/hdspark/ip_ranges.txt").map(_.split(",")).map(p => AwsIp(p(0),p(1),p(2))).toDF()

DataFramesスキーマ定義の確認

scala> awsip.printSchema()
root
|-- ip_prefix: string (nullable = true)
|-- region: string (nullable = true)
|-- service: string (nullable = true)

regionでグルーピング。東京リージョンのCIDR数は、オレゴンより多いとは。

scala> awsip.groupBy("region").count().show()
+--------------+-----+
| region|count|
+--------------+-----+
| eu-central-1| 18|
| cn-north-1| 10|
| us-east-1| 122|
|ap-northeast-1| 56|
|ap-southeast-1| 50|
| us-west-1| 46|
| us-west-2| 51|
|ap-southeast-2| 34|
|ap-northeast-2| 11|
| GLOBAL| 35|
| us-gov-west-1| 6|
| sa-east-1| 29|
| eu-west-1| 74|
+--------------+-----+

serviceでグルーピング

scala> awsip.groupBy("service").count().show()
+--------------------+-----+
| service|count|
+--------------------+-----+
|ROUTE53_HEALTHCHECKS| 16|
| ROUTE53| 1|
| AMAZON| 323|
| CLOUDFRONT| 17|
| EC2| 185|
+--------------------+-----+

regionが「ap-northeast-1」が合致するものを抽出し、その中で、serviceが「AMAZON」のものを抽出することも。

scala> val f1 =awsip.filter(awsip.col("region").equalTo("ap-northeast-1"))
scala> f1.filter(f1.col("service").equalTo("AMAZON")).show()
+---------------+--------------+-------+
| ip_prefix| region|service|
+---------------+--------------+-------+
| 27.0.0.0g22|ap-northeast-1| AMAZON|
| 46.51.224.0g19|ap-northeast-1| AMAZON|
| 52.68.0.0g15|ap-northeast-1| AMAZON|
| 52.92.60.0g22|ap-northeast-1| AMAZON|
| 52.94.9.0g24|ap-northeast-1| AMAZON|
| 52.95.30.0g23|ap-northeast-1| AMAZON|
| 52.95.34.0g24|ap-northeast-1| AMAZON|
| 52.95.56.0g22|ap-northeast-1| AMAZON|
| 52.95.243.0g24|ap-northeast-1| AMAZON|
|52.95.255.48g28|ap-northeast-1| AMAZON|
| 52.192.0.0g15|ap-northeast-1| AMAZON|ml
| 52.196.0.0g14|ap-northeast-1| AMAZON|
| 54.64.0.0g15|ap-northeast-1| AMAZON|
| 54.92.0.0g17|ap-northeast-1| AMAZON|
| 54.95.0.0g16|ap-northeast-1| AMAZON|
| 54.150.0.0g16|ap-northeast-1| AMAZON|
| 54.168.0.0g16|ap-northeast-1| AMAZON|
| 54.178.0.0g16|ap-northeast-1| AMAZON|
| 54.199.0.0g16|ap-northeast-1| AMAZON|
|54.231.224.0g21|ap-northeast-1| AMAZON|
+---------------+--------------+-------+
only showing top 20 rows

こんな感じで、フィルタリング機能も充実しています。DataSet 、DataFramesについては下記も参照してください。

http://spark.apache.org/docs/latest/sql-programming-guide.html

in-memoryで動くこともあるが、Hadoopより100x高速なので、これからデータプロセッシングはSparkがお勧め。

2016年内に、2.0のリリースも予定。(Rearchitecting for Mobile Platform、MLLib 2.0)

MLLib 2.0 については、https://issues.apache.org/jira/browse/SPARK-12626も。

Google Dataproc、EMRとも現状、Spark 1.6.0には対応していません(1.5.2が対応している最新版)。Google DataProcは、2015/9、2015/11と新バージョンがリリースしているなので、次は、2016/1に新バージョンがリリース?

2015年12月29日
から hiruta
Google Dataflow入門編 #gcpug #gcpja はコメントを受け付けていません

Google Dataflow入門編 #gcpug #gcpja

Google Dataflowが、GAになりましたので、Google Dataflowを改めて。

cloudservice accountとか、Compute Engine Service Accountとか、新規プロジェクト作成時のみしか自動追加されない。既存プロジェクトに追加する方法が知りたいところ。Service Accountが登録されているなら、credentailsは不要のようだ。

  • maven 3.3.9
  • Java8 1.8.0_66
$git clone https://github.com/GoogleCloudPlatform/DataflowJavaSDK-examples.git

WordCountのサンプルを実行。実行過程で、VM インスタンスが起動します。

$ ../apache-maven-3.3.9/bin/mvn compile exec:java -Dexec.mainClass=com.google.cloud.dataflow.examples.WordCount &nbsp;-Dexec.args="--runner=BlockingDataflowPipelineRunner --project=<project name> --stagingLocation=gs://<GCS bucket>/staging/"

dataflowのコードテンプレートを生成は以下で行えます。

mvn archetype:generate \
 -DarchetypeArtifactId=google-cloud-dataflow-java-archetypes-starter \
 -DarchetypeGroupId=com.google.cloud.dataflo

Cloud Pub/Sub(PubSubIO)からデータを取得、処理を行い、BigQuery IO(BigQueryIO)でGoogle BigQueryに書き込むのもできてしまいます。

google dataflow は、現在のところ、preemptible VMに対応していません。preemptible VMはDataflowのようなジョブの使い方にはマッチすると思われるので今後のサポートに期待したい。

マシンタイプは、DataflowPipelineOptionsでディスクサイズ、Workerのサイズ、マシンタイプのカスタマイズは可能です。

オプションについては、https://cloud.google.com/dataflow/pipelines/specifying-exec-params

eclipse用のDataflow pluginも用意されているので、eclipse上からDataflowアプリケーションを実行させることも可能です。ローカル実行も。

https://cloud.google.com/dataflow/getting-started-eclipse?hl=ja

 

2015年12月26日
から hiruta
Google Cloud DatalabでBigQueryデータの可視化をしてみました。 #gcpug #gcpja はコメントを受け付けていません

Google Cloud DatalabでBigQueryデータの可視化をしてみました。 #gcpug #gcpja

Google Cloud Datalabは、ワンクリックで開始できる大規模データの探索、分析、可視化が行えるツールです。

過去途中でOut Of Memoryでデプロイに失敗していましたが、昨日試したところ、正常にデプロイできるようになっていました。アップレートされたのでしょうか。

Cloud Datalabを始めるには、https://cloud.google.com/datalab/?hl=ja から

Deployをクリックすれば、必要なインスタンスとかを作成してくれます。完了まで10分程度かかります。

screencapture-datalab-cloud-google-com-1451113496606

デプロイが成功すると、下記画面が表示できるようになります。

screencapture-main-dot-datalab-dot-skillful-fx-531-appspot-com-tree-1451114146971

変数定義

import gcp.bigquery as bq
import pandas as pd
df = bq.Query('SELECT * FROM [nginx_datasheet.access_log] limit 10000').to_dataframe();

10,000レコードをSELECTするのに、10秒。BigQuery Web UIだと4.2s(2Gデータ)なので、オーバーヘッドがある?

BigQueryのuaフィールドでグルーピングを行います。

groups = df.groupby('ua')

最後に、グラフで可視化

df['ua'].value_counts().head(20).plot(kind='bar', figsize=(20,10))

screencapture-main-dot-datalab-dot-skillful-fx-531-appspot-com-notebooks-access_log_analytics-ipynb-1451114559409

チュートリアルもDatalabをデプロイするとできます。Cloud Storageからデータをロード、むろんBigQueryのデータをロードして、可視化が簡単にできます。

グラフについても、折れ線、棒グラフ、パイチャート等できるようです。

作成したNoteBooksについては、Cloud Source Repositoryに保存されるようになっていて、Cloud Datalabを削除しても、再作成時に以前作成したNotebooksを再ロードしてくれます。

Cloudlabの削除もApp Engineを削除すれば、ワンクリックで完了です。

2015年12月23日
から hiruta
CloudSQL Second Generation ベンチマーク #gcpja #gcpug はコメントを受け付けていません

CloudSQL Second Generation ベンチマーク #gcpja #gcpug

初代CloudSQLより7x 高速スループット、20x ストレージ拡張性の特徴を持っているCloud SQL Second Generationがβ公開されています。インスタンスタイプもCompute Engine相当になっています。

CloudSQLのmysqlバージョンは、5.6.25(5.6.25-google-log)。Auroraは、5.6.10。

TPC-CでCloudSQL Second Generationのベンチマークを計測してみました。計測対象は、 db-n1-highmem-2(RAM 13G、10TB)を利用しました。r3.xlarge相当

多重度 Throughput(tps) Response time (90%tile)
New-Order Payment Order-Status Delivery Stock-Level New-Order Payment Order-Status Delivery Stock-Level
db-n1-highmem-2  16  92.8 92.8 9.3 9.3 9.3 171 127 10  262 11
Aurora

db.r3.xlarge

16 195.5 195.6 19.6 19.6 19.6 67 27 7 91 9

現状Auroraの1/2のベンチマーク結果となっているようです。CloudSQL Second GenerationからCompute Engine同様継続割引が自動的に適用されます。

初代CloudSQLからのアップグレードは現状提供されていませんので、マニュアルでの移行が必要です。

2015年12月21日
から hiruta
Amazon Swagger Importerを試してみました。 はコメントを受け付けていません

Amazon Swagger Importerを試してみました。

先週12/17 のJAWS-UGアーキテクチャー専門支部の中でインタラクティブなWEBドキュメントを作成できるSwaggerからAWS APIGateway にインポートするツールを試してみました。

Amazon Swagger Importerは下記で取得します。

git clone https://github.com/awslabs/aws-apigateway-swagger-importer.git
  • Apache Maven 3.3.9
mvn assembly:assembly

コマンド自体はこれで実行が可能ですが、credentialsの設定が必要です。

aws-api-import.cmd --create --region ap-northeast-1 path/to/swagger.json

credentialsですが、role_arn、source_profile プロパティは使用することはできません。つまり、STS経由でアクセスすることはできません。

screencapture-ap-northeast-1-console-aws-amazon-com-apigateway-home-1450703593191

Swaggerでエクスポートしたものをインポートして、同じ状態で復元できました。

Swaggerはswagger-editor等ツールも充実しているので、SwaggerでAPIを設計して、API Gatewayにインポートする使い方もできると思われる。

2015年12月12日
から hiruta
Raspberry Pi 2 +L-02Cで回線速度測定 #soracom はコメントを受け付けていません

Raspberry Pi 2 +L-02Cで回線速度測定 #soracom

Raspberry Pi 2 Model Bに、L-02C経由で接続した際の速度をspeedtest_cliを利用して計測してみました。

speedtest_cliは、git clone https://github.com/sivel/speedtest-cli.gitから取得が可能。最適な測定サーバーを選択して計測が下り、上りで計測することができます。

  • s1.minimum

socket.timeoutで計測不能

  • s1.slow

Down 0.12Mbit/s Up 0.09 Mbit/s

  • s1.standard

Down  0.47 Mbit/s Up  0.47 Mbit/s

  • s1.fast

 Down 1.88 Mbit/s Up 1.68 Mbit/s

s1.fastは2M近くまででます。

速度変更がコンソールとかで切り替えたと同時に即反映されるのはやはりいい。

2015年12月12日
から hiruta
Yocto Linux がインストールされているEdisonへのL-02Cの接続について #iot はコメントを受け付けていません

Yocto Linux がインストールされているEdisonへのL-02Cの接続について #iot

Yocto Linux がインストールされているEdisonのUSBポートにL-02Cを接続してみました。

Raspberry Piを接続したときと動揺、L-02CがCDROMドライブとして認識されてしまう。

[ 170.876164] scsi0 : usb-storage 1-1:1.0
[ 171.873218] scsi 0:0:0:0: CD-ROM LG Autorun 2.00 PQ: 0 ANSI: 0
[ 171.879220] sr0: scsi-1 drive
[ 171.879244] cdrom: Uniform CD-ROM driver Revision: 3.20
[ 171.880270] sr 0:0:0:0: Attached scsi CD-ROM sr0
[ 171.881279] sr 0:0:0:0: Attached scsi generic sg0 type 5
root@edison:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 1004:61dd LG Electronics, Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

が、ejectコマンドが、Yocto Linuxにはない。現状ここまでか。