Java Dynamodb请求处理程序接受

Java Dynamodb请求处理程序接受,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,我在云中运行dynamo Insert时发现了一个神秘的异常,关于如何调试这样的错误,有什么帮助或线索吗 背景 我正在运行的代码: 从本地机器运行时,成功地将数据插入dynamodb,但 通过EMR在云中运行mapreduce作业时,由于身份验证而突然失败 使用URL端点进行身份验证 我只需创建如下凭据: client=new DynamoDBClient(new BasicAWSCredentials( "XXXX", "XXXXXXXXXXX));

我在云中运行dynamo Insert时发现了一个神秘的异常,关于如何调试这样的错误,有什么帮助或线索吗

背景

我正在运行的代码:

  • 从本地机器运行时,成功地将数据插入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)
线程“main”java.lang.NoSuchFieldError中的异常:requestHandlers 位于com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.init(AWSSecurityTokenServiceClient.java:214) 位于com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClient.(AWSSecurityTokenServiceClient.java:160) 访问com.amazonaws.auth.STSSessionCredentialsProvider。(STSSessionCredentialsProvider.java:73) 位于com.amazonaws.auth.SessionCredentialsProviderFactory.getSessionCredentialsProvider(SessionCredentialsProviderFactory.java:96) 在com.amazonaws.services.dynamodb.AmazonDynamoDBClient.setEndpoint(AmazonDynamoDBClient.java:857) 位于com.amazonaws.services.dynamodb.AmazonDynamoDBClient.init(AmazonDynamoDBClient.java:262) 位于com.amazonaws.services.dynamodb.AmazonDynamoDBClient.(AmazonDynamoDBClient.java:181) 位于com.amazonaws.services.dynamodb.AmazonDynamoDBClient.(AmazonDynamoDBClient.java:142) 这里的“真实”答案是,当我们试图在现代环境中使用与最新或当前版本不匹配的dynamodb客户端时,它们可能会出现奇怪的反射/类加载错误

  • AWS JAR存在于较旧的EMR AMI实例的类路径上,可能与hadoop作业使用的适当(最新)AWS JAR冲突,hadoop作业调用非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

更新:似乎有一个旧版本的aws sdk 1.1.1包含在EMR节点中!这可能会导致类版本控制冲突。我不确定解决问题的最佳方法,但我现在正在考虑一些选项并运行测试。