なにかのきろく

ひっそりと戻ってきて自分のためになるべく頑張る・・・

初めてのAWSでEMRでクラスター起動してHiveQLだ!

AWS関連の技術を少し触ることが出来たので、
その時の知見を纏める。

システムはこんな感じ。

f:id:seyoshinori:20161219000340p:plain


1.S3のデータ取得
 ストレージサービスって呼び方カッコいいんだけどww

 EMR上のクラスター起動してから
 以下のsyncコマンドでお好きなところにS3の資材を配置できる。

 aws s3 sync s3://hogehoge/hogehoge/ ./


2.HadoopでHiveQLを処理してデータクレンジング
 EMRクラスター上でHiveQLを実行する。

 今回の教訓でわかったのは、
 HiveQLをSQLと同様に扱ってはいけないということです。

 HiveQL初心者の私は、みんなが言うSQL作ってくれに
 調子乗ってSQLったらいろいろパフォーマンスがアウトだった。

 HiveQLで中間ファイルを多く作らない方がいい。
 Joinは1queryで1回にする方がいい。
 複数のテーブルをJoinするときは、
 面倒だけど1つずつ繋げていく方がよい。

 Joinする側のテーブルレコード件数が大きくなければ
 set hive.auto.convert.join=true;のパラメータは
 パフォーマンスに対して非常に有効です。
 ただし、レコード件数が大きすぎると、
 OutOfMemoryとなって処理がエラーになる。

 HiveQLは.sqlファイルを実行できる。
 .hql拡張子でも実行できる。
 コマンドは以下の通りです。

 hive -f hogehoge.sql

 hiveはカラム数の違いによるエラーは出るが、
 桁数や型の違いによるエラーは出ない。
 その理由はhiveは裏ではファイルでデータを持っている。
 テーブルとはいっても実際はHDFS上のファイルなのです。
 だからそこら辺気を付けないとダメです・・・。


3.ファイル出力
4.EC2に転送
 --ここはどうだったろうか?おそらくシェルだ。
 いや違うか?よくわからない。
 こんどまでに調べときます。


5.Redshiftにデータ登録
 EC2上で以下のコマンドを実行すると実現できる。

 PGPASSWORD='<パスワード>' /usr/bin/psql -h <ホスト.amazonaws.com> -U <ユーザー> -d dwh -p 5439 -w -c "copy <redshiftのテーブル> from 's3://hogehoge/deta/' CREDENTIALS 'aws_access_key_id=<キー>;aws_secret_access_key=<キー>' delimiter ',';"


参考にしたHP
http://blog.livedoor.jp/sasata299/archives/51387077.html
http://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/ManagementGuide/emr-mgmt-ja_jp.pdf
https://open-groove.net/hive/hive-practice2/
http://www.atmarkit.co.jp/ait/articles/0903/09/news094.html
http://www.ne.jp/asahi/hishidama/home/tech/apache/hive/table.html

 


End