[英]Apache Spark: Regex with ReduceByKey is lot slower than GREP command
我有一个包含字符串(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,平均每行#个字符数约为1000个左右。 过滤器数len(regx)= 20。 该代码已在具有128GB RAM的8核处理器上运行了44分钟。
编辑:只需添加一下,正则表达式过滤器和文本文件的数量将在最终系统中成倍增加100倍。 另外,不是从文本文件写入/读取数据,而是要使用SQL语句在rdd中查询数据。 因此,我认为Spark是一个不错的选择。
我也是一个相当繁重的用户,虽然Spark在本地设置中感觉不那么快,但您应该考虑其他一些事项:
即在Hadoop群集中,RDD分区可以并行处理。 这是您注意到性能的地方。
Spark将与Hadoop一起为实现“数据局部性”而竭尽全力,这意味着您的流程将直接在本地硬盘上运行,否则数据将在网络上复制,就像在执行类似缩减的流程时一样 。 这些是阶段 。 了解阶段以及如何在执行程序之间移动数据将为您带来很大的改进,此外考虑到这种类型是“ reduce”类型,它会触发Spark上的新执行阶段,从而有可能在网络上移动数据。 在执行映射的同一节点上拥有备用资源可以节省大量网络开销。
否则它将仍然可以正常工作,并且您不能错误地销毁HDFS中的文件:-)
通过并行分布任务以在自恢复执行环境中与许多硬盘驱动器一起工作,您才能真正在此获得数据和执行的性能和安全性。
在本地设置中,您只是觉得它没有响应,主要是因为加载,启动和追溯该过程需要一点时间,但是在多个节点上处理多个GB时,感觉很快又安全。
我也很喜欢shell脚本,而且我经常处理合理数量的GB,但是如果不分配磁盘IO或为RAM付费,就无法进行正则表达式匹配5 TB的数据,就好像没有明天一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.