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.xml(MapReduce実行環境の設定ファイル)
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"
そしてサーバを起動してドキュメントルートにアクセスすると先ほど編集したファイルが参照できます。