1

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

背景

我正在运行的代码:

  • 从我的本地机器运行时成功地将数据插入到 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)
4

1 回答 1

2

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

  • AWS jars 存在于旧 EMR AMI 实例的类路径中,可能与调用非 EMR 服务的 hadoop 作业使用的正确(最新)AWS jars 冲突(在我们的例子中,例如 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。

于 2012-07-27T00:15:18.170 回答