报Protocol message end-group tag did not match expected tag,求大神支招
大家好,我在本地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("拷贝完成...");
}
求大家指点!
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");
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);
#####################################################
bob007 发表于 2015-6-29 15:12
public static void main(String[] args) throws IOException {
System.setPropert ...
你好,非常感谢你的指点。
我根据你的意见修改了那句,还是报一样的错误。
恳请指教{:soso_e183:}
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的路径
最好找一个标准程序
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();
}
}
}
bob007 发表于 2015-6-29 15:54
楼主从哪看到的程序,还是自己编的,感觉很多漏洞。d:/hadoop-common-2.2.0-bin/
上面并非hadoop-comm ...
你好,其实那个路径,不是hdfs common,而是网上说windows系统连HDFS需要的一个程序,我解压到那里了。http://www.aboutyun.com/forum.php?mod=image&aid=16769&size=300x300&key=b949caf539bc2ecf&nocache=yes&type=fixnone
rano1986 发表于 2015-6-29 16:18
你好,其实那个路径,不是hdfs common,而是网上说windows系统连HDFS需要的一个程序,我解压到那里了。
那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程
bob007 发表于 2015-6-29 16:30
那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程
好,我看看,谢谢你!
bob007 发表于 2015-6-29 16:30
那是一个问题贴,参考一个正常的代码
hadoop实战:Java对hdfs的编程
非常感谢你,但是我过去找不到代码,百度网盘里面是空的。不过你给了我个好建议,我尝试在论坛里面多找找其他帖子,看能否找到代码。
rano1986 发表于 2015-6-29 16:38
非常感谢你,但是我过去找不到代码,百度网盘里面是空的。不过你给了我个好建议,我尝试在论坛里面多找找 ...
可以多找找,不是空的,我这能看到
链接: http://pan.baidu.com/s/1c0DuYsS 密码:503d
编程方面推荐这个
零基础学习hadoop到上手工作线路指导(编程篇)
页:
[1]
2