Apache spark 如何在Spark中处理非常小的文件

Apache spark 如何在Spark中处理非常小的文件,apache-spark,pyspark,hdfs,Apache Spark,Pyspark,Hdfs,我有大约60k的文件存储在HDFS中,每个文件大小在KB-4kb之间。 我试图通过对我知道的特定文件执行正则表达式搜索来处理它们,处理时间太长,而且似乎不正确 火花作业在纱线上运行 硬件规格:3个节点,每个节点有4个核心和15G RAM targeted_files = sc.broadcast(sc.textFile(doc).collect()) # 3 files #hdfs://hadoop.localdomain/path/to/directory/ contains ~60K fi

我有大约60k的文件存储在HDFS中,每个文件大小在KB-4kb之间。 我试图通过对我知道的特定文件执行正则表达式搜索来处理它们,处理时间太长,而且似乎不正确

火花作业在纱线上运行

硬件规格:3个节点,每个节点有4个核心和15G RAM

targeted_files = sc.broadcast(sc.textFile(doc).collect()) # 3 files

#hdfs://hadoop.localdomain/path/to/directory/ contains ~60K files
df = sc.wholeTextFiles(
    "hdfs://hadoop.localdomain/path/to/directory/").filter(
    lambda pairRDD: ntpath.basename(pairRDD[0]) in targeted_files.value)

print('Result : ', df.collect()) #when I run this step alone, took 15 mins to finish

df = df.map(filterMatchRegex).toDF(['file_name', 'result']) # this takes ~hour and still doesn't finish
将使用HDFS,此任务的spark是否正确? 我还认为,在最坏的情况下,处理时间将等于使用java的线程方法。。。我做错了什么

我遇到了解决相同问题的方法,但不确定如何在pyspark中处理它
从HDFS读取文件似乎花费了所有/大部分时间,有没有更好的方法来读取/存储小文件并使用spark处理它们?

老实说,spark的使用情况似乎不太合适。您的数据集非常小,60k*100k=6000 mB=6 GB,这是在一台机器上运行的原因。Spark和HDFS增加了处理的材料开销,因此“最坏情况”显然要比单台机器上的多线程方法慢。一般来说,在一台机器上并行(多线程)比在一组节点上并行(Spark)要快。

一般来说,在Hadoop设置中进行搜索的最佳工具是SOLR。
它针对搜索进行了优化,因此,尽管像spark这样的工具可以完成任务,但您永远不会期望类似的性能

加载后尝试
df.coalesce(20)
,以减少分区的数量并保持分区大小约为128MB。之后执行转换和操作

然而,它甚至还没有完成,我也不知道为什么SOLR会为多个文件提供并行处理?@exercismus SOLR确实是为大规模扩展而构建的,因此它肯定可以并行工作。然而,在回顾其他答案后,我还必须指出,如果您的总数据集只有几GB,那么使用多节点设置感觉有点奇怪。@exercismus还注意到,每当您想做一些事情时,solr不会从HDFS读取原始文件,这很可能是您遇到的瓶颈。这不会降低并行性吗?