EMRのHiveステップのオプションについて
今回はEMRのHiveステップで利用可能なオプションについて紹介します。HiveステップについてはAmazon EMR によるビッグデータ分析入門 - Amazon EMRというチュートリアルにおいて利用例が紹介されていますが、詳細については記述されていません。そのため、今回はHiveステップの内部的な動作を紹介しつつ、指定可能なオプションについて紹介します。なお、HiveステップではなくHive JDBC ドライバの使用 - Amazon EMR等を利用する場合は今回紹介するオプションは利用できないのでご注意ください。あくまでHiveステップを利用した場合のオプションについて紹介します。
結論
先に結論を書いておきます。Hiveステップは内部でHive CLIを利用しています。そのため、指定可能なオプションはHive CLIと同様になります。
usage: hive -d,--define <key=value> Variable substitution to apply to Hive commands. e.g. -d A=B or --define A=B --database <databasename> Specify the database to use -e <quoted-query-string> SQL from command line -f <filename> SQL from files -H,--help Print help information --hiveconf <property=value> Use value for given property --hivevar <key=value> Variable substitution to apply to Hive commands. e.g. --hivevar A=B -i <filename> Initialization SQL file -S,--silent Silent mode in interactive shell -v,--verbose Verbose mode (echo executed SQL to the console)
実行環境
- emr-5.8.0 でアプリケーションは Hadoop, Hive, Tez
- Hive 2.3.0
- ハードウェア構成は m1.medium を 1 台(検証用なのでマスターノードのみ)
- 東京リージョン
EMRクラスタの作成
まずはEMRクラスタを作成します。AWS CLIを利用する場合は以下のようなコマンドになります。emr_key_name
, emr_subnet_id
, emr_log_uri
を自身の環境に合わせて書き換えてください。
emr_applications='Name=Hadoop Name=Hive Name=Tez' emr_key_name=XXXX emr_subnet_id=subnet-XXXX emr_release_label=emr-5.8.0 emr_log_uri=s3n://aws-logs-XXXX-ap-northeast-1/elasticmapreduce/ emr_cluster_name=hive-options aws emr create-cluster --auto-scaling-role EMR_AutoScaling_DefaultRole \ --applications ${emr_applications} --ebs-root-volume-size 10 \ --ec2-attributes '{"KeyName":"'${emr_key_name}'","InstanceProfile":"EMR_EC2_DefaultRole","SubnetId":"'${emr_subnet_id}'"}' \ --service-role EMR_DefaultRole --enable-debugging --release-label ${emr_release_label} \ --log-uri ${emr_log_uri} --name ${emr_cluster_name} \ --instance-groups '[{"InstanceCount":1,"InstanceGroupType":"MASTER","InstanceType":"m1.medium","Name":"Master Instance Group"}]' \ --scale-down-behavior TERMINATE_AT_INSTANCE_HOUR --region ap-northeast-1
Hiveステップの実行
Amazon EMR によるビッグデータ分析入門 - Amazon EMRと同じHiveのクエリをマネジメントコンソールから実行しましょう。手順はステップ 4: Hive スクリプトの実行によるサンプルデータの処理 - Amazon EMRに書かれているとおりです。なお、AWS CLIを利用した場合の手順も記述しておくので、AWS CLIが良い場合はそちらをご利用ください。
入力項目 | 値 |
---|---|
ステップタイプ | Hive プログラム |
名前 | 任意 |
スクリプト S3 場所 | s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q |
S3 の場所の入力 | s3://ap-northeast-1.elasticmapreduce.samples |
S3 の場所の出力 | 任意 |
引数 | -hiveconf hive.support.sql11.reserved.keywords=false |
失敗時の操作 | 次へ |
AWS CLIを利用する場合は以下のようなコマンドになります。emr_cluster_id
, emr_s3_bucket_name
を自身の環境に合わせて書き換えてください。
emr_cluster_id=j-XXXX emr_s3_bucket_name=XXXX emr_step_name=Hive_CloudFront emr_hive_script=s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q emr_hive_input=s3://ap-northeast-1.elasticmapreduce.samples emr_hive_output=s3://${emr_s3_bucket_name}/${emr_step_name} aws emr add-steps --cluster-id ${emr_cluster_id} --steps Type=HIVE,Name="${emr_step_name}",ActionOnFailure=CONTINUE,Args=[-f,${emr_hive_script},-d,INPUT=${emr_hive_input},-d,OUTPUT=${emr_hive_output},-hiveconf,hive.support.sql11.reserved.keywords=false] --region ap-northeast-1
Command Runnerとhive-script
実行したHiveステップの詳細を確認すると[JAR location]にcommand-runner.jar
と[Arguments]にhive-script
という記述が見つかります *1。
また、controller
ログを参照すると以下のログがあるため、command-runner.jar経由でhive-scriptを実行する実装になっていることが推測されます。実際、ドキュメントのCommand Runner - Amazon EMRにもhive-scriptは「Hive スクリプトの実行。コンソールと SDK では、これは、Hive のステップです。」と記述されています。
INFO startExec 'hadoop jar /var/lib/aws/emr/step-runner/hadoop-jars/command-runner.jar hive-script --run-hive-script --args -f s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q -d INPUT=s3://ap-northeast-1.elasticmapreduce.samples -d OUTPUT=s3://XXXX/Hive_CloudFront -hiveconf hive.support.sql11.reserved.keywords=false'
hive-scriptの詳細
SSHでマスターノードのEC2インスタンスに接続してhive-scriptの詳細について調べましょう。which
コマンドで/usr/bin/hive-script
にhive-scriptが存在することを確認できます *2。
[hadoop@ip-172-31-16-51 ~]$ which hive-script /usr/bin/hive-script
そして/usr/bin/hive-script
のソースを読むと--run-hive-script
オプションを指定した際にhive
コマンドを実行していることが分かります。
ということで、実際にEC2インスタンス上でhive-script
を利用して先程Hiveステップとして実行したHive_CloudFront.q
を実行してみましょう。マネジメントコンソールの[Arguments]の値をコピーしてEC2インスタンス上で実行して下さい。その際、エラーになってしまうのでOUTPUT
の値を変更してください。実行すると/usr/bin/hive
コマンドを利用してHiveQLが実行されることが分かります。
[hadoop@ip-172-31-16-51 ~]$ hive-script --run-hive-script --args -f s3://ap-northeast-1.elasticmapreduce.samples/cloudfront/code/Hive_CloudFront.q -d INPUT=s3://ap-northeast-1.elasticmapreduce.samples -d OUTPUT=s3://XXXX/Hive_CloudFront_cli -hiveconf hive.support.sql11.reserved.keywords=false /usr/bin/hive Logging initialized using configuration in file:/etc/hive/conf.dist/hive-log4j2.properties Async: true OK Time taken: 7.136 seconds Query ID = hadoop_20170824113726_2ce1f2db-e691-4a63-a62a-8cbda04d7014 Total jobs = 1 Launching Job 1 out of 1 Status: Running (Executing on YARN cluster with App id application_1503570141745_0002) ---------------------------------------------------------------------------------------------- VERTICES MODE STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED ---------------------------------------------------------------------------------------------- Map 1 .......... container SUCCEEDED 1 1 0 0 0 0 Reducer 2 ...... container SUCCEEDED 1 1 0 0 0 0 ---------------------------------------------------------------------------------------------- VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 77.13 s ---------------------------------------------------------------------------------------------- Moving data to directory s3://XXXX/Hive_CloudFront_cli/os_requests OK Time taken: 108.52 seconds
Hive CLIのヘルプについて
余談です。Hive CLIで利用可能なオプションの一覧を表示する際はヘルプを表示することで確認できます。このヘルプコマンドの実行方法が2通りありましたので紹介しておきます。
1つはhive -H
です。
[hadoop@ip-172-31-16-51 ~]$ hive -H usage: hive -d,--define <key=value> Variable substitution to apply to Hive commands. e.g. -d A=B or --define A=B --database <databasename> Specify the database to use -e <quoted-query-string> SQL from command line -f <filename> SQL from files -H,--help Print help information --hiveconf <property=value> Use value for given property --hivevar <key=value> Variable substitution to apply to Hive commands. e.g. --hivevar A=B -i <filename> Initialization SQL file -S,--silent Silent mode in interactive shell -v,--verbose Verbose mode (echo executed SQL to the console)
もう1つはhive --service cli --help
です。
[hadoop@ip-172-31-16-51 ~]$ hive --service cli --help usage: hive -d,--define <key=value> Variable substitution to apply to Hive commands. e.g. -d A=B or --define A=B --database <databasename> Specify the database to use -e <quoted-query-string> SQL from command line -f <filename> SQL from files -H,--help Print help information --hiveconf <property=value> Use value for given property --hivevar <key=value> Variable substitution to apply to Hive commands. e.g. --hivevar A=B -i <filename> Initialization SQL file -S,--silent Silent mode in interactive shell -v,--verbose Verbose mode (echo executed SQL to the console)
これはhiveコマンドが複数のサービスを処理可能な実装となっているためです。hive --help
とだけ入力すると利用可能なサービスの一覧が表示されます。
[hadoop@ip-172-31-16-51 ~]$ hive --help Usage ./hive <parameters> --service serviceName <service parameters> Service List: beeline cleardanglingscratchdir cli hbaseimport hbaseschematool help hiveburninclient hiveserver2 hplsql jar lineage llapdump llap llapstatus metastore metatool orcfiledump rcfilecat schemaTool version Parameters parsed: --auxpath : Auxiliary jars --config : Hive configuration directory --service : Starts specific service/component. cli is default Parameters used: HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory HIVE_OPT : Hive options For help on a particular service: ./hive --service serviceName --help Debug help: ./hive --debug --help
hiveコマンドのソースを読むと分かりますが、--service
オプションを省略した場合はcliサービスを選択したと解釈されます。ただしその際にコマンドに--help
オプションを指定するとcliのヘルプではなく前述のhiveコマンド全体のヘルプを表示するようになっています。そして-H
オプションを指定した場合は前述のルールが適用されないためcliのヘルプが表示されるという結果になります。
最後に
Hiveステップで利用可能なオプションについての紹介でした。他のアプリケーションを利用する際も同様の手順で内部の実装について調査できると思います。参考になれば幸いです。
脚注
- マネジメントコンソールの言語を「英語」に変えたのは後述controllerログのリンクを有効化するためです。言語が「日本語」の場合はリンクが無効になりクリックしてcontrollerログを開けませんでした。 ↩
- hive/bin at rel/release-2.3.0 · apache/hiveには存在しないのでEMR独自のスクリプトのようです。 ↩