我试图从Eclipse运行Elastic MapReduce但是不能这样做。
我的代码如下:
public class RunEMR {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AWSCredentials credentials = new BasicAWSCredentials("xxxx","xxxx");
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 hiveScript = new StepConfig().withName("Hive Script")
.withActionOnFailure("TERMINATE_JOB_FLOW")
.withHadoopJarStep(stepFactory.newRunHiveScriptStep("s3://mywordcountbuckett/binary/WordCount.jar"));
RunJobFlowRequest request = new RunJobFlowRequest()
.withName("Hive Interactive")
.withSteps(enableDebugging, installHive)
.withLogUri("s3://mywordcountbuckett/")
.withInstances(new JobFlowInstancesConfig()
.withEc2KeyName("xxxx")
.withHadoopVersion("0.20")
.withInstanceCount(3)
.withKeepJobFlowAliveWhenNoSteps(true)
.withMasterInstanceType("m1.small")
.withSlaveInstanceType("m1.small"));
RunJobFlowResult result = emr.runJobFlow(request);
}
}
我得到的错误是:
Exception in thread "main" com.amazonaws.AmazonServiceException: InstanceProfile is required for creating cluster. (Service: AmazonElasticMapReduce; Status Code: 400; Error Code: ValidationException; Request ID: 7a96ee32-9744-11e5-947d-65ca8f7db0a5
我已经尝试了几个小时但无法修复它。有谁知道怎么做?
答案 0 :(得分:3)
我得到了同样的异常InstanceProfile is required for creating cluster
。
必须设置服务角色和作业流角色,如下所示
aRunJobFlowRequest.setServiceRole("EMR_DefaultRole")
aRunJobFlowRequest.setJobFlowRole("EMR_EC2_DefaultRole")
之后我没事。
AWS Document for EMR IAM Roles说
AWS身份和访问管理(IAM)角色为IAM用户或AWS服务提供了一种具有特定指定权限和资源访问权限的方式。例如,这可能允许用户访问资源或其他服务以代表您行事。您必须为集群指定两个IAM角色:Amazon EMR服务的角色(服务角色),以及Amazon EMR管理的EC2实例(实例配置文件)的角色。
因此,异常消息中的单词InstanceProfile
可能意味着文档中的a role for the EC2 instances (instance profile)
,但是在指定JobFlowRole
后我通过了该异常。有点奇怪。
答案 1 :(得分:0)
不推荐使用您尝试使用的版本,并且需要使用IAM角色。按照文档http://docs.aws.amazon.com/ElasticMapReduce/latest/ManagementGuide/calling-emr-with-java-sdk.html中给出的示例进行操作。
答案 2 :(得分:0)
对于ec2角色(此处为jobflowrole),将在内部创建实例配置文件。因此,它可以互换使用这些名称。 如果使用boto3从头开始创建emr集群,则还应该创建emr服务角色,一个ec2jobflow角色,一个链接到ec2jobflow角色的实例配置文件。