是否允许使用合并或重新分区在 HDFS 中合并小文件(但合并后会很大)?

Is it allowed to merge small files(but will be large when merged) in HDFS by using coalesce or repartition?

我正在使用 hdfs-sink-connector 将 Kafka 的数据消耗到 HDFS 中。

Kafka连接器每10分钟写入一次数据,有时写入的文件非常小;它从 2MB 到 100MB 不等。因此,写入的文件实际上浪费了我的 HDFS 存储空间,因为每个块大小为 256MB。

目录按日期创建;所以我想知道每天批量将许多小文件合并成一个大文件会很棒。 (我预计HDFS会因此自动将一个大文件分成块大小。)

我知道有很多答案说我们可以使用 spark 的 coalesce(1)repartition(1),但我担心如果我读取整个目录并使用这些函数会出现 OOM 错误;如果我把每个文件都读一遍,可能会超过90GB~100GB

HDFS 中是否允许 90~100GB?我不需要担心吗? 谁能告诉我是否有合并小型 HDFS 文件的最佳实践?谢谢!

So, the written files actually waste my HDFS storage since each block size is 256MB.

HDFS 不会“填充”块中未使用的部分。因此,一个 2MB 的文件仅使用 2MB 的磁盘空间(好吧,如果考虑 3 倍复制,则为 6MB)。 HDFS 上小文件的主要问题是数十亿个小文件可能会导致问题。

I worried about OOM error if I read the whole directory and use those functions

Spark 可能是一个 in-memory 处理框架,但如果数据不适合内存,它仍然可以工作。在这种情况下,处理会溢出到磁盘上并且会慢一点。

Will 90~100GB in HDFS be allowed?

这绝对没问题 - 毕竟这是大数据。正如您所指出的,实际文件将在后台拆分为更小的块(但除非您使用 hadoop fsck,否则您不会看到它)。