S3にある大量のログデータをEMRを使って、簡単に集計したときのメモ



# やりたいこと

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個

* クラスターの作成を選択し、ステータスが稼働中になることを確認する

### 余談

* クラスターの起動時に、スポットインスタンスを使うと、通常の半額以下で買えることがあります。金額は、常に変動しておりますので、以下から確認してください。

> https://aws.amazon.com/jp/ec2/spot/bid-advisor/


## 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にアップロードしてあるログデータを簡単に速く集計かけたいときに、便利！