【发布时间】:2016-10-23 07:19:34
【问题描述】:
我有一个包含字符串 (textData) 和一组正则表达式过滤器 (regx) 的文件,我想应用并获取计数。在我们迁移到 Spark 之前,我使用 GREP 如下:
from subprocess import check_output
result={}
for reg in regx: # regx is a list of all the filters
result[reg] = system.exec('grep -e ' + reg + 'file.txt | wc -l')
注意:我在这里解释为“system.exec”,实际上我使用的是 check_output。
我升级到 SPARK 是为了其他事情,所以我也想在这里利用 spark 的好处。所以我写了这段代码。
import re
sc = SparkContext('local[*]')
rdd = sc.textFile('file.txt') #containing the strings as before
result = rdd.flatMap(lambda line: [(reg, line) for reg in regx])
.map(lambda line: (line[0], len(re.findall(line[0], line[1]))))
.reduceByKey(lambda a,b: a+b)
.collect()
我以为我很聪明,但代码实际上更慢。谁能指出任何明显的错误?我正在运行它 spark-submit --master local[*] filename.py
我没有在相同的确切数据上运行两个版本来检查到底慢了多少。如果需要,我可以轻松做到这一点。当我检查 localhost:4040 时,大部分时间都被 reduceByKey 作业占用。
为了说明所花费的时间,文件中的行数为 100,000,平均每行的 #chars 约为 1000 左右。过滤器的数量 len(regx)=20。这段代码在 8 核处理器上运行了 44 分钟,内存为 128GB。
编辑:只是添加,正则表达式过滤器和文本文件的数量将在最终系统中增加 100 倍。另外,我将使用 SQL 语句查询 rdd 中的数据,而不是从文本文件中写入/读取数据。因此,我认为 Spark 是一个不错的选择。
【问题讨论】:
-
如果您观察到
grep比 Spark 慢得多,这将是一个有趣的问题。反过来,尤其是在本地模式下,这甚至不足为奇。虽然您的代码可以通过多种方式改进以期待类似的性能,但在非分布式设置中,grep是不现实的。 -
您是否尝试(增加)更改
minPartitions中的textFile参数? -
@zero323 好吧,我目前在开发环境中,但将转向分布式设置。如果您可以详细说明“以多种方式改进”,那将非常有帮助。非常感谢。
-
@EhsanM.Kermani 谢谢。我做到了,它根本没有帮助。也许是因为它没有按照零的建议分发。还有其他想法吗?
-
行的平均大小是多少?线条是否独特?如果不是,那么预期的唯一行数是多少?
标签: regex performance apache-spark pyspark rdd