Hiveで半構造化ログをそのまま読み込んでしまえ!
Hiveを勉強したら、思った以上によかったので
いいと思ったことを紹介。
①正規表現で半構造化ログファイルを読める!
Hiveのテーブルを以下のように作ると、
ログファイルをそのまま読むことができます!
https://issues.apache.org/jira/browse/HIVE-662
input.regexにログ1行のログのフォーマットを正規表現で指定します。
output.format.stringでHiveが読むときのフォーマットを
JavaのFormatterクラスの変換形式に従って指定します。
#http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Formatter.html
簡単に言えば、
input.regexの正規表現で「()」書きした箇所が、先頭から順に
output.format.stringの%1$s、%2$s、%3$s…
となっていくイメージです。
※文字列ならば。数字が入ると「s」が「d」や「f」になります。
リンク見て、お分かりの通り、
転送してきたログファイルをいちいち加工(パース)することなく、
HiveにLOADしてあげるだけで、検索できるようになっちゃんです!
BigDataと呼ばれるほど、大きなデータになればなるほど、
効力が出てくるんじゃないでしょうか。
②圧縮ファイルをそのまま読める!
Hiveは圧縮ファイルを解凍せずとも、ファイルを読めます。
http://metasearch.sourceforge.jp/wiki/index.php?Hive%A4%C8%B0%B5%BD%CC%A5%C7%A1%BC%A5%BF
できる圧縮形式はGZip,LZO,BZip2,
あと、上記リンクには紹介されていないですが、Snappyもできます。
※(英語)http://mapredit.blogspot.com/2012/01/use-snappy-codec-with-hive.html
あ、もちろんSequenceFileもOK。
てっきりplainじゃないと読めないと思ってました。
よくよく考えてみれば、
Hiveの検索は結局MapReduceですから、
MapReduceでできていることはHiveでもできて当然なんですけどね。。
③パーティションを事前に作れば、LOAD不要
なぜかは知りません。
やったらできたレベルです。
もう少しHiveのメタデータについて、勉強しないと仕組みはわかりません。
けど、これで、
転送されてきた圧縮ファイルをHDFSの特定のディレクトリに配置するだけでよいので
転送されたその時から、即検索できちゃう!!
リアルタイムにデータ転送をするストリーム転送と相性よさそうですね。