Hadoop + Hiveでapacheアクセスログ解析 combined Format編

テーブルを作成します。hive-contrib.jarを組み込まないとcombined Formatの集計が出来ないので注意です。

hive> add jar /ebs/hive-0.7.0-bin/lib/hive-contrib-0.7.0.jar;
Added hive-contrib-0.7.0.jar to class path
Added resource: hive-contrib-0.7.0.jar
hive> CREATE TABLE apachelog2 (
    > host STRING,dentity STRING,user STRING,time STRING,request STRING,
    > status STRING,size STRING,referer STRING,agent STRING)
    > ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
    > WITH SERDEPROPERTIES (
    >  'input.regex' = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\^\\*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?",
    >  'output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
    > ) STORED AS TEXTFILE;
OK
Time taken: 11.037 seconds
hive> 

データをロードします。

hive> LOAD DATA LOCAL INPATH '/tmp/access2_log' OVERWRITE INTO TABLE apachelog2;
Copying data from file:/tmp/access2_log
Copying file: file:/tmp/access2_log
Loading data to table default.apacheloga
Deleted hdfs://localhost/user/hive/warehouse/apacheloga
OK
Time taken: 0.884 seconds
hive>

エージェントで集計をします。
ログのままのフォーマットだとキャリアの分類ができないので、別テーブルに再フォーマットして取り出して集計を行う必要があるでしょう。
切り出し方は、ある程度決めうちしてキャリア別の切り出しになりそうな気がします。

サンプルなので結果がしょぼいですが、OKの下にUser-Agentと件数(3件)がその結果になります。

hive> SELECT agent, COUNT(1) AS numagent FROM apachelog2 GROUP BY agent SORT BY numagent DESC;
Total MapReduce jobs = 2
Launching Job 1 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201105040831_0015, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201105040831_0015
Kill Command = /opt/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201105040831_0015
2011-05-04 09:45:12,679 Stage-1 map = 0%,  reduce = 0%
2011-05-04 09:45:22,048 Stage-1 map = 100%,  reduce = 0%
2011-05-04 09:45:31,110 Stage-1 map = 100%,  reduce = 33%
2011-05-04 09:45:34,141 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201105040831_0015
Launching Job 2 out of 2
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201105040831_0016, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201105040831_0016
Kill Command = /opt/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201105040831_0016
2011-05-04 09:45:46,294 Stage-2 map = 0%,  reduce = 0%
2011-05-04 09:45:52,478 Stage-2 map = 100%,  reduce = 0%
2011-05-04 09:46:01,582 Stage-2 map = 100%,  reduce = 33%
2011-05-04 09:46:04,602 Stage-2 map = 100%,  reduce = 100%
Ended Job = job_201105040831_0016
OK
"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"	3
Time taken: 63.328 seconds
hive>

Hadoop + Hiveでapacheアクセスログ解析

Hiveのセットアップは、Hadoopが正常に実行できてる環境下で、アーカイブ(hive-0.7.0-bin.tar.gz)を適当な場所に解凍します。HADOOP_HOMEの設定とhiveのbinにPATHを通して、hiveコマンドを実行するのみです。
hiveコンソールが起動します。

まずapacheログのテーブルを作成します。とりあえずログのフォーマットはcommonです。combinedはこのあとで。

hive> CREATE TABLE apachelog (                                                            
    > ipaddress STRING, identd STRING, user STRING,finishtime STRING,                     
    > requestline string, returncode INT, size INT)                                       
    > ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.dynamic_type.DynamicSerDe'          
    > WITH SERDEPROPERTIES (                                                              
    > 'serialization.format'='org.apache.hadoop.hive.serde2.thrift.TCTLSeparatedProtocol',
    > 'quote.delim'='("|\\[|\\])',                                                        
    > 'field.delim'=' ',                                                                  
    > 'serialization.null.format'='-')                                                    
    > STORED AS TEXTFILE;                                                                 
OK
Time taken: 0.233 seconds
hive> 

ログファイルを読み込みます。

hive> LOAD DATA LOCAL INPATH '/tmp/access_log' OVERWRITE INTO TABLE apachelog;            
Copying data from file:/tmp/access_log
Copying file: file:/tmp/access_log
Loading data to table default.apachelog
Deleted hdfs://localhost/user/hive/warehouse/apachelog
OK
Time taken: 0.307 seconds
hive> 

これでデータの読み込みできましたので、HiveQLで集計を行います。
IPアドレスで集約して件数の多い順に表示します。
この時ジョブは3つ実行されるようです。

hive> SELECT ipaddress, COUNT(1) AS numrequest FROM apachelog GROUP BY ipaddress SORT BY numrequest DESC;
Total MapReduce jobs = 3
Launching Job 1 out of 3
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201105010410_0010, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201105010410_0010
Kill Command = /opt/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201105010410_0010
2011-05-01 06:17:50,384 Stage-1 map = 0%,  reduce = 0%
2011-05-01 06:17:59,452 Stage-1 map = 100%,  reduce = 0%
2011-05-01 06:18:08,493 Stage-1 map = 100%,  reduce = 33%
2011-05-01 06:18:11,520 Stage-1 map = 100%,  reduce = 100%
Ended Job = job_201105010410_0010
Launching Job 2 out of 3
Number of reduce tasks not specified. Estimated from input data size: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201105010410_0011, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201105010410_0011
Kill Command = /opt/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201105010410_0011
2011-05-01 06:18:23,163 Stage-2 map = 0%,  reduce = 0%
2011-05-01 06:18:29,191 Stage-2 map = 100%,  reduce = 0%
2011-05-01 06:18:38,251 Stage-2 map = 100%,  reduce = 100%
Ended Job = job_201105010410_0011
Launching Job 3 out of 3
Number of reduce tasks determined at compile time: 1
In order to change the average load for a reducer (in bytes):
  set hive.exec.reducers.bytes.per.reducer=
In order to limit the maximum number of reducers:
  set hive.exec.reducers.max=
In order to set a constant number of reducers:
  set mapred.reduce.tasks=
Starting Job = job_201105010410_0012, Tracking URL = http://localhost:50030/jobdetails.jsp?jobid=job_201105010410_0012
Kill Command = /opt/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=localhost:8021 -kill job_201105010410_0012
2011-05-01 06:18:51,100 Stage-3 map = 0%,  reduce = 0%
2011-05-01 06:18:57,114 Stage-3 map = 100%,  reduce = 0%
2011-05-01 06:19:06,143 Stage-3 map = 100%,  reduce = 100%
Ended Job = job_201105010410_0012
OK
192.168.1.100	71
127.0.0.1	2
Time taken: 59.31 seconds
hive>

Hadoopスタンドアロンモード設定

日経Linux 2011.5月号 最新クラウド技術 Pig/Hiveを自宅で体感
Hadoopの設定補足内容

検証環境にはAmazon EC2を使います。
Basic 32-bit Amazon Linux AMI(Root Device Size: 8 GB) + EBS Volume 50GiB をマウントしてインスタンスを作成しました。

検証ソフトウェアのバージョンは、hadoop-0.20.2.tar.gz、pig-0.7.0.tar.gz です。hadoop-0.21、pig-0.8が最新版としてありましたが、pigの連携が出来なかったので、この時点での最新を使えませんでした。動作的にはこれでも問題なさそうです。

1.スタンドアロンモード設定

{HADOOP_HOME}/conf/core-site.xml(主要設定ファイル)HDFS実行ポート 8020に設定します。
よく見るサンプルでhdfsプロトコル識別子が無かったりしますが、この書き方がいいようです。「hdfs://localhost:8020」。
/tmp以下にデータが展開されるのが気持ち悪いので、hadoop.tmp.dirも定義しておきました。


 
  fs.default.name
   hdfs://localhost:8020
  プライマリNameNodeを設定
 
 
  hadoop.tmp.dir
   /ebs/tmp
 


${HADOOP_HOME}/conf/hdfs-site.xml分散ファイルシステムの設定ファイル)


  
  dfs.replication
   1
  DataNodeはlocalhostのみなので、レプリケーション数は1
 

${HADOOP_HOME}/conf/mapred-site.xmlMapReduce実行環境の設定ファイル)


 
  mapred.job.tracker
   localhost:8021
   JobTrackerを設定
 

hadoop環境変数を設定します(${HADOOP_HOME}/conf/hadoop-env.sh)

export JAVA_HOME=/usr/lib/jvm/jre

.bash_profileの設定

export JAVA_HOME=/usr/lib/jvm/jre
export HADOOP_INSTALL=/opt/hadoop
export PATH=$HADOOP_INSTALL/bin:$PATH

2.新規ファイルシステムのフォーマット

$ bin/hadoop namenode -format

3.Hadoop デーモンの起動

$ bin/start-all.sh

4.Safe Mode をOffにしてディレクトリを作ります。
ファイルをコピーする前にセーフモードをオフにします。

$ hadoop dfsadmin -safemode leave
Safe mode is OFF
$ hadoop dfs -mkdir amazon
$ hadoop dfs -copyFromLocal ./reviewsNew.txt amazon

Getting start with rails.

Ruby version 1.8.7 (i686-darwin10)
RubyGems version 1.6.2
Rack version 1.2
Rails version 3.0.5

1.アプリケーションの作成
$ rails new myApps

2.サーバーを起動します
$ cd myApps
$ rails server
デフォルトでポート3000にWebサーバが起動します。
http://127.0.0.1:3000/

3.次に簡単なアプリケーションを作ります。
最小限のコントローラーとビューの作成を行います。これには次のコマンドを1行実行します。

$ rails generate controller home index

app/views/home/index.html.erbにテンプレートがありますので、これに
Hello, Rails!
と書いて保存します。

4.このファイルをドキュメントルートのindexファイルとして設定します。
まずpublic/index.html を削除します。
その次にconfig/routes.rb ファイルを開きます。
そして53行目の内容を次のように書き換えます。
# root :to => "welcome#index"
 ↓
root :to => "home#index"

そしてサーバを起動してドキュメントルートにアクセスすると先ほど編集したファイルが参照できます。