这篇文章将为大家详细讲解有关通过HDFS API在Eclipse上编写程序将本地文件上传到HDFS分布式文件系统中异常怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
1、将本地文件上传到HDFS中,遇到问题:
七月 03, 2014 4:44:36 下午 org.apache.hadoop.ipc.Client$Connection handleConnectionFailure
INFO: Retrying connect to server: master/192.168.232.134:8020. Already tried 0 time(s).
或
Call to master/192.168.232.134:8020 failed on connection exception: java.net.ConnectException: Connection refused: no further information
解决方法:
问题所在:路径错误
最开始我路径写为:
String dst = "hdfs://master/opt/file06.txt";
或
String dst = "hdfs://192.168.232.134/opt/file06.txt";
或
String dst = "hdfs://master:9001/opt/file06.txt";
或
String dst = "hdfs://master/opt/file06.txt";
这几种写法都是不对的,正确路径为:
String dst = "hdfs://master:9000/opt/file06.txt";
注意:
事实上,“INFO: Retrying connect to server: master/192.168.232.134:8020. Already tried 0 time(s).”这儿显示无法连接端口8020,是因为我们在程序中未明确指定端口9000,然而“fs.default.name”配置项指定的“namenode RPC交互端口“默认为8020,但是我们在hdfs-site.xml文件中指定fs.default.name的端口为9000,所以在程序中,连接8020端口失效,正确写法为”hdfs://192.168.232.134:9000/opt/file06.txt“或”hdfs://master:9000/opt/file06.txt“
1)、在这儿,如果我们win上配置了master,那么,我们使用master是可以的,在这儿master等价于192.168.232.134
2)、重要的是端口要写正确,这儿端口应该为9000
所以,String dst = "hdfs://master:9000/opt/file06.txt";和String dst = "hdfs://192.168.232.134:9000/opt/file06.txt";两种写法都正确
但是,String dst = "hdfs://master:9001/opt/file06.txt";和String dst = "hdfs://192.168.232.134:9001/opt/file06.txt";两种写法都不正确
2、Cannot create file/opt/file02.txt. Name node is in safe mode.
在hadoop中,经常遇到safe mode这个问题,虽然网上解决办法都可以解决问题,但是,一直没有明白究竟是什么意思。
其实,它处于安全模式的时候,我们只需要再等等,它可以自动离开安全模式的。我们没有必要去执行命令强制退出安全模式。
强制退出安全模式的命令:bin/hadoop dfsadmin -safemode leave
关于安全模式的相关介绍可参见文章《Hadoop 解除 "Name node is in safe mode"》
附:
1)、编写程序操作HDFS文件系统的相关代码可参见链接:《如何使用Java API读写HDFS》
2)、将采用JAVA API将本地文件复制到hadoop文件系统
package com.langgo.hadoop3; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Progressable; /** * @author hadoop *将本地文件复制到hadoop文件系统 */ public class FileCopyWithProgress { public static void main(String[] args) throws IOException { String localSrc = "/home/wqj/opt/140702152709log.txt"; String dst = "hdfs://master:9000/opt/file06.txt"; FileCopyWithProgress.fileCopy(localSrc, dst); } public static void fileCopy(String localSrc, String dst) throws IOException{ InputStream in = new BufferedInputStream(new FileInputStream(localSrc)); Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(dst), conf); OutputStream out = fs.create(new Path(dst), new Progressable() { @Override public void progress() { System.out.println("."); } }); IOUtils.copyBytes(in, out, 4096, true); } }
关于“通过HDFS API在Eclipse上编写程序将本地文件上传到HDFS分布式文件系统中异常怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。