2013年10月1日火曜日

HadoopでHDFS化したログをHiveとImpalaで高速検索


◆ 目的
HadoopでHDFSを組んだ環境に、HiveとImpalaを導入し、
高速ログ検索を実現させる。
Hdoop、Hive、Impalaの設定はすべて終わっており、
利用できる状態にあるものとする。

ここではどのようにログを取り込み、
検索を実施するのか一通りの手順を記載する。

Hadoop、Hiveは耳にしたことがあっても、
まだImpalaについては知らないという人もいるだろうか。
Impalaについてのまとまった記事



◆ 環境
説明するための環境を定義しておく。

・ログの収集対象であるアプリケーションサーバ名
app1
app2
app3


・上記アプリケーションサーバのログ出力形式
ホスト名と日時が付与され、1時間おきにローテートされる。
app_app1_2013100100.log.gz ←app1の2013年10月01日00時ログ
app_app1_2013100101.log.gz ←app1の2013年10月01日01時ログ
app_app1_2013100102.log.gz ←app1の2013年10月01日02時ログ

app_app2_2013100100.log.gz
app_app2_2013100101.log.gz
app_app2_2013100102.log.gz

app_app3_2013100100.log.gz
app_app3_2013100101.log.gz
app_app3_2013100102.log.gz


・ログ収集サーバ
log1サーバ
log2サーバ
log3サーバ




何台いてもいいのだが、これらサーバ群の特定領域をHDFS化させている。
HDFS領域
/log/

そしてこのサーバ上でHiveとImpalaを動作させている。

appサーバ群のログを取得する際の一時的な保管場所は以下をする。
HDFS化していないローカルディスク(log1にあるとする)である。
/tmp/log/



◆ ログ投入事前作業
・テーブル作成
logサーバ群上でテーブルを作成する。
当然テーブルを作成するのは最初だけである。

どういったログ検索を事前に行うか決まっていないため、
柔軟性を優先し、ログはそのままmsgというカラムに入れる。
パーティションとして日時を付与する。dtと名称する。

logサーバ群のマスタ上で実行する。
$ sudo -u hdfs hive
> CREATE TABLE app_log    (msg STRING) PARTITIONED BY (dt STRING) ROW FORMAT DELIMITED LINES TERMINATED BY '\n';
> CREATE TABLE app_impala (msg STRING) PARTITIONED BY (dt STRING) ROW FORMAT DELIMITED LINES TERMINATED BY '\n' STORED AS SEQUENCEFILE;


・テーブルの確認
> SHOW TABLES;
log
log_impala

> DESC app_log;
msg string
dt string

> DESC app_log_impala;
msg string
dt string



◆ ローカルディレクトリへのログ収集
まずはlogサーバのローカルディスクである/tmp/log/へ
appサーバ群のログを持ってくる。
scpなりで定期的にバッチ処理させればよい。
expectを利用してscpを自動化
sshで多段接続をしてscp



◆ HDFSへのログ投入
ローカルディスクである/tmp/log/からログをHDFSへ取り込む。
時間ごとのログ単位でパーティションを切っていく。

・HDFS化
(2013年10月01日00時のログを投入する場合の実行例)
% sudo -u hdfs /usr/bin/hive -e "LOAD DATA LOCAL INPATH '/tmp/log/*2013100100*' \
INTO TABLE app_log PARTITION (dt='2013100100')"

(2013年10月01日01時のログを投入する場合の実行例)
% sudo -u hdfs /usr/bin/hive -e "LOAD DATA LOCAL INPATH '/tmp/log/*2013100101*' \
INTO TABLE app_log PARTITION (dt='2013100101')"

(2013年10月01日02時のログを投入する場合の実行例)
% sudo -u hdfs /usr/bin/hive -e "LOAD DATA LOCAL INPATH '/tmp/log/*2013100102*' \
INTO TABLE app_log PARTITION (dt='2013100102')"

※取り込み元のローカルパス名に''必須


・パーティションの設定の確認
$ sudo -u hdfs hive
> SHOW PARTITIONS app_log;
dt=2013100100
dt=2013100101
dt=2013100102


・ファイルが取り込まれたことの確認
% hdfs dfs -ls -R /log/app_log/
/log/app_log/dt=2013100100/app_app1_2013100100.log.gz
/log/app_log/dt=2013100101/app_app1_2013100101.log.gz
/log/app_log/dt=2013100102/app_app1_2013100102.log.gz

/log/app_log/dt=2013100100/app_app2_2013100100.log.gz
/log/app_log/dt=2013100101/app_app2_2013100101.log.gz
/log/app_log/dt=2013100102/app_app2_2013100102.log.gz

/log/app_log/dt=2013100100/app_app3_2013100100.log.gz
/log/app_log/dt=2013100101/app_app3_2013100101.log.gz
/log/app_log/dt=2013100102/app_app3_2013100102.log.gz



◆ Impalaへのログ投入
HDFSにログが格納された。
それをHive経由で取得し、Impalaのテーブルに入れ込む。

・Impalaへの取り込み
(2013年10月01日00時のログを投入する場合の実行例)
sudo -u hdfs /usr/bin/hive -hiveconf hive.exec.compress.output=true \
-hiveconf hive.stats.autogather=false \
-hiveconf mapred.max.split.size=256000000 \
-hiveconf mapred.output.compression.type=BLOCK \
-hiveconf mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-e "INSERT INTO TABLE app_log_impala PARTITION (dt='20131000') \ 
SELECT msg FROM app_log where dt='2013100100'"
※オプションは各環境ごとに変えればよい。

(2013年10月01日01時のログを投入する場合の実行例)
sudo -u hdfs /usr/bin/hive -hiveconf hive.exec.compress.output=true \
-hiveconf hive.stats.autogather=false \
-hiveconf mapred.max.split.size=256000000 \
-hiveconf mapred.output.compression.type=BLOCK \
-hiveconf mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-e "INSERT INTO TABLE app_log_impala PARTITION (dt='2013100101') \ 
SELECT msg FROM app_log where dt='2013100101'"

(2013年10月01日02時のログを投入する場合の実行例)
sudo -u hdfs /usr/bin/hive -hiveconf hive.exec.compress.output=true \
-hiveconf hive.stats.autogather=false \
-hiveconf mapred.max.split.size=256000000 \
-hiveconf mapred.output.compression.type=BLOCK \
-hiveconf mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-e "INSERT INTO TABLE app_log_impala PARTITION (dt='2013100102') \ 
SELECT msg FROM app_log where dt='2013100102'"


・ファイルが取り込まれたことの確認
% hdfs dfs -ls -R /log/app_log_impala/



◆ 削除処理
ログを削除する手順も残しておく。

・パーティションごと削除する場合
% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log DROP PARTITION (dt='2013100100')"
% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log DROP PARTITION (dt='2013100101')"
% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log DROP PARTITION (dt='2013100102')"

% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log_impala DROP PARTITION (dt='2013100100')"
% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log_impala DROP PARTITION (dt='2013100101')"
% sudo -u hdfs /usr/bin/hive -e "ALTER TABLE app_log_impala DROP PARTITION (dt='2013100102')"


・テーブルごと削除する場合
% sudo -u hdfs /usr/bin/hive -e "DROP TABLE log"
% sudo -u hdfs /usr/bin/hive -e "DROP TABLE log_impala"



◆ 検索
・Hiveでの検索例
% sudo -u hdfs hive
> SELECT msg FROM app_log WHERE dt='2013100100' AND msg LIKE '%hoge%';
> SELECT msg FROM app_log WHERE dt REGEXP '2013100[012]' AND msg LIKE '%hoge%' AND msg LIKE '%piyo%';

 シェルモードに入らない場合は-eオプションを使う。
% sudo -u hdfs hive -e "SELECT ~"


・停止処理
検索処理実行後Killコマンドが発行される。
Ctrl+Cで抜けただけではバックエンドで検索が続けられるため、
提示されたこのコマンドで停止させること。
Kill Command = $HADOOP_PATH/bin/hadoop job -kill job_201310012000_0001


・Impalaでの検索
% sudo -u hdfs -i impala-shell -r
> SELECT ~
検索対象テーブルとしてapp_log_impalaを指定する以外はhiveと違いはない。

-rオプションを付与しないとメタデータがずっとキャッシュされる

シェルモードに入らない場合は-qオプションを使う。
% /usr/bin/impala-shell -i -r -q "SELECT ~"
オプションの詳細参照

Hiveと違ってImpalaはctrl+cで抜ければ全ノードのimpalad処理が停止する



15 件のコメント:

  1. You can put a CACHED IN 'pool_name' clause at the end of a CREATE TABLE statement to automatically cache the entire contents of the table, including any partitions added later.Corporate training in chennai The pool_name is a pool that you previously set up with the hdfs cacheadmin command. Android training in chennai

    返信削除
  2. Hi, I hope to really understand for this information.

    Python Training in Chennai

    返信削除
  3. Once I've done that, I can then view the log files in the HDFS directory, ... this SerDe feature to have a regular expression parse the log file into columns, ... ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2. .... By using Parquet, we potentially take advantage of speed and .... Search the blog. CCNA Training in Chennai

    返信削除
  4. The process takes about 25 minutes to finish up.
    So granted I would not want to do a full scan in a normal process, however
    I do expect to sometimes run map reduce jobs on chunk data that large.
    http://www.trainingintambaram.in/unix-training-in-chennai.html#

    返信削除
  5. Really enjoying your sharing, you have a great teaching style and make these new concepts much easier to understand. Thanks.

    ios Training in Chennai | Cloud Computing Training in Chennai

    返信削除
  6. Learned something new . i am a newbie hope it will work for me! thanks...ios Training in Chennai , Cloud Computing Training in Chennai

    返信削除
  7. It will great save some space in HDFS !!! In the HDFS-7285, the Erasure Code used is RS(Reed Solomon), but have you made some tests using Fountain Codes (Raptor Codes, LT Codes, Online Codes) ? Web Designing Course in Chennai

    返信削除
  8. Good post....thanks for sharing this valuable info. Click here

    返信削除
  9. nice posts..
    SAS Institute introduced the SAS Certified Professional Program,training proper understanding of how the SAS software works. Among the five certification programs that SAS Institute has come up with, SAS training can be considered as the entry point into the big data and the data analytics industry.
    SAS online training in hyderabad

    返信削除
  10. keep blogging.for best SAP Netweaver Online Training SAP Netweaver Training in Hyderabad
    get certified and full knowledge on the course.

    返信削除
  11. Thanks for sharing useful information article to us keep sharing this info,
    Hi we at Colan Infotech Private Limited , a company which is Situated in US and India, will provide you best java web service and our talented
    java application development.
    team will assure you best result and we are familiar with international markets, We work with customers in a wide variety of sectors. Our talented team can handle all the aspects of
    Java web application development,
    we are the best among the
    Java development company.
    We have quite an extensive experience working with
    java development services.
    we are the only Java application development company.
    which offer custom services to a wide range of industries by exceeding our client’s expectations. You can even interact directly with the team regarding your project, just as you would with your in-house team.Our pro team will provide you the best
    java appliaction development services.
    We are best among the
    java development companies in Chennai,
    please review our customer feedbacks so that you may find a clue about us. If you want one stop solution for java development outsourcing, Colan infotech is the only stop you need to step in. Colan Infotech is the unique
    java web development company.
    were our team of unique
    java application developer
    were ranked top in
    java enterprise application development.

    返信削除
  12. Thanks for the awesome share
    We at Colan Infotech Private Limited best web design company in chennai,is Situated in US and India,
    will provide you best service in qa testing services
    Design Services and Colan Infotech has a group of exceedingly dedicated, inventive and creative experts with an energy for delivering exciting ,
    helpful and stylish Web and Mobile Applications, We are one of the best software testing services company
    and of course we stepped in bangalore too we are best qa and testing services
    can provide quality assurance and testing services,
    we are the best among the software testing company india

    返信削除