java从 Java API 启动 AWS elastic mapreduce 作业流。我的 hive 脚本应该放在哪里

qq78292959 阅读:55 2023-06-13 20:47:03 评论:0

我一直在使用 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); 

希望这有帮助:)


标签:MapReduce
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号