HDFS:dfs.block.size的确切含义



在我们的集群中,dfs.block.size配置为128M,但我看到过不少文件的大小为68.8M,这是一个奇怪的大小。我一直困惑于这个配置选项到底是如何影响HDFS上的文件外观的。

  • 我想确定的第一件事是,理想情况下,文件的大小是否与已经配置的块大小相同?这里我指的是理想的一对一映射中的文件和块
  • 如果这些文件不是固有的小文件,而是由MR作业生成的,那么这些小文件的可能原因是什么
  • 需要补充的一点是,我们正在使用hive动态分区函数,我不确定这是否是问题的根源之一。关于小文件的来源,我已经查看了这个博客,但它是小文件问题

但情况与我的不太匹配,这让我仍然感到困惑。希望有人能给我一些见解。非常感谢。

文件可以小于块,在这种情况下,它不会占用文件系统中的整个块大小。阅读以下答案:https://stackoverflow.com/a/14109147/2700344

如果您使用的是动态分区加载的Hive,那么小文件通常是由每个都写入多个分区的reducer生成的。

insert overwrite table mytable partition(event_date)
select col1, col2, event_date 
from some_table;

例如,如果您运行上面的命令,并且上一步总共有200个reducer和20个不同的event_date分区,那么每个reducer将在每个分区中创建文件。它将产生200x20=4000个文件。

为什么会发生这种情况?由于数据在还原器之间随机分布,每个还原器接收所有分区数据并在每个分区中创建文件。

如果添加distribute by partition key

insert overwrite table mytable partition(event_date)
select col1, col2, event_date 
from some_table
distribute by event_date;

然后,上一个映射器步骤将根据分发者对数据进行分组,还原器将接收整个分区文件,并在每个分区文件夹中创建单个文件。

您可以向分发方式添加其他内容以创建更多的文件(并运行更多的减速器以获得更好的并行性(。阅读以下相关答案:https://stackoverflow.com/a/59890609/2700344,https://stackoverflow.com/a/38475807/2700344,指定从配置单元插入生成的最小文件数

最新更新