虚拟机Hadoop实战(五)用java编写…
来源:互联网 发布:越剧软件下载 编辑:程序博客网 时间:2024/05/23 02:02
终于成功写了个从windows上传文件到远程Linux上hadoop系统,并下载回来的程序
【结果图】
新建Netbeans工程,选择普通的JavaSE应用程序,命令行的即可。其实Hadoop的程序并不复杂,只是内部依赖的包众多,很容易导致编译出错。
【系统配置简介】
1、使用NetbeansIDE的环境是windows,远程连接的Hadoop在地址为10.100.78.101的Linux上(VMware虚拟机)
2、windows、linux下都使用相同的Hadoop 2.7.3版本解压
3、Linux下的core-site.xml内容需要更改为实际ip地址10.100.78.101,而不是原先的localhost
4、在windows端,我把待上传的文件存储在 D:/!虚拟机/!待上传文件/hello.txt
内容为:
First file upload system test
第一个上传文件系统测试
【步骤一,导入包】工程文件同样用Netbeans创建,需要导入外部hadoop众多,这里说明:
hadoop-2.7.3\share\hadoop\common\lib\ 下的所有jar包
hadoop-2.7.3\share\hadoop\common\ 下的hadoop-common-2.7.3.jar
hadoop-2.7.3\share\hadoop\mapreduce\ 下的hadoop-mapreduce-client-core-2.7.3.jar
hadoop-2.7.3\share\hadoop\hdfs\ 下的hadoop-hdfs-2.7.3.jar
(关于部分包解决的问题详见文末)
【步骤二】编写程序:
importjava.io.IOException;
public static boolean CreatDir(String dst,Configuration conf) { PathdstPath = new Path(dst); try{ FileSystem dhfs =FileSystem.get(conf); dhfs.mkdirs(dstPath); } catch(IOException ie) { ie.printStackTrace(); return false; } returntrue; }
public static boolean putToHDFS(String src,String dst, Configuration conf) { PathdstPath = new Path(dst); try{ FileSystem hdfs =dstPath.getFileSystem(conf); hdfs.copyFromLocalFile(false,new Path(src), dstPath); } catch(IOException ie) { ie.printStackTrace(); return false; } returntrue; }
public static boolean getFromHDFS(String src,String dst, Configuration conf) { PathdstPath = new Path(dst); try{ FileSystem dhfs =dstPath.getFileSystem(conf); dhfs.copyToLocalFile(false,new Path(src), dstPath,true); } catch(IOException ie) { ie.printStackTrace(); return false; } returntrue; }
public static boolean checkAndDel(final Stringpath, Configuration conf) { PathdstPath = new Path(path); try{ FileSystem dhfs =dstPath.getFileSystem(conf); if (dhfs.exists(dstPath)){ dhfs.delete(dstPath, true); } else { return false; } } catch(IOException ie) { ie.printStackTrace(); return false; } returntrue; }
public static void main(String[] args){ run(); } public static void run(){ booleanstatus; Stringdst1 ="hdfs://10.100.78.101:9000/EBLearn_data/new"; Configuration conf = new Configuration(); //java.lang.IllegalArgumentException: Wrong FS: //hdfs://10.100.78.101:9000/EBLearn_data/hello.txt, expected:file:/// //解决这个错误的两个方案: //方案1:下面这条命令必须加上,否则出现上面这个错误 conf.set("fs.default.name","hdfs://10.100.78.101:9000"); //方案2:将core-site.xml 和hdfs-site.xml放入当前工程中 status =CreatDir(dst1, conf); System.out.println("CreatDirstatus=" + status);
String dst="hdfs://10.100.78.101:9000/EBLearn_data"; String src="D:/!虚拟机/!待上传文件/hello.txt";
status =putToHDFS(src, dst, conf); System.out.println("putToHDFSstatus=" + status); src ="hdfs://10.100.78.101:9000/EBLearn_data/hello.txt"; dst ="D:/!虚拟机/!待上传文件/hadoop_need/"; status =getFromHDFS(src, dst, conf); System.out.println("getFromHDFSstatus=" + status);
dst ="hdfs://10.100.78.101:9000/EBLearn_data/hello.txt"; status =checkAndDel(dst, conf); System.out.println("checkAndDelstatus=" + status); }
importorg.apache.hadoop.conf.Configuration;
importorg.apache.hadoop.fs.FileSystem;
importorg.apache.hadoop.fs.Path;
public class UploadHadoop{
}
【步骤三】编译运行即可
==================================================================
【期间出现的Exception以及问题总结】
参照网上的教程编写了个Java程序,用于登录远程Hadoop,并上传下载文件。
结果被连接拒绝的问题困扰了很久。
啥啥把VMware虚拟机端口改成桥接模式,都不是解决问题的本质。 问题如下:
java.net.ConnectException: CallFrom WINDOWS7FLASH/10.100.78.140 to 10.100.78.101:9000 failed onconnection exception: java.net.ConnectException: Connectionrefused: no further information; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
居然把我的连接拒绝了!然后不告诉我原因。网上大部分资料都叫检查下远程的hadoop到底开端口了吗?到底有没有被防火墙封?配置网络啊之类的。
可是我在目前客户端,通过浏览器查看http://10.100.78.101:50070是可以成功打开页面并查看文件系统的。肯定没封ip或者我的远程访问。接下来的问题是,会不会是9000端口被封了呢?网上资料显示,判断9000端口可以用telnet来。好吧,我目前客户端是windows系统的,没有telnet,先进安装了hadoop的linux,用telnet连接下自己:Linux命令$ telnet localhost 9000
结果显示没有任何问题。
在windows下的替代品是啥?当然是putty啦。打开putty连接,果然出现Connectionrefused弹窗。
所以问题在于,远程无法连接9000端口。为何呢?
【原来】是因为在hadoop配置文件core-site.xml中,fs.default.name的值为"hdfs://localhost:9000"。这是很多hadoop入门单机版或者伪分布式教程,教你的设置。以这样的设置启动hadoop,它只会运行本地登录9000端口。
【解决】修改core-site.xml中fs.default.name的值为"hdfs://10.100.78.101:9000"。即更改为实际的hadoop服务器地址。再次连接就不会报错了。
参考文献:http://www.2cto.com/os/201411/352191.html
==================================================================
【问题】编译运行java时报错:“java.io.IOException: No FileSystem forscheme: hdfs"”
【原因及解决】出现这个错误是因为缺少hadoop-hdfs-x.x.x.jar包,导入即可。
==================================================================
entry in command string: null chmod0644
【解决方法】
将 fs.copyToLocalFile( hdfsPath,localPath);
改为 fs.copyToLocalFile( false,hdfsPath,localPath,true);
【解析】
Delete source == false 第一个布尔变量,将“删除原文件”设置为false
Use raw local file system == true第二个布尔变量,指定系统使用原始的本地文件系统。由于Hadoop原先是按照Linux系统设计的,虽然基于Java,但跨平台的时候涉及文件的部分依然要本地化。不然就会冒出在windows下居然有报0644权限的问题.
==================================================================
虽然没有出现这样的问题,不过在网上看到,感觉有些帮助
Permission denied: user=root, access=WRITE,inode="/user/Hive/warehouse":hadoop:hadoop:drwxrwxr-x
原因:本地用户administrator(本机windows用户)想要远程操作hadoop系统,没有权限引起的。
【解决办法】
1、如果是测试环境,可以取消hadoophdfs的用户权限检查。打开conf/hdfs-site.xml,找到dfs.permissions属性修改为false(默认为true)OK了。
2. 指定访问hdfs的客户端身份
fs = FileSystem.get(new URI("hdfs://192.168.169.128:9000/"),conf, "root");
==================================================================
0 0
- 虚拟机Hadoop实战(五)用java编写…
- 虚拟机Hadoop实战(六)用java编写…
- 虚拟机Hadoop实战(三)datanode无…
- 虚拟机Hadoop实战(四)namenode无…
- Java虚拟机(五)
- Java虚拟机(五)
- 虚拟机Hadoop实战(一)概念总览
- 虚拟机Hadoop实战(二)详细步骤
- Hadoop 实战之Streaming(五)
- Hadoop 实战之Streaming(五)
- 【Java】实战Java虚拟机之五“开启JIT编译”
- Java虚拟机(五):虚拟机类加载
- JAVA虚拟机系列(五)
- JAVA虚拟机优化实战
- 深入理解java虚拟机(五)
- 深入理解Java虚拟机(五)
- Hadoop实战(2)_虚拟机搭建Hadoop的全分布模式
- Hadoop实战(四) 编写MR程序
- 虚拟机Hadoop实战(三)datanode无…
- MFC list control高亮显示某行
- 虚拟机Hadoop实战(四)namenode无…
- 排列与组合问题
- 多字节编码与Unicode码的区别
- 虚拟机Hadoop实战(五)用java编写…
- 链表A+B
- 虚拟机Hadoop实战(六)用java编写…
- 数列取模Fibonacci数列
- React Native 一些事
- OOZIE系统遇到的各种问题解决
- 实现折半查找算法(二分查找)
- OOZIE系统遇到的各种问题解决2:to…
- Android Studio 关于gradle和plugin的版本对应