摘要:对上的文件进行上传和下载是对集群的基本操作,在权威指南一书中,对文件的上传和下载都有代码的实例,但是对如何配置客户端却是没有讲得很清楚,经过长时间的搜索和调试,总结了一下,如何配置使用集群的方法,以及自己测试可用的对集群上的文件进行操作的程
对HDFS上的文件进行上传和下载是对集群的基本操作,在《HADOOP权威指南》一书中,对文件的上传和下载都有代码的实例,但是对如何配置HADOOP客户端却是没有讲得很清楚,经过长时间的搜索和调试,总结了一下,如何配置使用集群的方法,以及自己测试可用的对集群上的文件进行操作的程序。首先,需要配置对应的环境变量:
hadoop_HOME="/home/work/tools/java/hadoop-client/hadoop" for f in $hadoop_HOME/hadoop-*.jar; do hadoop_CLASSPATH=${hadoop_CLASSPATH}:$f done for f in $hadoop_HOME/lib/*.jar; do hadoop_CLASSPATH=${hadoop_CLASSPATH}:$f done hadoopvfs_HOME="/home/work/tools/java/hadoop-client/hadoop-vfs" for f in $hadoopvfs_HOME/lib/*.jar; do hadoop_CLASSPATH=${hadoop_CLASSPATH}:$f done export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/work/tools/java/hadoop-client/hadoop/lib/native/Linux-amd64-64/
其中LD_LIBRARY_PATH是在调用时需要用到的库的路径,hadoop_CLASSPATH则是我们hadoop客户端里各种jar包
有一点需要注意的是最好不要使用HADOOP_HOME这个变量,这个是一个系统使用的环境变量,最好不要和它冲突
编译类的方法:
javac -classpath $CLASSPATH:$hadoop_CLASSPATH HDFSUtil.java
运行的方法:
java -classpath $CLASSPATH:$hadoop_CLASSPATH HDFSUtil
但是在实际的使用过程中,会报No Permission之类的错误,或者你能保证代码没有问题的情况下,在运行的时候也会报一些奇奇怪怪的错误
那么问题来了,这是什么鬼?
答案:这是因为没有配置对应集群的配置文件
因为在《HADOOP权威指南》一书中,弱化了配置的东西,所以在具体使用集群的时候就会出现问题,如何解决呢,这样子:
this.conf = new Configuration(false); conf.addResource("./hadoop-site.xml"); conf.addResource("./hadoop-default.xml"); conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()); conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
为什么会这样,书上只是很简单的:
this.conf = new Configuration();
那是因为默认你的集群在本地,所以不需要做配置,但是在实际使用的过程中,各个集群的配置是不同的,所以我们要引入集群的配置
这是非常重要的一点,因为实际使用的过程中我们都是使用的HADOOP的客户端,而且是已经搭好环境的集群,所以我们需要做好本地的配置
hadoop-site.xml和hadoop-default.xml这两个文件在所使用的客户端的conf目录下,在addResource的时候指定好目录就行了
将以上所提到的配置,全部配完之后,这个程序才能真正运行起来,所以配置是非常重要的一环。
以下是对应的工具的代码,有兴趣的看一下吧,使用的是文件流的方式来搞的,这样子也可以打通FTP和HDFS之间文件的互传:
import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URL; import java.io.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.util.Progressable; public class HDFSUtil { private String hdfs_node = ""; private String hdfs_path = ""; private String file_path = ""; private String hadoop_site = ""; private String hadoop_default = ""; private Configuration conf = null; public HDFSUtil(String hdfs_node) { this.hdfs_node = hdfs_node; } public String getHdfsNode() { return this.hdfs_node; } public void setHdfsPath(String hdfs_path){ this.hdfs_path = hdfs_path; } public String getHdfsPath(){ return this.hdfs_path; } public void setFilePath(String file_path){ this.file_path = file_path; } public String getFilePath(){ return this.file_path; } public void setHadoopSite(String hadoop_site){ this.hadoop_site = hadoop_site; } public String getHadoopSite(){ return this.hadoop_site; } public void setHadoopDefault(String hadoop_default){ this.hadoop_default = hadoop_default; } public String getHadoopDefault(){ return this.hadoop_default; } public int setConfigure(boolean flag) { if (flag == false){ if (this.getHadoopSite() == "" || this.getHadoopDefault() == ""){ return -1; } else { this.conf = new Configuration(false); conf.addResource(this.getHadoopDefault()); conf.addResource(this.getHadoopSite()); conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()); conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName()); return 0; } } this.conf = new Configuration(); return 0; } public Configuration getConfigure() { return this.conf; } public int upLoad(String localName, String remoteName) throws FileNotFoundException, IOException { InputStream inStream = null; FileSystem fs = null; try{ inStream = new BufferedInputStream(new FileInputStream(localName)); fs = FileSystem.get(URI.create(this.hdfs_node), this.conf); OutputStream outStream = fs.create(new Path(remoteName) ,new Progressable() { public void progress(){ System.out.print("."); } }); IOUtils.copyBytes(inStream, outStream, 4096, true); inStream.close(); return 0; } catch (IOException e){ inStream.close(); e.printStackTrace(); return -1; } } public int upLoad(InputStream inStream, String remoteName) throws FileNotFoundException, IOException { FileSystem fs = null; try{ fs = FileSystem.get(URI.create(this.hdfs_node), this.conf); OutputStream outStream = fs.create(new Path(remoteName) ,new Progressable() { public void progress(){ System.out.print("."); } }); IOUtils.copyBytes(inStream, outStream, 4096, true); inStream.close(); return 0; } catch (IOException e){ inStream.close(); e.printStackTrace(); return -1; } } public int donwLoad(String remoteName, String localName, int lines) throws FileNotFoundException, IOException { FileOutputStream fos = null; InputStreamReader isr = null; BufferedReader br = null; String str = null; OutputStreamWriter osw = null; BufferedWriter buffw = null; PrintWriter pw = null; FileSystem fs = null; InputStream inStream = null; try { fs = FileSystem.get(URI.create(this.hdfs_node + remoteName), this.conf); inStream = fs.open(new Path(this.hdfs_node + remoteName)); fos = new FileOutputStream(localName); osw = new OutputStreamWriter(fos, "UTF-8"); buffw = new BufferedWriter(osw); pw = new PrintWriter(buffw); isr = new InputStreamReader(inStream, "UTF-8"); br = new BufferedReader(isr); while((str = br.readLine()) != null && lines > 0){ lines--; pw.println(str); } } catch (IOException e){ throw new IOException("Couldn"t write.", e); } finally { pw.close(); buffw.close(); osw.close(); fos.close(); inStream.close() } return 0; } //main to test public static void main(String[] args){ String hdfspath = null; String localname = null; String hdfsnode = null; int lines = 0; if (args.length == 4){ hdfsnode = args[0]; hdfspath = args[1]; localname = args[2]; lines = Integer.parseInt(args[3]); } else{ hdfsnode = "hdfs://nj01-nanling-hdfs.dmop.baidu.com:54310"; hdfspath = "/app/ps/spider/wdmqa/wangweilong/test/HDFSUtil.java"; localname = "/home/work/workspace/project/dhc2-0/dhc/base/ftp/papapa"; lines = 5; } HDFSUtil hdfsutil = new HDFSUtil(hdfsnode); hdfsutil.setFilePath(hdfsutil.getHdfsNode()+hdfspath); hdfsutil.setHadoopSite("./hadoop-site.xml"); hdfsutil.setHadoopDefault("./hadoop-default.xml"); hdfsutil.setConfigure(false); try { hdfsutil.donwLoad(hdfspath, localname, lines); } catch (IOException e){ e.printStackTrace(); } }
如果想要了解FTP上文件的下载,请参考这篇文章:
ftp下载工具
如果想要打通FTP和HDFS文件互传,只要创建一个类,调用这两篇文章中的工具的接口就可以搞定,自己写的代码,实测有效。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/64287.html
摘要:伪分布模式在单节点上同时启动等个进程,模拟分布式运行的各个节点。完全分布式模式正常的集群,由多个各司其职的节点构成。在之前在集群中存在单点故障。正确的下载链接会有,这个就是公司需要用户在下载时提供的注册信息。每一次 Hadoop 生态的更新都是如此令人激动像是 hadoop3x 精简了内核,spark3 在调用 R 语言的 UDF 方面,速度提升了 40 倍所以该文章肯定得配备上最新的生态h...
摘要:总之,项目还算很受欢迎吧,这篇博客将介绍项目的升级版。一项目介绍将打包到镜像中,就可以快速地在单个机器上搭建集群,这样可以方便新手测试和学习。之前的版本使用为集群提供服务,由于网络功能更新,现在并不需要了。运行参考第二部分启动,并运行。 摘要: kiwenlau/hadoop-cluster-docker是去年参加Docker巨好玩比赛开发的,得了二等奖并赢了一块苹果手表,目前这个项目...
阅读 3529·2023-04-26 00:05
阅读 934·2021-11-11 16:55
阅读 3491·2021-09-26 09:46
阅读 3491·2019-08-30 15:56
阅读 890·2019-08-30 15:55
阅读 2913·2019-08-30 15:53
阅读 1915·2019-08-29 17:11
阅读 784·2019-08-29 16:52