我的项目中要求使用PySpark处理多个.txt消息文件。使用批处理将文件从本地目录移动到HDFS路径(hdfs:// messageDir / ..),对于每个批处理,我可以看到数千个.txt文件,它们的总大小约为100GB。几乎所有文件都小于1 MB。
我可以知道HDFS如何存储这些文件并执行拆分吗?因为每个文件都小于1 MB(小于64 / 128MB的HDFS块大小),所以我认为不会发生任何拆分,但是文件将被复制并存储在3个不同的数据节点中。
当我使用Spark使用* .txt之类的通配符匹配来读取HDFS目录(hdfs:// messageDir / ..)中的所有文件时,如下所示:-
rdd = sc.textFile('hdfs://messageDir/*.txt')
Spark如何读取文件并执行分区,因为HDFS对于这些小文件没有任何分区。
如果我的文件大小在一段时间内增加并每批获得1TB的小文件大小怎么办?有人可以告诉我如何处理吗?
答案 0 :(得分:2)
我认为您正在把事情混在一起。
您的文件位于HDFS中。在这里,块大小是重要的因素。根据您的配置,一个块通常具有64MB或128MB。因此,您的每个1MB文件在HDFS中占用64MB。这是很多未使用的空间。您可以将这些TXT文件合并在一起吗?否则,您将很快耗尽HDFS块。 HDFS不能存储大量小文件。
Spark可以从HDFS,Local,MySQL读取文件。它无法控制在那里使用的存储原理。当Spark使用RDD时,会将它们分区以将部分数据提供给工作人员。可以检查和控制分区的数量(使用重新分区)。对于HDFS读取,此数字由文件和块的数量定义。
关于SparkContext.textFile()如何处理HDFS上的分区和拆分,这里有一个很好的解释:How does Spark partition(ing) work on files in HDFS?
答案 1 :(得分:1)
即使文件很小,也可以从spark中读取。问题是HDFS。通常,HDFS块的大小确实很大(64MB,128MB或更大),因此,许多小文件占用了名称节点的开销。
如果要制作更大的文件,则需要优化reducer。写入文件的数量由将要写入的减速器数量决定。您可以使用合并或重新分区方法对其进行控制。
另一种方法是使合并文件的步骤更进一步。我编写了合并的spark应用程序代码。我将每个文件的目标记录大小放入,应用程序获取记录总数,然后可以估算出多少合并数。
您可以使用Hive或其他方式。