java从 Java API 启动 AWS elastic mapreduce 作业流。我的 hive 脚本应该放在哪里
我一直在使用 Amazon Elastic MapReduce 和 Hive 开发数据处理应用程序。既然我的 Hive 脚本在我使用 SSH 并使用交互模式作业流运行它们时工作,我正在尝试使用 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 可以是我的 Hive 脚本的 s3 url,例如:s3://bucketName/hive-script。我找到的唯一文档是关于使用主节点文件系统中的脚本。但是,如果主节点是为了这个作业流程而启动的实例,我不明白如何将任何脚本(Hive 或其他)放到文件系统上。
当我尝试我的想法(将 s3 位置传递给 stepFactory 方法)时,runScript 步骤失败。
我已经通过 AWS 控制台检查了日志。 stdout 日志以
结尾2012-11-19 19:28:33 GMT - 执行 cmd 时出错:/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( native 方法) 在 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) 在 org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 在 org.apache.hadoop.mapred.JobShell.main(JobShell.java:68)
Controller 日志有
2012-11-19T19:28:27.406Z 信息执行/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-path 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 步骤失败,重置错误
问题似乎出在我通过 Amazon 的 API 传递给 Hive 对 Apache CLI 库的调用的参数上……我试过使用“-d arg1=val1 -d arg2=val2”传递单个字符串,我已经尝试过“-d,arg1=val1 等。”并且我已经尝试了各种方法来分割成字符串数组 - 即 {“-d”,“arg1=val1”...}。找不到执行此操作的正确方法的任何文档!
感谢任何帮助,谢谢 科尔曼
请您参考如下方法:
嗨,这段代码对我有用:
String accessKey = "";
String secretKey = "";
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
AmazonElasticMapReduceClient emr = new AmazonElasticMapReduceClient(credentials);
StepFactory stepFactory = new StepFactory();
StepConfig enabledebugging = new StepConfig()
.withName("Enable debugging")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(stepFactory.newEnableDebuggingStep());
StepConfig installHive = new StepConfig()
.withName("Install Hive")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(stepFactory.newInstallHiveStep());
StepConfig runScript = new StepConfig()
.withName("Run Script")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(stepFactory.newRunHiveScriptStep("s3://dummy/dummy.hive"));
RunJobFlowRequest request = new RunJobFlowRequest()
.withName("Hive Interactive")
.withSteps(enabledebugging, installHive, runScript)
.withLogUri("s3://dummy/")
.withInstances(new JobFlowInstancesConfig()
.withHadoopVersion("0.20.205")
.withInstanceCount(1)
.withKeepJobFlowAliveWhenNoSteps(false)
.withMasterInstanceType("m1.small")
.withSlaveInstanceType("m1.small"));
RunJobFlowResult result = emr.runJobFlow(request);
希望这有帮助:)
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



