【发布时间】:2016-12-28 12:36:07
【问题描述】:
我正在编写 PySpark 作业,但遇到了一些性能问题。 基本上,它所做的只是从 Kafka 读取事件并记录所做的转换。 问题是,转换是基于对象的函数计算的,并且该对象非常繁重,因为它包含一个 Graph 和一个自动更新的内部缓存。 所以当我写下面这段代码时:
analyzer = ShortTextAnalyzer(root_dir)
logger.info("Start analyzing the documents from kafka")
ssc.union(*streams).filter(lambda x: x[1] != None).foreachRDD(lambda rdd: rdd.foreach(lambda record: analyzer.analyze_short_text_event(record[1])))
它序列化了我的analyzer,由于图的原因,这需要很长时间,并且当它被复制到执行器时,缓存只与那个特定的 RDD 相关。
如果作业是用 Scala 编写的,我可以编写一个存在于每个执行器中的对象,然后我的对象就不必每次都被序列化。
有没有办法在 Python 中做到这一点?为每个执行程序创建一次我的对象,然后它可以避免序列化过程?
提前致谢:)
更新: 我读过How to run a function on all Spark workers before processing data in PySpark? 的帖子,但那里的答案是关于共享文件或广播变量的。 我的对象无法广播,因为他不是只读的。它不断更新它的内部缓存,这就是为什么我希望每个执行程序都有一个对象(以避免需要序列化)。
【问题讨论】:
标签: python apache-spark pyspark spark-streaming