mazeltov7のweb断片

備忘録的なテキトーなことを書きます。(技術記事はQiitaに移行しました http://qiita.com/mazeltov7 )

Autoingestionを使って、Appストアの月次・日時データを取得する。

プログラムでAppストアの月次・日時のインストールデータとかを取りたい場合、Appleが用意したAutoingestionというツールを使うと便利。ドキュメントは以下のあたり。
https://www.apple.com/itunesnews/docs/AppStoreReportingInstructions.pdf
http://www.apple.com/itunesnews/docs/PianoInstructions.pdf
(ドキュメントのバージョンとか、対応するドキュメントがすごいわかりにくい。どこかにまとめててくれ…)
基本的には、ここに書いてるのに沿ってやればOK
iTunesConnectからアプリダウンロード数レポートを自動取得する方法 | zaru blog

Autoingestionなどをインストール

http://www.apple.com/itunesnews/docs/Autoingestion.class.zip
ここからインストールする。中にAutoingestion.classautoingestion.propertiesが入ってる。autoingestion.propertiesのところにログインに使用するAppleIDとパスワードを記載する。

userID = hogehoge@gmail.com
password = hogepiyo  

で、準備完了なので、コマンドを実行

$ java Autoingestion <autoingestion.properties> <vendorid> <report_type> <date_type> <report_subtype> <date_yyyymmdd>

// 2016/10/11の日時レポート取る場合
$ java Autoingestion autoingestion.properties 12345678 Sales Daily Summary 20161011

// 2016/09の月次レポート取る場合
$ java Autoingestion autoingestion.properties 12345678 Sales Monthly Summary 201609

PlayストアとAppストアのインストールデータのタイムゾーン

Playストア

アプリのパフォーマンスの統計情報を表示する - Android - Google Play デベロッパー ヘルプ
google developer consoleでは、表示した端末のタイムゾーン(ローカルタイム)になるけど、csvに落とした時のDateのデータはPSTになってる、ってことなのかな。
インストール・アンインストール・評価はPST、収益はUTC

Appストア

AppアナリティクスはUTCとローカルタイムが選べる。インストールツールのAutoingestion使った場合のcsvのBegin Dateとかはローカルタイムっぽい。日本だとJST

How is a day defined for these reports?
A day starts at 12:00:00 a.m. and ends at 11:59:59 p.m. in the territory’s time zone 

How is a week defined for these reports?
A week starts on Monday at 12:00:00 a.m. and ends on Sunday at 11:59:59 p.m.

What time zone is the report date based on?
When are these reports available?
Reports are available by 6 a.m. in each territory’s respective time zone.

https://www.apple.com/itunesnews/docs/AppStoreReportingInstructions.pdf

dateコマンドでdate: illegal time formatエラー

OSXで、

$ date +"%Y-%m-%d" -d '1 day ago'
> usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

とか出てしまったりorz waaaaatと思ってたら完全にこれだった。。
OSXとGNU系コマンドを揃える - Qiita

OSX

$ echo `date -d '1 day ago' +"%Y-%m-%d"`
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]

$ echo `date -v-1d +"%Y-%m-%d"`
2014-10-23

Linux

$ echo `date -d '1 day ago' +"%Y-%m-%d"`
2014-10-23
$ echo `date -v-1d +"%Y-%m-%d"`
date: invalid option -- 'v'
Try 'date --help' for more information.

うむ

gsutilを使ってplayストアのデータを取得する

クリーンインストールしたからか、ローカルにgsutilコマンド無くなってたので、入れ直してみた。
前回はgsutilだけをインストールして使ってたけど、ドキュメントによるとGoogle Cloud SDK入れてその中のgsutilコンポーネント使ってね、って感じに変わってた。
https://cloud.google.com/storage/docs/gsutil_install
Google Cloud SDK Documentation  |  Cloud SDK  |  Google Cloud Platform

普通にインストールしてunzipした後、

$ ./google-cloud-sdk/install.sh // いい感じにパス通してくれたりする(zshもOK)
$ ./google-cloud-sdk/bin/gcloud init // authentificationとかも含めてloginとかする(前回authentificationどうだったけな・・ここやってないとgsutilでのcpでauth失敗する)

できたら、あとは普通に使えるようになる。

$ gsutil cp gs://pubsite_prod_rev_123456hogehgoe.csv ~/Downloads // インストール数とかダウンロード

AndroidストアのデータをElasticsearchに入れてkibanaで表示

データ入れる

ストア管理画面から、アプリデータのcsvファイルを取得して、./app_data/csv/に入れる。 簡単なconfigurationをseed.ymlに書く。

in:
  type: file
  path_prefix: ./app_data/csv/
out:
  type: elasticsearch
  index: app_data
  index_type: android
  nodes:
    - host: localhost

で、

$ embulk guess ./app_data/csv/ -o config.yml

とすると、いい感じにconfig.ymlを作ってくれる!sugoi! タイムゾーン変えたい場合は以下加える。

parser:
  default_timezone: 'Asia/Tokyo'

で、

$ embulk run config.yml -c diff.yml

にて、データ入る。素晴らしい!

ref: Scheduled bulk data loading to Elasticsearch + Kibana 4 from CSV files — Embulk 0.8 documentation

kibanaで表示

例として、アプリのマンスリーレポートのcountryレポートのcsvデータを読み込んだとする。
主要国のcurrent device installとかを出してみる。
Visualizeでフィルターに"Country": "US"として、X-AxisDate-Histogramで、Y-AxisにAggregationでSum(current device installにすでに集計されたデータ入ってるのでそれを表示するために仕方なく。別にmaxでもminでも同じ表示になる。)を設定、FieldCurrent Device Installをセット。これで反映すると日別のUSのアプリインストールされてるデバイス数推移が出る。

んー、なんかもっとスマートにやりたいな。もっといじっていく。

Elasticsearchで大量データ挿入でのエラー(queueのcapacity)

これはなに

前回のMysqlからESにデータを200万件くらい入れるとエラー出て5000件くらい喪失してた件。 MysqlからElasticsearchにデータを入れる - mazeltov7のweb断片

ログをチェックすると、esrejectedexecutionexception queue capacity 50とか出てて、このあたりっぽい。
exception - EsRejectedExecutionException in elasticsearch for parallel search - Stack Overflow
ここも参考。
fluentd -> Elasticsearch 大量データ転送でトラブル | diaspora

とりあえずbulkのqueueのキャパを増やして再トライ

elasticsearch.ymlで、

threadpool.bulk.queue_size: 100 // デフォルト50

結果:ES内データ2068221 (Mysqlのデータ2068246)
惜しい・・20件くらいどっか行ってる・・ 次は、

threadpool.bulk.queue_size: 130 // デフォルト50

でトライ
結果:ES内データ2068246(Mysqlのデータ2068246)
YAY!
ただ、途中で以下のこのエラーやっぱり出てるの気になるな・・

[99]: index [.marvel-es-1-2016.09.20], type [index_stats], id [AVdG8wYaTnsUn8dLrCLT], message [RemoteTransportException[[Avarrish][127.0.0.1:9300][indices:data/write/bulk[s][p]]]; nested: EsRejectedExecutionException[rejected execution of org.elasticsearch.transport.TransportService$4@3a0e97f2 on EsThreadPoolExecutor[bulk, queue capacity = 130, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@4c6977a4[Running, pool size = 8, active threads = 8, queued tasks = 130, completed tasks = 7362]]];]]

まぁ、データ入ったので、ちと保留

MysqlからElasticsearchにデータを入れる

embulkを入れる

GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader. http://www.embulk.org

$ brew install embulk

ドキュメントのGetting Startedやって雰囲気をつかむ。

embulkのpluginのembulk-input-mysql, embulk-output-elasticsearchを入れる

embulk-input-jdbc/embulk-input-mysql at master · embulk/embulk-input-jdbc · GitHub
GitHub - muga/embulk-output-elasticsearch

$ embulk gem install embulk-input-mysql
$ embulk gem install embulk-output-elasticsearch

で、入れるmysqlのデータ、ESのデータのconfigurationのconfig.ymlを書く。

in:
  type: mysql
  host: localhost
  user: $user_name
  password: $password_name
  database: $database_name
  table: $table_name
  select: "*"
out:
  type: elasticsearch
  index: $index_name
  index_type: $index_type_name
  nodes:
    - {host: localhost, port: 9300}

で、

$ embulk preview config.yml // 確認
$ embulk run config.yml // 実行

PS: 200万件くらい入れたら、途中数回エラーが出て5000件ほど入ってなかったので確認をば。queueのcapacityが50にしてて、そのを越えた?っぽい。ので調整で再トライ。esrejectedexecutionexception queue capacity 50この辺ぽい