java实现将ftp和http的文件直接传送到hdfs
之前实现了使用流来讲http和ftp的文件下载到本地,也实现了将本地文件上传到hdfs上,那现在就可以做到将
ftp和http的文件转移到hdfs上了,而不用先将ftp和http的文件拷贝到本地再上传到hdfs上了。其实这个东西的原理
很简单,就是使用流,将ftp或http的文件读入到流中,然后将流中的内容传送到hdfs上,这样子就不用让数据存到
本地的硬盘上了,只是让内存来完成这个转移的过程,希望这个工具,能够帮到有这样需求的同学~
这里先附上之前的几个工具的链接:
http工具
ftp工具
链接描述
代码如下:
importjava.io.InputStream; importjava.io.OutputStream; importjava.io.IOException; publicclassFileTrans{ privateStringhead=""; privateStringhostname=""; privateStringFilePath=""; privateStringhdfsFilePath=""; privateHDFSUtilhdfsutil=null; privateFtpClientftp; privateHttpUtilhttp; publicvoidsetFilePath(StringFilePath){ this.FilePath=FilePath; } publicStringgetFilePath(StringFilePath){ returnthis.FilePath; } publicvoidsethdfsFilePath(StringhdfsFilePath){ this.hdfsFilePath=hdfsFilePath; } publicStringgethdfsFilePath(StringhdfsFilePath){ returnthis.hdfsFilePath; } publicvoidsetHostName(Stringhostname){ this.hostname=hostname; } publicStringgetHostName(){ returnthis.hostname; } publicvoidsetHead(Stringhead){ this.head=head; } publicStringgetHead(){ returnthis.head; } publicFileTrans(Stringhead,Stringhostname,Stringfilepath,Stringhdfsnode,StringhdfsFilepath){ this.head=head; this.hostname=hostname; this.FilePath=filepath; this.hdfsFilePath=hdfsFilepath; if(head.equals("ftp")&&hostname!=""){ this.ftp=newFtpClient(this.hostname); } if((head.equals("http")||head.equals("https"))&&hostname!=""){ Stringhttpurl=head+"://"+hostname+"/"+filepath; this.http=newHttpUtil(httpurl); } if(hdfsnode!=""){ this.hdfsutil=newHDFSUtil(hdfsnode); } this.hdfsutil.setHdfsPath(this.hdfsFilePath); this.hdfsutil.setFilePath(hdfsutil.getHdfsNode()+hdfsutil.getHdfsPath()); this.hdfsutil.setHadoopSite("./hadoop-site.xml"); this.hdfsutil.setHadoopDefault("./hadoop-default.xml"); this.hdfsutil.setConfigure(false); } publicstaticvoidmain(String[]args)throwsIOException{ Stringhead=""; Stringhostname=""; Stringfilepath=""; Stringhdfsfilepath=""; Stringhdfsnode=""; Stringlocalpath=""; InputStreaminStream=null; intsamplelines=0; try{ head=args[0];//远端服务器类型,http还是ftp hostname=args[1];//远端服务器hostname filepath=args[2];//远端文件路径 hdfsnode=args[3];//hdfs的机器名,不带hdfs开头 hdfsfilepath=args[4];//hdfs的文件路径 localpath=args[5];//如果需要在本地保存一份的话,输入本地的路径,不保存,传入空格或者samplelines传入0 samplelines=Integer.parseInt(args[6]);//保存在本地的话,保存前N行,如果不保存,填0 }catch(Exceptione){ System.out.println("[FileTrans]:inputargserror!"); e.printStackTrace(); } FileTransfiletrans=newFileTrans(head,hostname,filepath,hdfsnode,hdfsfilepath); if(filetrans==null){ System.out.println("filetransnull"); return; } if(filetrans.ftp==null&&head.equals("ftp")){ System.out.println("filetransftpnull"); return; } if(filetrans.http==null&&(head.equals("http")||head.equals("https"))){ System.out.println("filetransftpnull"); return; } try{ if(head.equals("ftp")){ inStream=filetrans.ftp.getStream(filepath); if(samplelines>0){ filetrans.ftp.writeStream(inStream,localpath,samplelines); } } else{ inStream=filetrans.http.getStream(head+"://"+hostname+"/"+filepath); if(samplelines>0){ filetrans.http.downLoad(head+"://"+hostname+"/"+filepath,localpath,samplelines); } } filetrans.hdfsutil.upLoad(inStream,filetrans.hdfsutil.getFilePath()); if(head=="ftp"){ filetrans.ftp.disconnect(); } }catch(IOExceptione){ System.out.println("[FileTrans]:filetransfailed!"); e.printStackTrace(); } System.out.println("[FileTrans]:filetranssuccess!"); } }
编译有问题的话,在hadoop工具的那篇文章中有提到,可以参考
注:最好将其他三个工具的文件放在同一个目录下,如果不放在一起,那么请自行引用
这个工具既可以将ftp或者http转移到hdfs,也能将前N行保存到本地,进行分析
以上就是本文所述的全部内容了,希望能够对大家学习java有所帮助。
请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!