分发 Python 模块 - Spark 与进程池

Distributing Python module - Spark vs Process Pools

我制作了一个 Python 模块,可以从 PDF 中提取手写文本。提取有时会很慢(每个文件 20-30 秒)。我有大约 100,000 个 PDF(有些有很多页),我想 运行 对所有这些文件进行文本提取。本质上是这样的:

fileNameList = ['file1.pdf','file2.pdf',...,'file100000.pdf']

for pdf in fileList:
    text = myModule.extractText(pdf) # Distribute this function
    # Do stuff with text

我们以前使用过一次 Spark(一个同事,不是我)将 SQL 数据库中的几百万个文件的索引分布到几台服务器上的 Solr 中,但是在研究这个时,似乎 Spark 更适合并行化大型数据集,而不是分配单个任务。为此,看起来 Python 的内置 'Process Pools' 模块会更好,我可以 运行 在具有 4 CPU 个核心的单个服务器上。

我知道 SO 更适用于特定问题,但在我走上完全错误的道路之前只是想得到一些建议。对于我的用例,我应该坚持使用带有进程池的单个服务器,还是使用 Spark 将其拆分到多个服务器?

使用 Spark 是完全合理的,因为您可以通过将文件放在分布式存储上来将文本提取任务分配给多个执行程序。这将使您可以扩展计算以处理文件并使用 pySpark 非常高效且轻松地将结果写回。您甚至可以使用现有的 Python 文本提取代码:

input = sc.binaryFiles("/path/to/files")
processed = input.map(lambda (filename, content): (filename, myModule.extract(content)))

随着您的数据量增加或您希望增加吞吐量,您可以简单地添加额外的节点。