专家,
我们可能会看到我们的块计数在我们的hadoop集群中增长。 "太多"块会产生一些后果,例如数据节点的堆需求增加,执行速度下降,GC更多等。当块数超过某个阈值时,我们应该注意#34;
其他有趣的相关问题:
高块数表示什么? 一个。太多的小文件? 湾用完了? 是(a)还是(b)?如何区分两者?
什么是小文件?一个大小小于块大小的文件(dfs.blocksize)?
每个文件是否在磁盘上占用新数据块?或者是与新文件关联的元数据是问题吗?
效果更多是GC,降低执行速度等。如何量化"高块数的影响?
提前感谢
答案 0 :(得分:1)
您的第一个假设是错误的,因为数据节点不在内存中维护数据文件结构,所以Name节点的工作是跟踪内存中的文件系统(重复出现在INode中)。因此,小文件实际上会导致您的Name节点更快地耗尽内存(因为需要更多的元数据来表示相同数量的数据),并且因为每个块创建Mapper所以会影响执行速度。
hadoop fs -du -s -h
。如果您看到第一个值(表示所有文件的平均文件大小)远小于配置的块大小,那么您将面临小文件的问题。要检查您是否空间不足:hadoop fs -df -h
答案 1 :(得分:1)
感谢大家的投入。我对这个主题做了一些研究并分享了我的发现。
为什么呢? 经验法则:对于1M块,1gb,Cloudera [1]
namenode所需的实际堆内存量实际上要低得多。 堆需要=(块数+ inode(文件+文件夹))x对象大小(150-300字节[1])
对于100万小文件:需要堆=(1M + 1M)x 300b = 572mb <= =比经验法则小得多。
例如, http://namenode:50070/dfshealth.html#tab-overview 9,847,555个文件和目录,6,827,152个块= 16,674,707个总文件系统对象。 堆内存使用5.82 GB的15.85 GB堆内存。最大堆内存为15.85 GB。
**注意,使用的堆内存仍然高于16,674,707个对象x 300个字节= 4.65gb
要查找小文件,请执行 hdfs fsck -blocks | grep“总块数(已验证):” 它会返回类似于: 总块数(已验证):2402(平均块大小325594 B)&lt; ==小于1mb
对名称和数据节点的影响: 小文件会对名称节点和数据节点造成问题: 名称节点: - 在文件数量上拉下限,因为它需要保留内存中每个文件的元数据 - 重启的时间很长,因为它必须从本地磁盘上的缓存中读取每个文件的元数据
数据节点: - 大量的小文件意味着大量的随机磁盘IO。 HDFS专为大型文件而设计,并受益于顺序读取。
[1] https://www.cloudera.com/documentation/enterprise/5-8-x/topics/admin_nn_memory_config.html