【问题标题】:Process multiple small files of total size 100GB in HDFS在 HDFS 中处理多个总大小为 100GB 的小文件
【发布时间】:2018-10-21 06:12:49
【问题描述】:

我的项目需要使用 PySpark 处理多个 .txt 消息文件。使用批处理将文件从本地目录移动到 HDFS 路径 (hdfs://messageDir/..),对于每个批处理,我可以看到几千个 .txt 文件,它们的总大小约为 100GB。几乎所有文件都小于 1 MB。

我可以知道 HDFS 如何存储这些文件并执行拆分吗?因为每个文件都小于 1 MB(小于 64/128MB 的 HDFS 块大小),我认为不会发生任何拆分,但文件将被复制并存储在 3 个不同的数据节点中。

当我使用 Spark 读取 HDFS 目录 (hdfs://messageDir/..) 中的所有文件时,使用 *.txt 等通配符匹配如下:-

rdd = sc.textFile('hdfs://messageDir/*.txt')

Spark 是如何读取文件并执行 Partition 的,因为 HDFS 没有针对这些小文件的分区。

如果我的文件大小在一段时间内增加并且每批获得 1TB 的小文件量怎么办?有人可以告诉我如何处理吗?

【问题讨论】:

  • 好消息,你已经在那儿了!块大小是最小文件大小,因此每个 1 MB 文件至少需要 64-128 MB!然后我们添加副本!
  • 上传到 HDFS 之前没有压缩文件的原因是什么?
  • @cricket_007,是的,这是一种选择,但我想知道当有大量小文本文件时 Spark 的行为。
  • 显然会慢很多。每个文件都需要一个namenode请求
  • 但我假设所有文本文件都将被读取为一个 RDD,然后分区发生.. 我想更多地了解大块文件的 RDD 如何在后台执行分区

标签: apache-spark hdfs


【解决方案1】:

我觉得你有点搞混了。

  1. 您有文件位于 HDFS 中。在这里,Blocksize 是重要的因素。根据您的配置,一个块通常有 64MB 或 128MB。因此,每个 1MB 文件在 HDFS 中占用 64MB。这是非常多的未使用空间。您可以将这些 TXT 文件连接在一起吗?否则你会很快用完 HDFS 块。 HDFS 不是用来存储大量小文件的。

  2. Spark 可以从 HDFS、Local、MySQL 读取文件。它无法控制那里使用的存储原则。由于 Spark 使用 RDD,它们被分区以将部分数据提供给工作人员。可以检查和控制分区的数量(使用重新分区)。对于 HDFS 读取,这个数字由文件和块的数量定义。

这里有一个很好的解释 SparkContext.textFile() 如何处理 HDFS 上的分区和拆分:How does Spark partition(ing) work on files in HDFS?

【讨论】:

    【解决方案2】:

    即使文件很小,您也可以从 spark 中读取。问题是 HDFS。通常 HDFS 块的大小非常大(64MB、128MB 或更大),所以很多小文件会造成名称节点开销。

    如果你想制作更大的文件,你需要优化reducer。写入文件的数量取决于要写入的 reducer 的数量。你可以使用coalesce或者repartition的方法来控制它。

    另一种方法是多一步合并文件。我编写了合并的 Spark 应用程序代码。我把每个文件的目标记录大小,应用程序得到记录总数,然后可以估计有多少合并。

    您可以使用 Hive 或其他方式。

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多