EMRクラスタ作成~ポートフォワーディング~Hueにログイン~DB,テーブル作成まで
Glueをメタデータストアとして使うことに注意。glueをメタデータストアとして使わないとクラスタの中にmysqlが立ち上がりそこにメタデータが保存される。emrを閉じてしまうとメタデータから作り直しになってしまう。
構成の詳細
リリースラベル:emr-5.24.0
Hadoop ディストリビューション:Amazon 2.8.5
アプリケーション:Hive 2.3.4, Hue 4.4.0, Spark 2.4.2, Tez 0.9.1, Zeppelin 0.8.1, Pig 0.17.0
ログの URI:s3://aws-logs-hoge-ap-northeast/elasticmapreduce/
クラスタを立ち上げたらマスターノードにsshで通信、キーペアを指定
ssh -i C:/path/to/key.pem hadoop@ec2-5...3.ap-northeast-_.compute.amazonaws.com
コンソールにログインできなかったがインバウンドトラフィックの編集でssh22番ポートを開けるのを忘れていた。マイIPでインバウンド通信許可。
しかし、hueに接続できない。調べるとポートフォワーディングが必要とのことなので以下のコマンドでローカルからポートフォワーディングした。
追記:ポートフォワーディングしなくても、マスターノードのセキュリティグループ>インバウンドルールから8888を開ければさっとhueにアクセスできたかもしれない…
ssh -i C:/path/to/key.pem -N -L 8157:localhost:8888 hadoop@ec2-5...3.ap-northeast-_.compute.amazonaws.com
この後http://localhost:8157/
にアクセスするとhueに繋がった。
あとは特にSQLを実行するのと何ら変わりない。
CREATE DATABASE EMRTEST_0118;
-- ## Hiveの実行エンジンを設定する
-- MapReduceで処理
set hive.execution.engine=mr;
-- tezのほうが早いのでtezに設定
set hive.execution.engine=tez;
-- 実行エンジンを確認
set hive.execution.engine;
CREATE EXTERNAL TABLE emrtest_0118.talking_train_raw (
ip INT, -- カラムの名前 そのカラムの型
app INT,
device INT,
os INT,
channel INT,
click_time STRING,
attributed_time STRING,
is_attributed INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 's3://emr-0118/'
TBLPROPERTIES ("skip.header.line.count"="1");
とりあえずテーブルの参照まで終わった。Hiveを使ってやることといえば大規模な分散処理、バッチ処理を実行しそれをS3などのデータレイクへのエクスポートすることだろう。
この部分ができれば、実務的にはスケジューラを通してHiveを定期実行する部分を作成したいところ。EMRを定期実行して、○○して…となるとなかなか時間がかかりそう。趣味的にはネットワーク関連の勉強をしてからのほうがいろいろとはかどりそうだが。逆にHiveからエクスポートされた加工済みのデータはただのcsvなのでその処理自体は簡単そう。