やりたいこと
S3にアップロードしてある大量のログデータを手軽に解析してみたい。
どこかにデータを移行することなく、簡単に集計したいので、今回はEMRを使って集計してみることにする。
手順
1. 前提
- S3に以下のようなファイルがあるとして、集計作業を行なう
s3://aws-emr-sample-test/sample.csv
user_id,count
1,1
1,1
1,1
1,1
2,1
2,1
2,1
3,1
3,1
4,1
2. EMRの立ち上げ
- サービスから、EMRを選択
- クラスターの作成 を選択
- 一般設定
クラスター名:お好きな名前を入力
起動モード:クラスター
- ソフトウェア設定
ベンダー:Amazon
リリース:EMRの最新版を選択
アプリケーション:Core Hadoop: Hadoop 2.7.3 with Ganglia 3.7.2, Hive 2.1.1, Hue 3.11.0, Mahout 0.12.2, Pig 0.16.0, and Tez 0.8.4
- ハードウェア構成(集計したいデータ量によって変えること)
インスタンスタイプ:m3.xlarge
インスタンス数:3個
- クラスターの作成を選択し、ステータスが稼働中になることを確認する
余談
- クラスターの起動時に、スポットインスタンスを使うと、通常の半額以下で買えることがあります。金額は、常に変動しておりますので、以下から確認してください。
3. 集計
マスターサーバにSSHで接続する
接続すると、EMR環境下で立ち上がっているので、以下のような出力になります
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/
19 package(s) needed for security, out of 42 available
Run "sudo yum update" to apply all updates.
EEEEEEEEEEEEEEEEEEEE MMMMMMMM MMMMMMMM RRRRRRRRRRRRRRR
E::::::::::::::::::E M:::::::M M:::::::M R::::::::::::::R
EE:::::EEEEEEEEE:::E M::::::::M M::::::::M R:::::RRRRRR:::::R
E::::E EEEEE M:::::::::M M:::::::::M RR::::R R::::R
E::::E M::::::M:::M M:::M::::::M R:::R R::::R
E:::::EEEEEEEEEE M:::::M M:::M M:::M M:::::M R:::RRRRRR:::::R
E::::::::::::::E M:::::M M:::M:::M M:::::M R:::::::::::RR
E:::::EEEEEEEEEE M:::::M M:::::M M:::::M R:::RRRRRR::::R
E::::E M:::::M M:::M M:::::M R:::R R::::R
E::::E EEEEE M:::::M MMM M:::::M R:::R R::::R
EE:::::EEEEEEEE::::E M:::::M M:::::M R:::R R::::R
E::::::::::::::::::E M:::::M M:::::M RR::::R R::::R
EEEEEEEEEEEEEEEEEEEE MMMMMMM MMMMMMM RRRRRRR RRRRRR
hiveを用いて集計をする
- 集計については、hiveQLがインストールされているため、hiveを用いる
hiveは、hadoop上で動くDWH向けのソフトウェアで、主にhadoopが得意とするMapReduceの処理をSQLライクで実行することが可能です。
- 集計を行なう
hiveを立ち上げる
$ hive
Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: false
hive>
集計DBの作成
--集計用のデータベースの作成
hive> CREATE DATABASE log;
OK
Time taken: 1.123 seconds
--対象データベースの選択
hive> use log;
OK
Time taken: 0.045 seconds
hive>
S3にあるログファイルをインポートする(以下の指定で、ディレクトリ以下のファイルをすべてインポートできる)
--S3からデータを読み込む
hive> DROP TABLE IF EXISTS log.test_table;
OK
Time taken: 2.545 seconds
hive> CREATE EXTERNAL TABLE IF NOT EXISTS log.test_table (
> user_id INT,
> count INT
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
> LOCATION 's3://aws-emr-sample-test/';
OK
Time taken: 0.258 seconds
hive>
データが入ってるか、念のため、確認
--データがインポートされていることを確認
hive> SELECT user_id, count FROM log.test_table LIMIT 3;
OK
1 1
1 1
1 1
Time taken: 1.112 seconds, Fetched: 3 row(s)
hive>
集計する
--集計
hive> SELECT user_id, SUM(count) FROM log.test_table GROUP BY user_id;
Query ID = hadoop_20170331123614_c8493578-e1b9-48a9-8765-202649a8c9b1
Total jobs = 1
Launching Job 1 out of 1
Tez session was closed. Reopening...
Session re-established.
Status: Running (Executing on YARN cluster with App id application_1490962451243_0002)
----------------------------------------------------------------------------------------------
VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
----------------------------------------------------------------------------------------------
Map 1 .......... container SUCCEEDED 1 1 0 0 0 0
Reducer 2 ...... container SUCCEEDED 1 1 0 0 0 0
----------------------------------------------------------------------------------------------
VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 11.28 s
----------------------------------------------------------------------------------------------
OK
1 4
2 3
3 2
4 1
Time taken: 19.344 seconds, Fetched: 5 row(s)
hive>
S3にあるログデータをどこかに移すことなく、簡単に集計できた!
まとめ
S3にアップロードしてあるログデータを簡単に速く集計かけたいときに、便利!