Apache spark 在HDFS中处理多个总大小为100GB的小文件

Apache spark 在HDFS中处理多个总大小为100GB的小文件,apache-spark,hdfs,Apache Spark,Hdfs,在我的项目中,我需要使用PySpark处理多个.txt消息文件。文件从本地目录移动到HDFS路径(hdfs://messageDir/..)使用批处理和每个批处理,我可以看到几千个.txt文件,它们的总大小约为100GB。几乎所有的文件都小于1MB 我可以知道HDFS如何存储这些文件并执行拆分吗?因为每个文件都小于1 MB(小于64/128MB的HDFS块大小),所以我认为不会发生任何拆分,但文件将被复制并存储在3个不同的数据节点中 当我使用Spark读取HDFS目录中的所有文件时(hdfs:/

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

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

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

rdd = sc.textFile('hdfs://messageDir/*.txt')
Spark如何读取文件并执行分区,因为HDFS没有用于这些小文件的任何分区


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

我觉得你把事情弄混了

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

  • Spark可以从HDFS、本地、MySQL读取文件。它无法控制此处使用的存储原则。由于Spark使用RDD,因此会对它们进行分区,以便将部分数据提供给工作人员。可以检查和控制分区的数量(使用重新分区)。对于HDFS读取,该数字由文件和块的数量定义


  • 下面是关于SparkContext.textFile()如何在HDFS上处理分区和拆分的一个很好的解释:

    我认为您有点混淆了

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

  • Spark可以从HDFS、本地、MySQL读取文件。它无法控制此处使用的存储原则。由于Spark使用RDD,因此会对它们进行分区,以便将部分数据提供给工作人员。可以检查和控制分区的数量(使用重新分区)。对于HDFS读取,该数字由文件和块的数量定义


  • 下面是SparkContext.textFile()如何在HDFS上处理分区和拆分的一个很好的解释:

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

    如果你想制作更大的文件,你需要优化reducer。写入文件的数量由reducer将写入的数量决定。您可以使用合并或重新分区方法来控制它

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


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

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

    如果你想制作更大的文件,你需要优化reducer。写入文件的数量由reducer将写入的数量决定。您可以使用合并或重新分区方法来控制它

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


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

    好消息,您已经在那里了!块大小是最小文件大小,因此每个1MB文件至少需要64-128MB!然后我们添加复制品!你在上传到HDFS之前没有压缩文件有什么原因吗?@cricket_007,是的,这是一个选项,但我想知道当有大量小文本文件时Spark的行为。它显然会慢得多。每个文件都需要一个namenode请求,但我假设所有文本文件都将作为一个RDD读取,然后进行分区。。我想更多地了解一大块文件的RDD是如何在这种情况下执行分区的好消息,你已经做到了!块大小是最小文件大小,因此每个1MB文件至少需要64-128MB!然后我们添加复制品!你在上传到HDFS之前没有压缩文件有什么原因吗?@cricket_007,是的,这是一个选项,但我想知道当有大量小文本文件时Spark的行为。它显然会慢得多。每个文件都需要一个namenode请求,但我假设所有文本文件都将作为一个RDD读取,然后进行分区。。我想了解更多关于大块文件的RDD是如何在引擎盖下执行分区的