FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式)
1、問題:將ftp文件服務器上的壓縮文件通過內存流直接寫入HDFS內,卻發現文件不一致,MD5SUM校驗也不一致。
2、分析:
FTP的傳輸有兩種方式:ASCII傳輸模式和二進制數據傳輸模式。
1)ASCII傳輸方式?:假定用戶正在拷貝的文件包含的簡單ASCII碼文本,如果在遠程機器上運行的不是UNIX,當文件傳輸時ftp通常會自動地調整文件的內容以便于把文件解釋成另外那臺計算機存儲文本文件的格式。但是常常有這樣的情況,用戶正在傳輸的文件包含的不是文本文件,它們可能是程序、數據庫字處理文件或者壓縮文件(盡管字處理文件包含的大部分是文本,其中也包含有指示頁尺寸,字庫等信息的非打印字符)。在拷貝任何非文本文件之前,用binary?命令告訴ftp逐字拷貝,不要對這些文件進行處理,要用二進制傳輸。
2)二進制傳輸模式?:在二進制傳輸中,保存文件的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的文件是沒意義的。例如macintosh以二進制方式傳送可執行文件到IBM VM系統,在對方系統上,此文件不能執行。(但是,它可以從VM系統上以二進制方式拷貝到另一macintosh,是可以執行的)。
如果你在ASCII方式下傳輸二進制文件,即使不需要也仍會轉譯。這會使傳輸稍微變慢?,也會損壞數據,使文件變得不能用。(在大多數計算機上,ASCII方式一般假設每一字符的第一有效位無意義,因為ASCII字符組合不使用它。如果你傳輸二進制文件,所有的位都是重要的。)如果你知道這兩臺機器是同樣的,則二進制方式對文本文件和數據文件都是有效的。
因此,這就意謂著知道你要傳輸的是什么類型的數據是重要的,下表給出一些常見文件類型的提示。
?常見文件類型
| ?????文??????????件 | ??????方??????????式 |
| Text file Spreadsheet Database file Word processor file Program source code Electronic mail messages UNIX“shell archive” UNIX“tar file” backup file Compressed file Unencoded file Excutable file Postscript file | ASCII 大多是二進制 大多是二進制,也可能是ASCII 大多是二進制,也可能是ASCII ASCII ASCII ASCII 二進制 二進制 二進制 ASCII 二進制 二進制 |
很多數據庫程序用二進制格式存貯數據,即使數據原本是文本式。所以,除非你知道你的軟件的用途,我們建議對數據庫文件先用二進制方式試試。然后看看你傳輸的文件能否正確工作。如果不能,再試用另一方式。可執行的文件一般是二進制文件。
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();} } } }
總結
以上是生活随笔為你收集整理的FTP压缩文件上传到HDFS大小不一致的问题说明(FTP传输模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【正一专栏】爱是一种信仰
- 下一篇: linux查看服务器设备信息命令dmid