1 block块
HDFS官方默认的值为:128m
如下图,我们可以计算下
134217728 / 1024 = 131072k
131072 / 1024 = 128m
比方说一个文件135m,那么会用下面的计算方式
135 % 128 = 1 余 7
先对128取模,得出1,余数为7;
那么在HDFS系统会有2个块,1个块128m,1个块7m。
举个例子:
有一碗水135ml,一个拼字的规格容量为128ml,要把这一碗水装到瓶子里,需要准备2个瓶子,一个瓶子装128ml,另外个瓶子实际装7ml
HDFS 系统的适应场景为大文件存储,小文件是致命的,为什么这么说呢
因为小文件会把NameNode(简称nn)撑爆
假设我们设定一个阀值30m,小于等于30m的就是小文件,nn节点维护的字节大约250个字节
如果现在我们的内存是4G,有1亿个小文件,我们计算下
1.计算4G是多少字节
4 * 1024 = 4096m
4096 * 1024 = 4194304k
4194304 * 1024 = 4294967296b
大约是42.9亿字节
2.一个文件nn节点需要250字节,1亿个小文件,就是需要250亿个字节
从上面的计算来看,nn需要的内存已超过4G内存
那么小文件我们处理的方式:
1.设定小文件的阀值
2.合并小文件,小文件的合并两种情况:
2.1 在数据未落到hdfs之前合并
2.2 数据已经落到hdfs,通过spark service 服务,每天调度去合并,不要今天去合并昨天的数据,根据自己的业务场景进行设置,如果3-5天之前的数据不会有什么变动了,那么可以设置成合并7天之前的数据
总结:小文件除了会撑爆nn,还会影响hive, spark的速度
2 副本数
生产上 副本一般就是官方默认参数3
比如我们上面刚刚那个例子
135 % 128 = 1 余 7
那么就会有3个128m的块,3个7m的块
题目:块大小128m,副本数3份,一个文件260m,请问多少块,多少实际存储?
260 % 128 = 2 余 4m
那么就是 3个块*3个副本 = 9个块
实际存储:260✖️3 =780m