一.block块的概念
Block块大小的默认参数:dfs.blocksize 默认128M
理解一:
假如一桶水1000 ml, 瓶子规格 100ml ==》 需要10瓶子
一桶水1010 ml, 瓶子规格 100ml ==》 需要10+1=11瓶子
假如瓶子规格200ml ==》需要 5+1 =6瓶子
理解二:
假如一个小电影260M,根据block块大小的默认参数dfs.blocksize分为:
第一个块128M;第二个块128M;第三个块 4M。总共三个块。
对于伪分布式来讲,1个小弟DN节点, 副本数(dfs.replication) 1 ,共3个块,实际存储空间是260M*1=260M。
但是对于集群来讲,3个小弟DN节点,副本数(dfs.replication)设置为3(默认值是连它自己复制3份) ,共3*3=9个块,实际存储空间是260M*3=780M 【注意】!!!此时不是128M*3*3哟,128M*3*3是错误的!!!因为第三个块并没有装满,而且不能把128M*3作为实际的存储空间,因为绝对不能够平白无故产生数据。
【考点】存储空间=文件大小*其副本数
对于老大Namenode维护的是元数据,元数据是指文件名称、路径、权限、被切割哪些块,这些块分布在哪些机器上。
【面试题】假设有1亿个小文件,每个小文件10KB(没有达到128M规格,一个文件就是一个块),对于集群3个DN节点,副本数为3 , 那么共1亿block块*3=3亿块。那么3亿个块,即Namenode就需要维护3亿条数据。
假设1亿个小文件,每个小文件10KB,在生产上把这些小文件合并为100万个100M的大文件,对于集群3 DN节点,副本数为3 ,那么此时100百万*3=3百万块,即Namenode只需要维护3百万条数据。
问:Namenode维护3亿条数据和3百万条数据的压力,谁轻松?
答:肯定是维护300万条数据更轻松。因为元数据是存储在namenode进程的内存里,内存是一定的。比如内存8G,三亿条数据可能撑爆,而三百万少了两个数量级。
但是实际生产中基本都是小文件,在业务关系型数据源中,同步很难解决小文件(基本上不可能达到128M);而日志型数据源(flume)、计算结果(spark coalesce),我们可以控制小文件。
所以生产上: 尽量规避小文件在HDFS的存储
第一步:数据在传输到hdfs之前,提前合并
第二步:数据已经到了hdfs,就定