eXcale開発チームの平井です。
Amazon Elastic Map Reduce(EMR)上で、Hiveを実行する方法はいくつかあります。
公式ドキュメントでは、AWSのManagement Consoleを用いる方法とAmazon Elastic MapReduce Ruby Client ( EMR CLI )を用いる方法が紹介されています。
CLIで実行する際は注意が必要で、CLIはRubyの1.8.7が必要になります。rbenvやrvmを利用すれば、それほど手間をかけずに1.8.7の環境を準備することはできますが、とはいえ、1.8.7は既にサポートが終了しているバージョンですので、1.8.7を使用するには抵抗があります。
というわけで、今回はAWSから提供されているAWS SDK for Rubyを使用してAmazon EMRでHiveを実行する方法をご紹介します。
eXcaleでは期間限定でサインアップキャンペーン実施中です。
キャンペーン内容についてはこちらを参照してください。
今回実行するHiveスクリプトは公式ドキュメントで紹介されているサンプルを使用します。
EMR CLIで実行する場合
EMR CLIでは以下のように実行します。(参考: 公式ドキュメント Launch a Hive Cluster )
※ OUTPUTで指定しているS3バケット(myawsbucket)は、自分で用意したS3バケットに変更する必要がります。
1 |
$ ./elastic-mapreduce --create --name "Test Hive" --hive-script s3n://elasticmapreduce/samples/hive-ads/libs/model-build.q --args -d,LIBS=s3n://elasticmapreduce/samples/hive-ads/libs,-d,INPUT=s3n://elasticmapreduce/samples/hive-ads/tables,-d,OUTPUT=s3n://myawsbucket/hive-ads/output/ |
AWS SDK for Rubyで実行する場合
CLIと同じことをAWS SDK for Rubyを使用して実行します。
実行するためのスクリプトは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
require 'aws-sdk' emr = AWS::EMR.new({ "access_key_id" => "access key", # access keyを指定 "secret_access_key" => "your secret key", # secret keyを指定 "region" => "ap-northeast-1" }) result = emr.job_flows.create( 'Test Hive', { :log_uri => 's3n://s3 bucket for emr log', # EMRのログを保存するS3バケットを指定 :ami_version => 'latest', :instances => { :instance_count => 1, :master_instance_type => 'm1.small', }, :steps => [{ :name => 'Setup Hive', :action_on_failure => 'TERMINATE_CLUSTER', :hadoop_jar_step => { :jar => 's3://ap-northeast-1.elasticmapreduce/libs/script-runner/script-runner.jar', :args => ['s3://ap-northeast-1.elasticmapreduce/libs/hive/hive-script', '--base-path', 's3://ap-northeast-1.elasticmapreduce/libs/hive/', '--install-hive', '--hive-versions', 'latest' ] } }, { :name => 'Run Hive Script', :action_on_failure => 'CANCEL_AND_WAIT', :hadoop_jar_step => { :jar => 's3://ap-northeast-1.elasticmapreduce/libs/script-runner/script-runner.jar', :args => ['s3://ap-northeast-1.elasticmapreduce/libs/hive/hive-script', '--base-path', 's3://ap-northeast-1.elasticmapreduce/libs/hive/', '--run-hive-script', '--hive-versions', 'latest', '--args', '-f', 's3n://elasticmapreduce/samples/hive-ads/libs/model-build.q', '-d', 'LIBS=s3n://elasticmapreduce/samples/hive-ads/libs', '-d', 'INPUT=s3n://elasticmapreduce/samples/hive-ads/tables', '-d', 'OUTPUT=s3n://myawsbucket/hive-ads/output' # Hiveスクリプトの実行結果を保存するS3バケットを指定 ] } }] }) p result |
CLIでは、CLIが上手く処理してくれるため、少ない引数(–hive-scriptを指定)で実行する事ができましたが、AWS SDK for Rubyの場合には、Hiveスクリプトを実行する処理(Run Hive Script)だけではなく、Hiveスクリプトを実行するための環境をセットアップする処理(Setup Hive)もStepとして指定していく必要があります。AWS SDK for RubyのEMR関連のAPIリファレンスはこちらになります。
上記を実行するとjob_flow_idを出力して、スクリプト自体は終了します。
1 2 |
$ ruby sample.rb <AWS::EMR::JobFlow job_flow_id:j-XXXXXXXXXXXXX> |
また、AWS Management Consoleで、job_flow_idのEMRクラスターが作成されていることが確認できると思います。
以下は、実行が終了したあとのEMRクラスターの詳細画面です。
いかがでしょうか、今回は、AWS SDK for Rubyを使用してAmazon EMRでHiveを実行する方法をご紹介しました。
AWS SDKを用いることでプログラマブルにAWSを利用できるので、積極的に利用して効率よくAWSを利用したいですね。