一、HDFS的blocksize
HDFS中的DataNode负责存储具体的数据,NameNode则负责维护数据的元数据包括文件目录树、访问权限等,因此HDFS不适合存储大量小文件。
1.1 分块存储
DataNode上存储的文件是按照block(块)为单位进行存储的,即:如果一个文件的size大于blocksize,那么该文件会被拆分存储在不同的block中。
1.2 blocksize默认值
- 在Hadoop 1.X版本中,默认blocksize为64MB;
- 在Hadoop 2.X版本中,默认blocksize为128MB;
1.3 修改blocksize
blocksize可以通过配置项dfs.blocksize进行设置,可以在hdfs-site.xml中添加该配置项,或者在代码中修改,比如:
import org.apache.hadoop.conf.Configuration;
Configuration conf = new Configuration();
conf.set("dfs.blocksize", "256M");
二、HDFS的blocksize的大小对性能的影响分析
2.1 blocksize不宜设置过小
一般磁盘block大小为512B,blocksize通常要设置的远大于该值,目的在于减小磁盘寻道时间,使得数据传输时间占据总时间的绝大部分,而磁盘寻道时间占据很小部分,比如1%;
如果文件较大的话,比如1T,那么通常blocksize不使用默认的64M或者128M,因为:
该文件所需要的block数量:1T/128M=1024*1024M/128M=8096
MapReduce的map任务中通常一次只处理一个块中数据(切片大小默认等于block大小)
那么就存在8096个map任务,map任务个数太多影响处理效率(mapreduce 中的 `map 和 reduce 都是 jvm 进程,每次启动都需要重新申请资源,启动时间大概1s`;想象一下如果是8096个block,那么单独启动map进程事件就需要8096秒,非常`影响效率`)。
这时候就需要将blocksize设置更大些,比如512M。
2.2 blocksize不宜设置过大
同样以1T的文件为例,如果将blocksize设置为128G,那么:
该文件所需要的block数量:1T/128G=1024G/128G=8
那么就存在8个map任务(如果小于计算节点数量),map任务个数太少,集群资源无法充分利用,影响处理效率。
综上所述,HDFS的blocksize需要根据实际业务数据的大小进行调整,过大过小都不合适。
参考:https://blog.csdn.net/qq_26442553/article/details/79117897
网友评论