首页 > 解决方案 > HDFS 上大于块大小的文件不会分离

问题描述

我的HDFS块大小为256MB。我读取了一个大小为9.9GB的txt类型文件并使用spark将其转换为orc类型,并通过调用write方法将其大小缩小到1.29GB:

dataframe.coalesce(16).write.mode("overwrite")
.partitionBy("myDate").
orc("hdfs://myhost:9090/user/hive/warehouse/ods/data.orc")

我想当我在 HDFS UI 上查看结果并浏览文件时,data.orc目录下应该有 16 个文件,每个文件的大小小于块大小 256MB。但是,只有一个目录mydate=20210131,当我进入它时,只有一个 1.29GB 的文件,比块大小 256MB 大得多。

这种情况让我很困惑,谁能告诉我:

  1. 为什么一个 1.29 GB 的文件可以放入一个 256MB 的块中?我这里有什么误解吗?
  2. 为什么即使我调用了 coalesce(16) 来尝试将它们分成 16 个分区从而有 16 个文件,文件也没有分成更小的文件?
  3. 如果我的文件小于 256MB,比如 200MB,剩余的 56MB 会被系统重用吗?

标签: apache-sparkhdfs

解决方案


  1. 我已经对自己说清楚了,大于块大小的文件保存在多个块中,但 HDFS 上只有一个文件。
  2. 在本地模式下,只有一个执行程序,即驱动程序。我partiitonBy(mycol)在我的代码中调用了,只有所以列中只有一个值mycol,所以只有一个文件。
  3. 是的,未使用的空间不会被占用。

推荐阅读