如何在 Spark 中处理非常小的文件
Posted
技术标签:
【中文标题】如何在 Spark 中处理非常小的文件【英文标题】:How to process very small files in Spark 【发布时间】:2019-07-31 13:38:57 【问题描述】:我在 HDFS 中存储了大约 60k 个文件,每个文件大小在千字节 4kb-70kb 的范围内。 我正在尝试通过对我知道的特定文件执行正则表达式搜索来处理它们,处理时间太长,而且似乎不对...
火花作业在纱线上运行
硬件规格: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 的线程方法......我做错了什么?
我遇到了this link,它解决了同样的问题,但不确定如何在 pyspark 中处理它 从 HDFS 读取文件似乎花费了所有/大部分时间,有没有更好的方法来读取/存储小文件并使用 spark 处理它们?
【问题讨论】:
【参考方案1】:老实说,这似乎不是 spark 的正确用例。您的数据集非常小,60k * 100k = 6 000 mB = 6 GB,这是在单台机器上运行的原因。 Spark 和 HDFS 为处理增加了材料开销,因此“最坏的情况”显然比单台机器上的多线程方法要慢。一般来说,单台机器上的并行化(多线程)会比节点集群上的并行化(Spark)更快
【讨论】:
然而,它甚至没有完成,我不知道为什么【参考方案2】:一般来说,在 Hadoop 设置中进行搜索的最佳工具是 SOLR。 它针对搜索进行了优化,因此尽管像 spark 这样的工具可以完成工作,但您永远不会期望类似的性能。
【讨论】:
SOLR 会为多个文件提供并行处理吗? @Exorcismus SOLR 确实是为大规模扩展而构建的,因此它当然可以并行工作。但是,在查看其他答案后,我还必须说,如果您的总数据集只有几 GB,使用多节点设置感觉有点奇怪。 @Exorcismus 另请注意,当您想做某事时,solr 不会从 HDFS 读取原始文件,这很可能是您遇到的瓶颈。【参考方案3】:在加载后尝试df.coalesce(20)
以减少分区数量并保持其大小约为~128MB。之后执行转换和操作。
【讨论】:
这不会降低并行度吗?以上是关于如何在 Spark 中处理非常小的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spark Streaming 中使用基于数据集的转换?
如何选择Apache Spark和Apache Flink?