分享

HDFS中数据块和文件大小的关系?

qz2003 发表于 2013-10-25 10:45:43 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 22718
我测试环境是一个namenode和一个datanode
我将本地文件复制到HDFS中(Hadoop  0.19.1 版本),查看HDFS中的数据块,发现了如下的事实:
(1)我上传本地的一个目录smallfiles(目录中包含3个小文件,均小于64M),datanode上使用命令复制本地数据到HDFS
bin/hadoop  dfs   -copyFromLocal   smallfiles   smallfiles
我发现在datanode上的
/home/nutch/nutchinstall/filesystem
/data/
current
目录下生成了3个数据块,而且每个块的内容对应3个小文件的内容。
目录
[color=]/home/nutch/nutchinstall/filesystem/data/
是hadoop-site.xml中的参数dfs.data.dir的值

   
dfs.data.dir
   
     
/home/nutch/nutchinstall/filesystem/data
  
      

(2)我上传一个78M的文件到HDFS中,发现在
[color=]/home/nutch/nutchinstall/filesystem/data/
current
目录下生成了两个数据块,一个是64M,一个是14M

这是不是说明 如果上传的文件小于64M,它就直接存储到一个数据块中呢吗?只有文件大于64M时它才进行切割成块呢吗?
如果是这样的话,假若上传了很多小文件,那岂不是要生成很多的数据块啊吗?

已有(1)人评论

跳转到指定楼层
mexiang 发表于 2013-10-25 10:45:43
本帖最后由 nettman 于 2014-6-2 16:55 编辑
自己解决,看了Spork的一篇文章,明了了,
 HDFS也有块(Block)的概念,但它的块是一个很大的单元,默认是64MB。像硬盘中的文件系统一样,在HDFS中的文件将会按块大小进行分解,并作为独立的单元进行存储。但和硬盘中的文件系统不一样的是,存储在块中的一个比块小的文件并不会占据一个块大小的硬盘物理空间(HDFS中一个块只存储一个文件的内容)。
  那为什么HDFS中的块如此之大呢?
  HDFS的块之所以这么大,主要原因就是为了把寻道(Seek)时间最小化。如果一个块足够大,那么从硬盘传输数据的时间将远远大于寻找块的起始位置的时间。这样就使得HDFS的数据传输速度和硬盘的传输速度更加接近。
让我们来个简单的计算,假设寻道时间大约为10ms,传输速度为100MB/s。为了使得寻道时间仅为传输时间的1%,我们就需要设置块的大小为100MB。尽管很多应用的HDFS使用128MB的块,但默认的大小是64MB,这个参数将随着新一代硬盘速度的增长而增长。
  虽然大块有一定好处,但也不能太大。MR中的Map tasks一般一次只处理一个块,所以如果你的tasks太少了(少于你集群中的节点数),相对于设置较小块的Jobs来说,你的Jobs将会运行得比较慢。




“ HDFS有块(Block)的概念,但它的块是一个很大的单元,默认是64MB。像硬盘中的文件系统一样,在HDFS中的文件将会按块大小进行分解,并作为独立的单元进行存储。但
和硬盘中的文件系统不一样的是,存储在块中的一个比块小的文件并不会占据一个块大小的硬盘物理空间

HDFS中一个块只存储一个文件的内容
)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条