在我们的集群中,dfs.block.size配置为128M,但是我已经看到很多文件,它们的大小为68.8M,这很奇怪。我一直对该配置选项究竟如何影响HDFS上的文件格式感到困惑。

  • 我要确保的第一件事是,理想情况下是否会归档已配置的块大小的所有大小?在这里,我的意思是理想地在一对一映射
  • 中归档和阻止
  • 如果文件本来不是很小的文件而是由MR作业生成的,那么这些小文件的可能原因是什么?
  • 要添加的另一点是,我们正在使用配置单元动态分区功能,但我不确定这是否是问题的根源。
    对于小文件的来源,我已经检查了此博客,但它是The small files Problem

  • 但是这种情况与我的情况并不完全相符,这让我感到困惑。
    希望有人能给我一些启示。非常感谢。

    最佳答案

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

    如果将Hive与动态分区负载一起使用,则reducer通常会生成较小的文件,每个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;
    

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

    您可以在分发中添加其他内容以创建更多文件(并运行更多reducer以获得更好的并行性)。阅读以下相关答案:https://stackoverflow.com/a/59890609/2700344https://stackoverflow.com/a/38475807/2700344Specify minimum number of generated files from Hive insert

    关于hadoop - HDFS:dfs.block.size的确切含义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61247008/

    10-16 16:42