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传输模式)相关推荐

  1. 文件上传到ftp服务器大小变小,ftp服务器文件上传大小设置

    ftp服务器文件上传大小设置 内容精选 换一换 文件选择上传控件,用于上传文件. Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1G ...

  2. php从ftp下载文件到本地,php使用ftp实现文件上传与下载功能

    本文实例为大家分享了php ftp文件上传与下载的具体代码,供大家参考,具体内容如下 ftp文件上传 php自带有ftp操作的函数包,一个比较简单实现的ftp文件上传操作可以通过以下几个步骤来完成: ...

  3. JavaScript实现限制文件上传类型和大小

    JavaScript实现限制文件上传类型和大小 <title>文件上传前台控制检测程序 v0.6</title> <style>body,td {font-size ...

  4. 大数据之 将txt文件上传到HDFS并用Hive查询

    在生产上,一般对数据清洗之后直接放到HDFS上,再将目录加载到分区表中,之后通过hive去查询分析数据: 1.准备数据 order_created.txt 用 tab分割 10703007267488 ...

  5. 通过Java程序将“/你的名字拼音缩写/input1/shixun1.txt”文件上传到HDFS的“/你的名字拼音缩写/java/input1/”目录下;通过Java程序将HDFS上的“/你的名字拼音

    题目: 通过Java程序将"/你的名字拼音缩写/input1/shixun1.txt"文件上传到HDFS的"/你的名字拼音缩写/java/input1/"目录下 ...

  6. Jquery Uploadify插件+Servlet解决FTP多文件上传

    这个小程序的起因是老大让我做一个Adobe LiveCycle的外围小程序,附件要随着工作流一起流转用于每级用户审批作为参考.我用.Net2个小时搞完了,被老大通知这个必须用JAVA做-.-无奈之下搞 ...

  7. linux 登陆ftp及文件上传及下载

    1.      Linux 终端连接FTP [oracle@Dave ~]$ ftp 10.85.7.97 Connected to 10.85.7.97. 220 Serv-U FTP Server ...

  8. c# FTP服务器文件上传下载等操作

    文章目录 判断FTP连接 FTP文件上传 FTP文件下载 删除指定FTP文件 删除指定FTP文件夹 获取FTP上文件夹/文件列表 创建文件夹 获取指定FTP文件大小 更改指定FTP文件名称 移动指定F ...

  9. Struts2文件上传超出配置大小的解决办法

    用Struts2做一个文件上传来着,本来是想写个验证方法来限制文件大小的,结果发现根本走不到我的验证方法就开始报异常了: THE REQUEST WAS REJECTED BECAUSE ITS SI ...

最新文章

  1. 【编程开发】Python隐藏属性——使用双下划线标识私有属性,外部不可直接访问...
  2. SpringBoot文件上传源码解析
  3. python try语句各种格式输出_python如何写try语句
  4. halcon模板匹配学习(一) Matching 初印象
  5. 听了一堂《**学院》的课,我也是醉了
  6. webusercontrol ajax,ASP.NET页面使用AjaxPro2完成JS调用后台方法
  7. lcd4linux 1602,详解一种LCD1602 的4线接法
  8. 唯美动态个人404错误页面html源码
  9. 用c语言编程图书管理系统,C语言图书管理系统简洁版
  10. matlab disp输出换行,matlab输出语句disp
  11. linux V4L2子系统——v4l2架构(5)之v4l2_device与v4l2_subdev异步机制
  12. python 按规则拆分文件_python实现按行分割文件
  13. oracle t7 1,Oracle SPARC t7-1服务器介绍及配置参数
  14. JavaScript的三座大山--(2)--作用域和闭包
  15. 纪念谢尔盖·科尔塔科夫
  16. 海信android4.4.2电视怎么投屏,海信电视怎么投屏
  17. 单片机硬件和软件延时是啥意思?
  18. 《校园墙》小程序可行性分析
  19. seatunnel 高性能分布式数据集成平台
  20. 五中高考的成绩单2021查询,北京五中高考成绩解读

热门文章

  1. python 新建文件 hdfs_大数据学习(六):Python操作hdfs(包括追加数据文件到hdfs文件)...
  2. jQuery-处理class属性
  3. javascript的函数定义的区别
  4. 脐带血要不要保存?看了你就明白!
  5. Android应用---基于NDK的samples例程hello-jni学习NDK开发
  6. WINCE6.0下开始菜单的“挂起(suspend)”是否可见及阻止系统进入睡眠模式
  7. python中str和int区别_Python如何比较string和int?
  8. TypeScript基础入门 - 函数 - 简介
  9. 前端架构之移动端混合架构(hybrid)
  10. 并发编程之 Java 内存模型 + volatile 关键字 + Happen-Before 规则