AVRO形式のファイルを取り扱いたい
AVROとはApacheプロジェクトのひとつとして開発されているデータ交換形式です。 コンパクトなバイナリで高速なシリアライズ・デシリアライズが行えるため、サーバーログなどに利用されています。
弊社内での一部システムのログデータにも利用されているのですが、専用のバイナリ形式であるため、テキストエディタで内容を確認することができません。そこで今回はPythonを用いてAVRO形式のデータを変換して内容を確認する方法を紹介します。
fastavroのインストール
Pythonからavroを取り扱うためには、fastavroをインストールする必要があります。仮想環境を作成して、fastavroをインストールします。
※今回はPython 3.6.0環境で作業を行っています。
[code lang=text] $ mkdir avro $ python3 -m venv avro/ $ cd avro/ $ . bin/activate (avro) $ pip3 install fastavro [/code]
fastavroを活用してjson形式に変換
以下のプログラムでJSON形式として文字列を出力させます。
[code lang=python] import sys import fastavro as avro import json
if (len(sys.argv) != 2): sys.stderr.write('usage: python test.py {filename}n') exit(2)
with open(sys.argv[1], 'rb') as fo: for recode in avro.reader(fo): print(json.dumps(recode), flush=True)
[/code]
利用法
[code lang=text] $ python3 test.py testlog.avro > out.json [/code]
jqをもちいてjson形式のファイルから値を取得
以上までで avro 形式のファイルを json 形式に変換できました。JSON形式のファイルは jq コマンドを用いることで特定の値を取得することができます。各環境にあわせて jq コマンドをインストールします。
[code lang=text]
mac では homebrew でインストールする
$ brew install jq [/code]
以下のような構造のログから jq コマンドを用いて各ログにあるipアドレスを取得します。
[code lang=text] {"request": {"datetime": "2017-02-03 00:00:00", "ip": "10.0.xxx.xxx", …… {"request": {"datetime": "2017-02-03 00:00:01", "ip": "10.0.xxx.xxx", …… [/code]
-rをオプションを用いると、文字列のクォーテーションを除去してくれます。
[code lang=text] $ jq -r '.request.ip' out.json 10.0.1.xxx 10.0.2.xxx 10.0.1.xxx 10.0.2.xxx [/code]
パイプラインを繋げてソートと重複除去を行うことでIPアドレスの一覧を作成します
[code lang=text] $ jq -r '.request.ip' out.json | sort | uniq 10.0.1.xxx 10.0.2.xxx [/code]
まとめ
fastavroとjqでAVRO形式のファイルからデータを取得する方法を紹介しました。fastavroを用いてAVROのJSON化を行うことでTreasureDataに格納したり、jq コマンドから取り扱うことが可能となります。AVRO形式のログファイルを扱っている場合には今回紹介した方法をためしてみてはいかがでしょうか。