/var/log/laughingman7743.log

I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?

Boto3でEMR

最近HiveでETL処理とかするためにEMRをよくさわっています。Boto3からクラスタ起動したりステップ追加したりしています。 Boto2だとクラスタ作成時にセキュリティグループの設定等をapi_paramsに追加する形になり非常にわかりにくいです。 Boto3だとJSONライクな指定ができていろいろと捗ります。

日次でクラスタを起動してETL処理するようなスクリプトのサンプルです。AirflowでDAGを作って実行すると良いですね。

https://gist.github.com/laughingman7743/5c675c9b1d9ed02539e6

クラスタの起動

クラスタ起動時にステップも指定できますが、どうも追加される順序がバラバラだったりするので、起動してから順に追加するような形が良さそうです。

Hiveメタデータストアの指定

ConfigurationsにRDSの接続先を指定します。

HadoopJarステップ

以下はS3DistCpの処理をステップに追加するような例です。 Hiveは小さなファイルが大量にあると非常に処理に時間がかかったりするので、S3DistCpを使ってマージすると良いです。

HiveScriptステップ

Boto2のソース*1を参考にHadoopJarステップを組み立ててやるだけです。

クラスタのポーリング

全ステップが正常に完了した後に別の処理をしたい(例えばETL処理したデータをRedshiftに取り込む等)といった場合は、 クラスタ起動前の時刻を取得しておき、それ以降に起動したクラスタ一覧を取得し、ステータスを調べるようなことをすれば良さそうです。

自前でHadoopクラスタを運用するのはかなり大変なのでEMRを活用すると良いですね。 ETL処理時のみクラスタを起動し、処理が終われば落としておくような運用であればコストもかなり抑えられます。

Enjoy!