/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でカレンダーテーブルを簡単に作る

集計処理でカレンダーテーブルがあると何かと便利なのでカレンダーテーブルを作りたいなと思ったのですが、HiveにはPostgreSQLのgenerate_seriesのような関数がない。。。
UDFなら作っている人がいそうな気がしたので調べてみると、Hivemall*1のUDFにgenerate_series関数*2があるのでそれを使って作ります。

Hivemallの使いどこはそこじゃない感がありますが、簡単にカレンダーテーブルが作れます。 カレンダーテーブルをベースにJOIN、nvl(Prestoだとnullif)を使えば、window関数で抜けた日付があっても安心ですね。

HivemallはSQL機械学習とかできたりして何気にスゴイのでは。SQLで完結できるのでかなりおっさん向けな感じかなと思ったり。

Enjoy!

Feedlyではてなブックマーク数が表示されなくなったので雑に直した

オリジナルは以下です。

Feedly 移行記念、Feedly をはてブ対応させるユーザースクリプト – OTCHY.NET

Enjoy!

EMRでADD JARしたくない場合の対処法

Hive

ブートストラップアクションでJARを適当なディレクトリに配置し、hive-envの設定をしてやればADD JARしなくて良くなります。 (以下は /usr/lib/hive/plugin ディレクトリにJARを配置しています)

Presto

PrestoにはそもそもADD JARはないので、JSONデータをマッピングしたHiveのテーブルを参照したい場合等に困ります。(基本的にはParquetかORCにETLして参照した方が良いですが。。。)
ブートストラップアクションでJARを /usr/lib/presto/plugin/hive-hadoop2/ 以下に配置してやれば良いです。 (ブートストラップアクションが実行されるタイミングではディレクトリ自体がないので、作成してやる必要があります)

PrestoでのJSONデータの参照はParquetやORCに比べると遅いですが、Hiveと比べるとストレスなくデータを参照できたりします。TezでもHive遅い。。。

Enjoy!

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!