EMRのHiveステップのオプションについて

Amazon EMR

今回は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が良い場合はそちらをご利用ください。

emr-hive-step-options_1

入力項目
ステップタイプ 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

emr-hive-step-options_2

また、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ステップで利用可能なオプションについての紹介でした。他のアプリケーションを利用する際も同様の手順で内部の実装について調査できると思います。参考になれば幸いです。

脚注

  1. マネジメントコンソールの言語を「英語」に変えたのは後述controllerログのリンクを有効化するためです。言語が「日本語」の場合はリンクが無効になりクリックしてcontrollerログを開けませんでした。
  2. hive/bin at rel/release-2.3.0 · apache/hiveには存在しないのでEMR独自のスクリプトのようです。