読者です 読者をやめる 読者になる 読者になる

/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

HiveでネストしたJSONデータのテーブルマッピング

HiveでJSONデータを処理する場合には、json_tuple*1や get_json_object*2を使えば処理できますが、複雑なJSONだとクエリがカオスに。。。json_tupleやget_json_objectでがんばるよりも、struct型やarray型*3を使ったテーブル定義を作ってマッピングしてやると捗ります。

例えば以下のような構造のJSONデータの場合

実際には改行はなく1行のデータで、文字列内の改行は¥nでエスケープされ、gzip等で圧縮されている状態

以下のテーブル定義を作ってやるとうまいことマッピングされます。注意点としてJOSNのキー名がキャメルケースの場合、キー名は全て小文字となるようです。

Hive-JSON-Serde*4を使っていますが、 HCatalogのJSON SerDe(org.apache.hive.hcatalog.data.JsonSerDe)*5でもできます。

struct型の中はドットで簡単に参照できます。

struct型の中のarray型はlateral view*6を使って簡単に展開できます。

Enjoy!

Hive便利UDF

元ネタがJSONだったりするとリストやマップの処理でいろいろとつらいってことで、かゆいところに手が届くUDF詰め合わせ。かなり便利です。ありがたい。

今日もETLバッチ処理でHive大活躍ですわ!

Enjoy!

ELBのログをLambda、Norikra、Mackerelを使っていい感じに処理する

ELBが結構504を返したりしていたりするので、Lambda、Norikra、Mackerelを使ってモニタリングできるように処理してみました。

S3 -> Norikra

ELBは適当に5分ぐらいの間隔でS3にログを出力するようにしておき、 S3のオブジェクト作成イベントをトリガに起動、Norikraに突っ込むLambdaを作成します。

ELBのログフォーマット*1は スペース区切りでrequestとuser-agentのみダブルクオートで囲まれる形でパースがめんどくさそうですが、 それってdelimiterにスペース、quotecharにダブルクオートを指定したcsvフォーマットではってことで、csvモジュールを使って読み込むとパースが楽です。(csvモジュールは文字コードの扱いがアレだったりしますが、ELBのログであれば文字コードでハマることはなさそうかなと思います)
Norikraへの投入はRestAPI経由で、RequestsでJSONを投げるだけです。

Norikraで集計

Norikra側で適当にELB単位で500系エラーを集計してみます。

その他ステータスコードでまとめて集計したり、レスポンスタイムの最大値、最小値、平均値を集計したりするのも良いですね。

Norikra -> Mackerel

Norikraから集計結果を取得、Mackerelのサービスメトリックに突っ込むLambdaを作成して、5分おきに実行するようにしておきます。 Mackerelのサービスメトリックは事前にWebコンソールから作成しておかないと404になるので作成を忘れずに。(適当なサービス名で投げれば自動で作ってくれると思っていてハマった。。。)

まとめ

Norikra以外の部分はサーバレスに実装できていい感じです。Norikraはメモリをモリモリ使うのでR3インスタンスで、ECSやBeanstalkを使ってDockerで構築すると捗ります。JVMの設定を弄るのを忘れずに。
ELBのログをいい感じに処理できました!

Enjoy!

Docker-in-DockerできるJNLP用Jenkinsスレーブ

Docker内でSSHのデーモンは上げたくないし、Supervisorもインストールしたくないなということで、dindできるJNLP用Jenkinsスレーブのイメージつくてみました。 JenkinsオフィシャルのJNLP用スレーブ*1とdind*2を組み合わせただけですが。。。

Alpine版

Ubuntu

使い方は --privileged を付けて起動する以外、オフィシャルのJNLP用スレーブと変わらないです。Ubuntu版はもっとスリム化できるかも?
CouncourseCI*3を使おう的な話もありましたが、結局Jenkinsに再入門している罠。

Enjoy!

Docker環境でのre:dashのDBマイグレーション

re:dash*1のDBマイグレーションはfabricスクリプト*2が提供されていますが、fabricだとSSHする形になるのでDocker環境では都合が悪いです。 なんとかならないかなと適当にシェルスク書いてみました。

envfile、現在のバージョン、マイグレーション先のバージョンを渡す形です。 引数のチェックとか、バージョンのバリデーション、イメージの有無、スクリプト実行時のエラー処理等のエラーハンドリングは全くしていないので悪しからず。

一応こんな形でDocker環境でもDBマイグレーションできますが、マイグレーションの仕組み自体が正直イマイチな感じが。。。 PythonだとFlyway*3的なツールはないのかしら。。。マイグレーション時はバックアップを忘れずに!

Enjoy!

EMR 4.4.0でJSON SerDe

HiveでJSON SerDeであれば rcongiu/Hive-JSON-Serde*1 を使うのが一般的かと思われますが、 EMR 4.4.0からHCatalogが使えるようになっているので*2、 HCatalogのJSON SerDe*3を使うこともできます。 /usr/lib/hive-hcatalog/share/hcatalog/ 以下にJarがあるので、コンパイルしてJarをデプロイする手間がはぶけます。

以下は適当にS3外部テーブルを作成して、GZIP圧縮したJSONファイルを出力するような例です。

出力時にもADD JARをする必要があるのでお忘れなく。ダイナミックパーティションは地味に便利ですね。

Enjoy!

AlpineLinuxでNorikraのDockerイメージ作ってみた

Norikra*1を手軽に使いたいってことでAlpineLinux*2でイメージ作ってみました。

https://hub.docker.com/r/laughingman7743/docker-alpine-norikra/

AlpineLinuxを使うとかなりイメージを小さくできて良いですね。それでも200MBぐらいありますが。。。

Enjoy!