2016-03-28

Hiveでツイート分析

今度は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;

参考URL

このエントリーをはてなブックマークに追加