Amazon Elastic MapReduce と Hive を使用してデータ処理アプリケーションを開発しています。インタラクティブ モードのジョブ フローを使用して SSH および実行すると、Hive スクリプトが機能するようになったので、AWS Java API を使用してジョブ フローを作成しようとしています。
http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/calling-emr-with-java-sdk.htmlを出発点として使用して、このようなステップ構成を作成します
StepConfig runScript = new StepConfig().withName("Prepare Admin")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(oStepFactory.newRunHiveScriptStep(scriptPath, args));
scriptPath は、s3://bucketName/hive-script のように、Hive スクリプトへの s3 URL になる可能性があると想定しています。私が見つけた唯一のドキュメントは、マスター ノードのファイル システムからのスクリプトの使用について述べています。しかし、マスター ノードがこのジョブ フローのために開始されたインスタンスである場合、ファイル システムにスクリプト (Hive など) を取得する方法がわかりません。
私のアイデア (s3 の場所を stepFactory メソッドに渡す) を試すと、runScript ステップが失敗します。
AWS コンソールでログを確認しました。stdout ログは次で終わります
2012-11-19 19:28:33 GMT - コマンドの実行中にエラーが発生しました: /home/hadoop/.versions/hive-0.7.1/bin/hive '-f' 's3://anet-emr/scripts/admin .q'' -d rawDataLocation=s3://anet-emr/raw -d year=2010 -d cycle=1'
stderr ログは次で終わります
java.lang.NoSuchMethodError: org.apache.commons.cli.CommandLine.getOptionProperties(Ljava/lang/String;)Ljava/util/Properties; org.apache.hadoop.hive.cli.OptionsProcessor.process_stage1(OptionsProcessor.java:115) で org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:399) で sun.reflect.NativeMethodAccessorImpl.invoke0 (ネイティブ メソッド) (sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) で java.lang.reflect.Method.invoke(Method.java:597) ) org.apache.hadoop.util.RunJar.main(RunJar.java:155) で org.apache.hadoop.mapred.JobShell.run(JobShell.java:54) で org.apache.hadoop.util.ToolRunner. run(ToolRunner.java:65) at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) at org.apache.
コントローラーログには
2012-11-19T19:28:27.406Z INFO 実行中 /usr/lib/jvm/java-6-sun/bin/java -cp /home/hadoop/conf:/usr/lib/jvm/java-6-sun/ lib/tools.jar:/home/hadoop:/home/hadoop/hadoop-0.18-core.jar:/home/hadoop/hadoop-0.18-tools.jar:/home/hadoop/lib/ :/home/hadoop/ lib/jetty-ext/-Xmx1000m -Dhadoop.log.dir=/mnt/var/log/hadoop/steps/3 -Dhadoop.log.file=syslog -Dhadoop.home.dir=/home/hadoop -Dhadoop.id.str=hadoop -Dhadoop .root.logger=INFO,DRFA -Djava.io.tmpdir=/mnt/var/lib/hadoop/steps/3/tmp -Djava.library.path=/home/hadoop/lib/native/Linux-i386-32 org.apache.hadoop.mapred.JobShell /mnt/var/lib/hadoop/steps/3/script-runner.jar s3://us-east-1.elasticmapreduce/libs/hive/hive-script --base-パス s3://us-east-1.elasticmapreduce/libs/hive/ --hive-versions 最新 --run-hive-script --args -f s3://anet-emr/scripts/admin.q -d rawDataLocation=s3://anet-emr/raw -d year=2010 -d cycle=1 2012-11-19T19:28:34.143Z INFO 実行は ret val 255 2012-11-19T19:28:34.143Z WARN ステップで終了しました無効な retval で失敗しました
問題は、Amazon の API を介して Hive の Apache CLI ライブラリへの呼び出しに渡す引数にあるようです...「-d arg1=val1 -d arg2=val2」を使用して単一の文字列を渡そうとしました。 「-d,arg1=val1 など..」を試し、文字列配列に分割するさまざまな方法を試しました。つまり、{ "-d", "arg1=val1" ...} です。これを行う適切な方法のドキュメントが見つかりません!
助けていただければ幸いです、コールマンに感謝します