今度はHiveを使ってツイートを分析しました。1行1JSONのファイル(Fluentd+Twitter Streaming API)がS3にGZIP形式で格納されているので、このファイルをHiveで処理していきます。環境はMac OS Xです。
Hadoopバージョンはこちら→Hadoop Streamingでアイドルツイート分析
Hiveのインストール
バイナリをダウンロードして展開、インストールします。$ cd /usr/local
$ wget http://apache.claz.org/hive/stable/apache-hive-1.2.1-bin.tar.gz
$ tar xvf apache-hive-1.2.1-bin.tar.gz
$ mv apache-hive-1.2.1-bin hive
$ rm apache-hive-1.2.1-bin.tar.gz
~/.bashrcか~/.zshrcの環境変数を変更
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin
Hiveの設定はこんな感じで
$ cd $HIVE_HOME
$ mkdir logs
$ cd conf
$ cp -p hive-log4j.properties.template hive-log4j.properties
$ vi hive-log4j.properties # hive.log.dir=/usr/local/hive/logs
$ cp -p hive-env.sh.template hive-env.sh
$ chmod 755 hive-env.sh
$ cp -p hive-exec-log4j.properties.template hive-exec-log4j.properties
$ cp -p hive-default.xml.template hive-default.xml
S3からHDFSにコピーするパターン
以下のコマンドでS3からHDFSにコピー(HadoopのAWSクレデンシャルの設定は予めしておく)$ hadoop distcp "s3n://{BUCKET_NAME}/{GZIP_FILENAME}.gz" /input/
hiveを起動
$ hive
テーブルを作成
;">hive> CREATE TABLE raw_json(line STRING);
データ取り込み
hive> LOAD DATA INPATH "/input/{GZIP_FILENAME}.gz" INTO TABLE raw_json;
Loading data to table default.raw_json
Table default.raw_json stats: [numFiles=16, numRows=0, totalSize=34406575, rawDataSize=0]
OK
Time taken: 0.321 seconds
SELECT COUNT(*) FROM raw_json;
Query ID = hoge_20160321184331_e406b109-26cf-42ed-9713-9dce6061e89f
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks determined at compile time: 1
...
MapReduce Jobs Launched:
Stage-Stage-1: HDFS Read: 501764527 HDFS Write: 0 SUCCESS
Total MapReduce CPU Time Spent: 0 msec
OK
35035
Time taken: 3.434 seconds, Fetched: 1 row(s)
S3を外部データとして参照するパターン
EXTERNALを使ってテーブルを作成;">hive> CREATE EXTERNAL TABLE raw_json_external(line STRING)
PARTITIONED BY (dt string)
LOCATION 's3n://{BUCKET_NAME}/{BASE_DIRECTORY_PATH}/';
パーティションでわける場合はこんな感じで
;">hive> ALTER TABLE raw_json_external
ADD PARTITION ( dt='2016-03-10' )
LOCATION 's3://{BUCKET_NAME}/{BASE_DIRECTORY_PATH}/2016/03/10';
JSONデータの表示
JSON表示用に以下のようなビューを作成;">hive> CREATE VIEW tweet_view
(
id_str,
user_id_str,
text
) AS
SELECT
tweet.id_str,
tweet.user_id_str,
regexp_replace(tweet.text, '\n', ' ')
FROM raw_json_external
LATERAL VIEW json_tuple(
raw_json_external.line,
'id_str',
'user_id_str',
'text'
) tweet as id_str, user_id_str, text;
一回ビューを作ったらあとは普通にSQL書けばOK
;">hive> SELECT * FROM tweet_view LIMIT 10;