【问题标题】:PySpark Streaming Job - Avoid object serializationPySpark Streaming Job - 避免对象序列化
【发布时间】: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


    【解决方案1】:

    我最终做的就是避免我的对象被序列化,将我的类变成一个静态类——只有类变量和类方法。这样每个执行器都会导入该类一次(及其相关变量),并且不需要序列化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多