【发布时间】:2017-11-03 02:31:59
【问题描述】:
我需要使用 Java 从 Spark 的 DynamoDB 表中获取数据。它适用于用户的访问密钥和密钥:
final JobConf jobConf = new JobConf(sc.hadoopConfiguration());
jobConf.set("dynamodb.servicename", "dynamodb");
jobConf.set("dynamodb.input.tableName", tableName);
jobConf.set("mapred.output.format.class", "org.apache.hadoop.dynamodb.write.DynamoDBOutputFormat");
jobConf.set("mapred.input.format.class", "org.apache.hadoop.dynamodb.read.DynamoDBInputFormat");
jobConf.set("dynamodb.awsAccessKeyId", accessKey);
jobConf.set("dynamodb.awsSecretAccessKey", secretKey);
jobConf.set("dynamodb.endpoint", endpoint);
我需要使用 AWS 代入角色和 STS(至少出于安全原因)来完全使用 spark 从 DynamoDB 获取数据。可能吗?我发现可以使用假定角色通过 spark (https://issues.apache.org/jira/browse/HADOOP-12537, https://hadoop.apache.org/docs/current3/hadoop-aws/tools/hadoop-aws/index.html) 访问 AWS S3,但还没有找到 DynamoDB 的类似想法。
为了接收 STS 临时凭证,我使用以下代码:
AWSSecurityTokenService stsClient = AWSSecurityTokenServiceClientBuilder.defaultClient();
AssumeRoleRequest assumeRequest = new AssumeRoleRequest()
.withRoleArn(roleArn) // arn:aws:iam::XXXXXXX:role/assume-role-DynamoDB-ReadOnly
.withDurationSeconds(3600)
.withRoleSessionName("assumed-role-session");
AssumeRoleResult assumeResult = stsClient.assumeRole(assumeRequest);
Credentials credentials = assumeResult.getCredentials();
调用 credentials.getAccessKeyId(), credentials.getSecretAccessKey() and credentials.getSessionToken() 返回生成的临时凭据。有了这些凭证,我可以成功地使用 java aws sdk AmazonDynamoDBClient(非火花方法)从 DynamoDB 获取数据。
火花可以吗? spark是否允许使用以下内容:
jobConf.set("dynamodb.awsSessionToken”, sessionToken)?
【问题讨论】:
-
你进步了吗?
-
不,我使用用户的访问密钥和密钥:
jobConf.set("dynamodb.awsAccessKeyId", accessKey); jobConf.set("dynamodb.awsSecretAccessKey", secretKey);
标签: java hadoop apache-spark amazon-dynamodb aws-sdk