【问题标题】:Hadoop throwing java.lang.VerifyError after exporting jar file导出 jar 文件后 Hadoop 抛出 java.lang.VerifyError
【发布时间】:2011-01-13 22:24:50
【问题描述】:

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

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

我开发了一个(非常简单的)s3Connector 类,在 eclipse 中测试并运行它, 然后去把它挂在我的减少工作中。为了在 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构建路径中,我为指定的libs添加了所有最新的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的某种库导出问题,但不知道如何找到它。

【问题讨论】:

    标签: eclipse amazon-s3 hadoop jets3t


    【解决方案1】:

    想通了。 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 库,一切都很好。

    【讨论】:

    • 进一步部署到 AWS 时,我发现 Amazon 安装的 hadoop 使用 0.7.x 库。希望如果您使用的是 Amazon 的 hadoop,这也会有所帮助。
    • 我正在使用 Amazon hadoop 服务。我有同样的问题,但即使我删除了 lib/ 中的 jets3t-0.6.0.jar,它仍然无法正常工作。我看到了你的cmets。你的意思是我们应该使用版本 0.7.0 而不是 0.8.0?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 1970-01-01
    相关资源
    最近更新 更多