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有所帮助。
请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!