在我们的集群中,dfs.block.size配置为128M,但是我已经看到很多文件,它们的大小为68.8M,这很奇怪。我对该配置选项究竟如何影响HDFS上的文件格式感到困惑。
但是情况与我的情况并不完全相符,这让我感到困惑。希望任何人都能给我一些见识。非常感谢。
文件可以小于块,在这种情况下,它不会占据文件系统中的整个块大小。阅读此答案: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/2700344,https://stackoverflow.com/a/38475807/2700344,Specify minimum number of generated files from Hive insert