分享

报Protocol message end-group tag did not match expected tag,求大神支招

rano1986 发表于 2015-6-29 14:32:19 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 89044
大家好,我在本地WIN7 64位系统中Eclipse连Hadoop(CDH 5.3.3),Eclipse连接Hadoop的时候报错:Run的时候马上报:
15/06/29 14:30:20 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
然后3-5秒之后,报:
Exception in thread "main" java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.; Host Details : local host is: "Gore-PC/10.108.66.211"; destination host is: "10.108.66.81":9000;
        at org.apache.hadoop.net.NetUtils.wrapException(NetUtils.java:764)
        at org.apache.hadoop.ipc.Client.call(Client.java:1415)
        at org.apache.hadoop.ipc.Client.call(Client.java:1364)
        at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:206)
        at com.sun.proxy.$Proxy7.create(Unknown Source)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.create(ClientNamenodeProtocolTranslatorPB.java:287)
        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:187)
        at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
        at com.sun.proxy.$Proxy8.create(Unknown Source)
        at org.apache.hadoop.hdfs.DFSOutputStream.newStreamForCreate(DFSOutputStream.java:1645)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1618)
        at org.apache.hadoop.hdfs.DFSClient.create(DFSClient.java:1543)
        at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:396)
        at org.apache.hadoop.hdfs.DistributedFileSystem$6.doCall(DistributedFileSystem.java:392)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:392)
        at org.apache.hadoop.hdfs.DistributedFileSystem.create(DistributedFileSystem.java:336)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:908)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:889)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:786)
        at org.apache.hadoop.fs.FileSystem.create(FileSystem.java:775)
        at com.hadoop.test.Test.main(Test.java:21)
Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
        at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:94)
        at com.google.protobuf.CodedInputStream.checkLastTagWas(CodedInputStream.java:124)
        at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:202)
        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:1056)
        at org.apache.hadoop.ipc.Client$Connection.run(Client.java:950)



我的代码如下:
public static void main(String[] args) throws IOException {
                System.setProperty("hadoop.home.dir", "d:/hadoop-common-2.2.0-bin/");
                // 将本地文件上传到hdfs。
                String target = "hdfs://10.108.66.81:9000/user/history/sample_data/tab1/tab3.csv";
                FileInputStream fis = new FileInputStream(new File("D:\\temp\\tab2-2.csv"));// 读取本地文件
                Configuration config = new Configuration();
                FileSystem fs = FileSystem.get(URI.create(target), config);
                OutputStream os = fs.create(new Path(target));
                // copy
                IOUtils.copyBytes(fis, os, 4096, true);
                System.out.println("拷贝完成...");
        }


求大家指点!

已有(10)人评论

跳转到指定楼层
rano1986 发表于 2015-7-3 09:23:45
bob007 发表于 2015-6-29 16:42
可以多找找,不是空的,我这能看到
链接: http://pan.baidu.com/s/1c0DuYsS 密码:503d

谢谢你的帮助,我解决了问题,总结原因如下:
1、需要连接HDFS NN主机,如果连接其他DN的话,会报Connection refused
2、需使用8020端口,如果使用9000端口,会报Protocol message end-group tag did not match expected tag
3、在定义一个FileSystem变量的时候分布式和单机版的方法是不一样的,单机版使用的是FileSystem类的静态函数
FileSystem hdfs = FileSystem.get(conf)  
分布式下需要使用Path来获得
Path dstDir = new Path(hdfsPath);  
FileSystem hdfs = dstDir.getFileSystem(conf);   
否则会报
Wrong FS: hdfs://hdfs://10.108.66.81:8020/..., expected: file:///
4、需要定义执行HDFS的用户,否则会出现Permission denied
System.setProperty("HADOOP_USER_NAME", "hdfs");

回复

使用道具 举报

bob007 发表于 2015-6-29 15:12:38



public static void main(String[] args) throws IOException {
                System.setProperty("hadoop.home.dir", "d:/hadoop-common-2.2.0-bin/");
                // 将本地文件上传到hdfs。
                String target = "hdfs://10.108.66.81:9000/user/history/sample_data/tab1/tab3.csv";
                FileInputStream fis = new FileInputStream(new File("D:\\temp\\tab2-2.csv"));// 读取本地文件
                Configuration config = new Configuration();
                FileSystem fs = FileSystem.get(URI.create(target), config);

               OutputStream os = fs.create(new Path(target));
                // copy
                IOUtils.copyBytes(fis, os, 4096, true);
                System.out.println("拷贝完成...");
        }

################################################
         FileSystem fs = FileSystem.get(URI.create(target), config);
                修改为

      FileSystem fs = FileSystem.get(URI.create(hdfs://10.108.66.81:9000), config);

#####################################################

回复

使用道具 举报

rano1986 发表于 2015-6-29 15:34:16
回复

使用道具 举报

bob007 发表于 2015-6-29 15:54:43
rano1986 发表于 2015-6-29 15:34
你好,非常感谢你的指点。
我根据你的意见修改了那句,还是报一样的错误。
恳请指教

楼主从哪看到的程序,还是自己编的,感觉很多漏洞。d:/hadoop-common-2.2.0-bin/

上面并非hadoop-common,而是整个hadoop路径

System.setProperty("hadoop.home.dir", "F:/ hadoop/hadoop -2.3.0");

hadoop.home.dir,这里需要是hadoop的路径
最好找一个标准程序

回复

使用道具 举报

rano1986 发表于 2015-6-29 16:15:29
bob007 发表于 2015-6-29 15:54
楼主从哪看到的程序,还是自己编的,感觉很多漏洞。d:/hadoop-common-2.2.0-bin/

上面并非hadoop-comm ...

你好,再次感谢你,这段是我从网上找来的。
我参考了另外一个贴的代码:http://www.aboutyun.com/forum.php?mod=viewthread&tid=9029
但是也是报同样的错误。
public static void main(String[] args) {
                  {
                  String uri = "hdfs://10.108.66.81:9000"; //
                  Configuration conf = new Configuration();
                  File workaround = new File(".");
                  System.getProperties().put("hadoop.home.dir",
                    workaround.getAbsolutePath());
                  //System.setProperty("hadoop.home.dir", "d:/hadoop-common-2.2.0-bin");//注释
                  new File("./bin").mkdirs();
                  try {
                   new File("./bin/winutils.exe").createNewFile();
                  } catch (IOException e) {
                   e.printStackTrace();
                  }
                  FileSystem fs = null;
                  Path path = new Path("/user/history/sample_data/tab1/");
                  try {
                   fs = FileSystem.get(URI.create(uri), conf);
                   FileStatus[] FileStatus=fs.listStatus(path);// fs.listStatus 就报错了,fs的相关操作都一样
                  } catch (Exception e) {
                   e.printStackTrace();
                  }
                  
                }
         }


回复

使用道具 举报

rano1986 发表于 2015-6-29 16:18:02
bob007 发表于 2015-6-29 15:54
楼主从哪看到的程序,还是自己编的,感觉很多漏洞。d:/hadoop-common-2.2.0-bin/

上面并非hadoop-comm ...

你好,其实那个路径,不是hdfs common,而是网上说windows系统连HDFS需要的一个程序,我解压到那里了。
回复

使用道具 举报

bob007 发表于 2015-6-29 16:30:46
rano1986 发表于 2015-6-29 16:18
你好,其实那个路径,不是hdfs common,而是网上说windows系统连HDFS需要的一个程序,我解压到那里了。

那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程
回复

使用道具 举报

rano1986 发表于 2015-6-29 16:32:04
bob007 发表于 2015-6-29 16:30
那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程

好,我看看,谢谢你!
回复

使用道具 举报

rano1986 发表于 2015-6-29 16:38:45
bob007 发表于 2015-6-29 16:30
那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程

非常感谢你,但是我过去找不到代码,百度网盘里面是空的。不过你给了我个好建议,我尝试在论坛里面多找找其他帖子,看能否找到代码。
回复

使用道具 举报

bob007 发表于 2015-6-29 16:42:44
rano1986 发表于 2015-6-29 16:38
非常感谢你,但是我过去找不到代码,百度网盘里面是空的。不过你给了我个好建议,我尝试在论坛里面多找找 ...


可以多找找,不是空的,我这能看到
链接: http://pan.baidu.com/s/1c0DuYsS 密码:503d

编程方面推荐这个
零基础学习hadoop到上手工作线路指导(编程篇)

回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条