java - 尝试写入 HDFS 时出现 InvalidProtocolBufferException

标签 java hadoop hdfs protocol-buffers

这是我的代码:

        Configuration conf = new Configuration();
        conf.addResource(new Path("/etc/hadoop/conf/core-site.xml"));
        conf.addResource(new Path("/etc/hadoop/conf/hdfs-site.xml"));
        conf.addResource(new Path("/etc/hadoop/conf/mapred-site.xml"));
        conf.addResource(new Path("/etc/hadoop/conf/yarn-site.xml"));
        FileSystem fs = FileSystem.get(new URI("hdfs://localhost:8020"),conf);
        Path path = new Path(hdfsDestination);
        FSDataOutputStream outputStream = fs.create(path);

hdfsDestination 是/user/msknapp/insurance,这是输出:

java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).; Host Details : local host is: "localhost.localdomain/127.0.0.1"; destination host is: "localhost":8020; 
    at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:764)
    at org.apache.hadoop.ipc.Client.call(Client.java:1351)
    at org.apache.hadoop.ipc.Client.call(Client.java:1300)
    at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
    at com.sun.proxy.$Proxy9.create(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:186)
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
    at com.sun.proxy.$Proxy9.create(Unknown Source)
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.create(ClientNamenodeProtocolTranslatorPB.java:227)
    at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1389)
    at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1382)
    at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1307)
    at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:384)
    at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:380)
    at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
    at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:380)
    at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:324)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:905)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:886)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:783)
    at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:772)
    at knapp.hdfs.importer.insurance.InsuranceIO.writeToHdfsAsAvro(InsuranceIO.java:68)
    at knapp.hdfs.importer.insurance.InsuranceIO.writeFileToHdfsAsAvro(InsuranceIO.java:51)
    at knapp.hdfs.importer.ImporterCommandLine.run(ImporterCommandLine.java:72)
    at knapp.hdfs.importer.ImporterCommandLine.main(ImporterCommandLine.java:61)
Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).
    at com.google.protobuf.InvalidProtocolBufferException.invalidTag(InvalidProtocolBufferException.java:89)
    at com.google.protobuf.CodedInputStream.readTag(CodedInputStream.java:108)
    at org.apache.hadoop.ipc.protobuf.RpcHeaderProtos$RpcResponseHeaderProto.<init>(RpcHeaderProtos.java:1398)
    at org.apache.hadoop.ipc.protobuf.RpcHeaderProtos$RpcResponseHeaderProto.<init>(RpcHeaderProtos.java:1362)
    at org.apache.hadoop.ipc.protobuf.RpcHeaderProtos$RpcResponseHeaderProto$1.parsePartialFrom(RpcHeaderProtos.java:1492)
    at org.apache.hadoop.ipc.protobuf.RpcHeaderProtos$RpcResponseHeaderProto$1.parsePartialFrom(RpcHeaderProtos.java:1487)
    at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:200)
    at com.google.protobuf.AbstractParser.parsePartialDelimitedFrom(AbstractParser.java:241)
    at com.google.protobuf.AbstractParser.parseDelimitedFrom(AbstractParser.java:253)
    at com.google.protobuf.AbstractParser.parseDelimitedFrom(AbstractParser.java:259)
    at com.google.protobuf.AbstractParser.parseDelimitedFrom(AbstractParser.java:49)
    at org.apache.hadoop.ipc.protobuf.RpcHeaderProtos$RpcResponseHeaderProto.parseDelimitedFrom(RpcHeaderProtos.java:2364)
    at org.apache.hadoop.ipc.Client$Connection.receiveRpcResponse(Client.java:996)
    at org.apache.hadoop.ipc.Client$Connection.run(Client.java:891)

我有 CDH4.8 在伪分布式模式下运行:

[msknapp@localhost conf]$ hadoop fs -ls /user/msknapp
Found 2 items
drwxr-xr-x   - msknapp supergroup          0 2014-01-01 10:22 /user/msknapp/input
drwxr-xr-x   - msknapp supergroup          0 2014-01-01 10:35 /user/msknapp/output23
[msknapp@localhost conf]$ hadoop fs -ls /user
Found 1 items
drwxrwxrwx   - msknapp supergroup          0 2014-01-01 10:35 /user/msknapp
[msknapp@localhost conf]$ whereis hadoop
hadoop: /usr/bin/hadoop /etc/hadoop /usr/lib/hadoop /usr/share/man/man1/hadoop.1.gz

如果重要的话,我正在使用 CentOS 6.4。我可以从命令行将数据放入 HDFS 中,但由于某种原因不能从代码中放入。有人可以告诉我为什么我不能用我的代码写入 HDFS 吗?

最佳答案

我遇到了同样的异常,我发现缺少一些依赖项,我只有 hadoop-core 但还需要更多。当我添加这些时,它起作用了:

            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-core</artifactId>
                <version>2.0.0-mr1-cdh4.3.0</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>2.0.0-cdh4.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.0.0-cdh4.3.0</version>
            </dependency>

关于java - 尝试写入 HDFS 时出现 InvalidProtocolBufferException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20928329/

相关文章:

java - 在 Nashorn 中禁用 ECMAScript 扩展

hadoop - 如何从 HIVE 中的日期中减去月份

java - 什么会使这个目录在 HDFS 上不可组写?

java - 在 Tomcat 中运行后台 Java 程序

java - JavaFX 中的 SecondaryLoop,如 Swing?

hadoop - 并行运行 Oozie 操作

java - 如何在MapReduce程序中使用本地聚合方法,例如in-mapper combiner?

hadoop - 无法将水槽与 mongodb 连接

python - PySpark - 从集合传递到 RDD

java - 连接返回许多部分重复项的高效 Hibernate 标准