Dynamodb requestHandler接受

时间:2012-07-25 23:57:22

标签: java amazon-web-services amazon-dynamodb

我在云端运行发电机插件时发现了一个神秘的例外,有关如何调试此类错误的任何帮助或线索?

背景

我正在运行的代码:

  • 从本地计算机运行时,成功地将数据插入到dynamodb中,但是

  • 在EMR上的mapreduce作业中运行云时,由于身份验证而突然失败。

  • 使用URL端点进行身份验证。

我只是像这样创建凭证:

   client=new DynamoDBClient(new BasicAWSCredentials(
        "XXXX",
        "XXXXXXXXXXX));
   client.setEndpoint("https://dynamodb.eu-west-1.amazonaws.com");

我得到的例外情况如下:

Exception in thread "main" java.lang.NoSuchFieldError: requestHandlers
        at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.init(AWSSecurityTokenServiceClient.java:214)
        at com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.<init>(AWSSecurityTokenServiceClient.java:160)
        at com.amazonaws.auth.STSSessionCredentialsProvider.<init>(STSSessionCredentialsProvider.java:73)
        at com.amazonaws.auth.SessionCredentialsProviderFactory.getSessionCredentialsProvider(SessionCredentialsProviderFactory.java:96)
        at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.setEndpoint(AmazonDynamoDBClient.java:857)
        at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.init(AmazonDynamoDBClient.java:262)
        at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.<init>(AmazonDynamoDBClient.java:181)
        at com.amazonaws.services.dynamodb.AmazonDynamoDBClient.<init>(AmazonDynamoDBClient.java:142)

1 个答案:

答案 0 :(得分:2)

这里的“真实”答案是,当我们尝试在现代环境中使用它们时,与最新或当前版本不匹配的dynamodb客户端会出现奇怪的反射/类加载错误。

  • 旧版EMR AMI实例的类路径上存在的AWS jar可能与hadoop作业使用的适当(最新)AWS jar冲突,后者调用非EMR服务(例如,在我们的示例中为dynamodb)。

在我较旧的AMI实例上,我只是发出:

mv $HOME/lib/aws-java-sdk-1.1.1.jar $HOME/lib/aws-java-sdk-1.1.1.jar.old 

解决单节点群集上的问题。


导致此错误的根本原因?是因为我使用的是较旧的Ruby elastic-mapreduce客户端,导致在我的EMR云中创建了较旧的AMI版本,这些版本在类路径上有过时的aws-sdk jar。