저는 Amazon Elastic MapReduce 및 Hive를 사용하여 데이터 처리 응용 프로그램을 개발했습니다. 이제 SSH를 사용할 때 하이브 스크립트가 작동하고 대화식 모드 작업 흐름을 사용하여 스크립트를 실행 했으므로 AWS Java API를 사용하여 작업 흐름을 만들려고합니다. http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/calling-emr-with-java-sdk.html를 사용Java API에서 AWS 탄력적 인 mapreduce 작업 흐름을 시작합니다. 하이브 스크립트는 어디에서 실행해야합니까?
내 출발점으로, 나는 /이 SCRIPTPATH 내 하이브 스크립트에 S3 URL이 될 수 있기를 바랍니다 가정이
StepConfig runScript = new StepConfig().withName("Prepare Admin")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(oStepFactory.newRunHiveScriptStep(scriptPath, args));
같은 단계 설정을 만들고, 같은 : S3 : // bucketName/하이브 -스크립트. 내가 발견 한 유일한 문서는 마스터 노드의 파일 시스템에서 스크립트를 사용하는 방법입니다. 그러나 마스터 노드가이 작업 흐름을 위해 시작된 인스턴스 인 경우 파일 시스템에 스크립트 (하이브 또는 기타)를 가져올 수있는 방법을 이해하지 못합니다.
s3 위치를 stepFactory 메서드에 전달하면됩니다. runScript 단계가 실패합니다.
AWS 콘솔을 통해 로그를 확인했습니다. stdout 로그의 끝은
2012-11-19 19:28:33 GMT - ERROR cmd를 실행하는 중 오류가 발생했습니다 : /home/hadoop/.versions/hive-0.7.1/bin/hive '-f' 's3 : //anet-emr/scripts/admin.q ''-d rawDataLocation = S3 : // ANET-EMR/원료 -d 년 = 2010 -d주기 = 1 '
표준 오류 로그로 끝
java.lang.NoSuchMethodError : org.apache.commons.cli.CommandLine.getOptionProperties (Ljava/lang/String;) Ljava/util/Properties; at org.apache.hadoop.hive.cli.OptionsProcessor.process_stage1 (OptionsProcessor.java:115) at org.apache.hadoop.hive.cli.CliDriver.main (CliDriver.java:399) at sun.reflect. java.lang.reflect.Method.invoke에서 sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25) 에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) 에서 NativeMethodAccessorImpl.invoke0 (기본 방법) (Method.java:597) at org.apache.hadoop.util.RunJar.main (RunJar.java:155) at org.apache.hadoop.mapred.JobShell.run (JobShell.java:54) at org .apache.hadoop.util.ToolRunner.run (ToolRunner.java:65) at org.apache.hadoop.util.ToolRunner.run (ToolRunner.java : org.apache.hadoop.mapred.JobShell.main (JobShell.java:68 79) )
컨트롤러 로그
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//home/hadoop/libx/:/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. 지도 작성 됨 .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 정보 실행이 종료 됨 255 2012-11-19T19 : 28 : 34.143Z WARN 나쁜 재발신으로 단계가 실패했습니다
문제는 아마존의 API를 통해 아파치 CLI 라이브러리에 대한 하이브의 호출에 전달되는 인수와 관련이있는 것으로 보입니다. "-d arg1 = val1 -d arg2 = val2 ","-d, arg1 = val1 등 "을 시도했습니다. 그리고 문자열 배열을 다듬는 다양한 방법을 시도했습니다. 즉 {"-d ","arg1 = val1 " ...}. 이 작업을 수행하는 적절한 방법에 대한 문서를 찾을 수 없습니다!
어떤 도움이 평가는 안녕이 코드는 나를 위해 작동 당신에게 콜맨
하는 데 도움이 []가 생성되는 인수 자바. 내 명령이 어디 있었는지 : /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 '/home/hadoop/.versions/hive-0.7.1/bin/hive'-f 's3 : // anet -d ''cycle-1 '-emr/scripts/admin.q' '-d' 'rawDataLocation = s3 : // anet-emr/raw' '-d' – defavantbop