チュートリアル3:Hiveを使ってアクセスログを解析する
ここまでは、一般的なRDBMSでもできることしか行っていませんでした。このチュートリアルでは、Hadoopの強力な機能の一つ「非構造化データの処理」を行います。
このチュートリアルの仮想企業では、Webサイトのアクセスログを保存しています。このアクセスログを解析することで、売上データとは違う角度から分析していきます。
まず、アクセスログをHadoopにロードします。
$ sudo -u hdfs hdfs dfs -mkdir /user/hive/warehouse/original_access_logs $ sudo -u hdfs hdfs dfs -copyFromLocal /opt/examples/log_files/access.log.2 /user/hive/warehouse/original_access_logs
実際にロードされたかどうかを確認します。
$ hdfs dfs -ls /user/hive/warehouse/original_access_logs
次に、Hiveにアクセスします。
$ beeline -u jdbc:hive2://localhost:10000 -n cloudera -p cloudera -d org.apache.hive.jdbc.HiveDriver
SerDe(サーディー)というHiveの機能を使い、アクセスログをCSV形式などに変更することなく、そのままHiveテーブルとして読み込めるようにします。
CREATE EXTERNAL TABLE intermediate_access_logs ( ip STRING, date STRING, method STRING, url STRING, http_version STRING, code1 STRING, code2 STRING, dash STRING, user_agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) - - \\[([^\\]]*)\\] \"([^\ ]*) ([^\ ]*) ([^\ ]*)\" (\\d*) (\\d*) \"([^\"]*)\" \"([^\"]*)\"", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s" ) LOCATION '/user/hive/warehouse/original_access_logs'; CREATE EXTERNAL TABLE tokenized_access_logs ( ip STRING, date STRING, method STRING, url STRING, http_version STRING, code1 STRING, code2 STRING, dash STRING, user_agent STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hive/warehouse/tokenized_access_logs'; ADD JAR /usr/lib/hive/lib/hive-contrib.jar; INSERT OVERWRITE TABLE tokenized_access_logs SELECT * FROM intermediate_access_logs; exit;
SerDeの詳細は『プログラミングHive』を参照してください。
作成が終わったら、Hue Impalaクエリエディタに戻り、下記コマンドを実行して各ページのアクセスカウントを集計します。
invalidate metadata; select count(*),url from tokenized_access_logs where url like '%\/product\/%' group by url order by count(*) desc;
なお、この集計はImpalaと同じように、HueからHiveエディタを使用して実行することもできます。興味のある方は試してみてください。
いかがでしたか? 次回は、Apache Sparkを使ってバスケット分析を行います。お楽しみに!