5

我正在更改一个 hadoop 映射 - 减少当前编译和运行良好的作业,无需我的更改。

作为工作的一部分,我现在将连接到 S3 以传递文件。

我开发了一个(非常简单的)s3Connector 类,在 Eclipse 中测试并运行它,然后将它挂接到我的 reduce 工作中。为了在 hadoop 中运行作业,我必须将项目导出为 jar 文件,然后从 hadoop 中调用它。jar 文件似乎从 Eclipse 编译和导出没有问题,但是当我在 hadoop 中运行它时,我得到一个 java.lang.VerifyError 异常。

java.lang.VerifyError: (class: com/extrabux/services/S3Connector, method: 
connectToS3 signature: ()V) Incompatible argument to function

其他几篇帖子提到可能存在jar版本依赖关系冲突,但是在我的eclipse构建路径中,我为指定的库添加了所有最新的jar文件,并将它们推送到构建路径顺序的顶部。

这就像我可以将其隔离为一样简单:

import org.jets3t.service.impl.rest.httpclient.RestS3Service;
import org.jets3t.service.security.AWSCredentials;

public class S3Connector {

protected RestS3Service s3Service;
protected AWSCredentials awsCredentials;


public S3Connector()
{
    this.awsCredentials= new AWSCredentials("my secret 1", "my secret 2");
}


public void connectToS3() throws Exception
{
    this.s3Service = new RestS3Service(this.awsCredentials);
}  

}

即使是那个简单的课程也会死掉......同样的信息。一旦我在构造函数和 RestS3Service 中注释掉 AWS 凭证,问题就消失了。基本上,我认为这是eclipse中的某种库导出问题,但不知道如何找到它。

4

1 回答 1

4

想通了。hadoop lib 目录中有一个旧版本的 jets3t jar

hadoop 命令行脚本循环遍历 lib 目录中的所有 jar,并将它们物理添加到它构建的最终执行的命令行命令的类路径中。0.6.0 jar 的这个命令行类路径覆盖了我在 jar 文件中导出的良好 0.8.0 jar。由于 0.6.0 版本没有指定 RestS3Service 的构造函数,因此抛出了 java.lang.VerifyError。通过从 hadoop 中删除 0.6.0 库,一切都很好。

于 2011-01-14T02:05:53.617 回答