日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式)

發(fā)布時間:2025/4/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、問題:將ftp文件服務器上的壓縮文件通過內(nèi)存流直接寫入HDFS內(nèi),卻發(fā)現(xiàn)文件不一致,MD5SUM校驗也不一致。

2、分析:

FTP的傳輸有兩種方式:ASCII傳輸模式和二進制數(shù)據(jù)傳輸模式。

1)ASCII傳輸方式?:假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調(diào)整文件的內(nèi)容以便于把文件解釋成另外那臺計算機存儲文本文件的格式。但是常常有這樣的情況,用戶正在傳輸?shù)奈募牟皇俏谋疚募?#xff0c;它們可能是程序、數(shù)據(jù)庫字處理文件或者壓縮文件(盡管字處理文件包含的大部分是文本,其中也包含有指示頁尺寸,字庫等信息的非打印字符)。在拷貝任何非文本文件之前,用binary?命令告訴ftp逐字拷貝,不要對這些文件進行處理,要用二進制傳輸。

2)二進制傳輸模式?:在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如macintosh以二進制方式傳送可執(zhí)行文件到IBM VM系統(tǒng),在對方系統(tǒng)上,此文件不能執(zhí)行。(但是,它可以從VM系統(tǒng)上以二進制方式拷貝到另一macintosh,是可以執(zhí)行的)。

如果你在ASCII方式下傳輸二進制文件,即使不需要也仍會轉(zhuǎn)譯。這會使傳輸稍微變慢?,也會損壞數(shù)據(jù),使文件變得不能用。(在大多數(shù)計算機上,ASCII方式一般假設每一字符的第一有效位無意義,因為ASCII字符組合不使用它。如果你傳輸二進制文件,所有的位都是重要的。)如果你知道這兩臺機器是同樣的,則二進制方式對文本文件和數(shù)據(jù)文件都是有效的。

因此,這就意謂著知道你要傳輸?shù)氖鞘裁搭愋偷臄?shù)據(jù)是重要的,下表給出一些常見文件類型的提示。

?常見文件類型

???????????????

????????????????

Text file

Spreadsheet

Database file

Word processor file

Program source code

Electronic mail messages

UNIXshell archive

UNIXtar file

backup file

Compressed file

Unencoded file

Excutable file

Postscript file

ASCII

大多是二進制

大多是二進制,也可能是ASCII

大多是二進制,也可能是ASCII

ASCII

ASCII

ASCII

二進制

二進制

二進制

ASCII

二進制

二進制

很多數(shù)據(jù)庫程序用二進制格式存貯數(shù)據(jù),即使數(shù)據(jù)原本是文本式。所以,除非你知道你的軟件的用途,我們建議對數(shù)據(jù)庫文件先用二進制方式試試。然后看看你傳輸?shù)奈募芊裾_工作。如果不能,再試用另一方式。可執(zhí)行的文件一般是二進制文件。


3、解決:上文可以理解壓縮文件FTP傳輸要用二進制,代碼參考如下:

package ct.dpi;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IOUtils;public class DPIFtp {public static void main(String[] args) throws IOException { FTPClient ftp = new FTPClient();Configuration conf = new Configuration();FileSystem fs = FileSystem.get(conf);InputStream ftpInputStream = null;OutputStream hdfsOutStream = null;try { ftp.connect("IP", 21); //url和port ftp.login("name","pwd"); //name和passwordint reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); return ;} ftp.setFileType(FTP.BINARY_FILE_TYPE);//壓縮文件二進制傳輸//ftp.setFileType(FTP.ASCII_FILE_TYPE);//ASCII文件傳輸String remotePath="/GZ/20170420/00/";//文件目錄String filename="JTBY+0x01+0x0300+000+M-GD-GZ+AT+597+20170420005942.tar.gz";//文件ftp.changeWorkingDirectory(remotePath);ftpInputStream = ftp.retrieveFileStream(filename);//讀取/ftp文件String ouputFile = "/user/fjs/" + filename;//hdfs存放文件路勁和名字hdfsOutStream = fs.create(new Path(ouputFile));IOUtils.copyBytes(ftpInputStream, hdfsOutStream, 1024*1024,true);//遷移hdfsOutStream.flush();ftp.logout(); ftpInputStream.close();hdfsOutStream.close();} catch (IOException e) { System.err.println(e.getMessage());} finally { try { if (ftp.isConnected()) { ftp.disconnect(); } if(hdfsOutStream!=null){hdfsOutStream.close();}if(ftpInputStream!=null){ftpInputStream.close();}} catch (IOException ioe) {ioe.printStackTrace();} } } }

總結(jié)

以上是生活随笔為你收集整理的FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。