【问题标题】:Spark Streaming DStream element vs RDDSpark Streaming DStream 元素与 RDD
【发布时间】:2016-06-12 21:26:33
【问题描述】:

我正在使用 Spark 的 Streaming API,我只是想更好地了解如何最好地设计代码。

我目前正在使用来自 pyspark.streaming.kafka.createDirectStream 的 Kafka Consumer(在 pyspark 中)

根据http://spark.apache.org/docs/latest/streaming-programming-guide.html

Spark Streaming 提供称为离散化的高级抽象 stream 或 DStream,表示连续的数据流。 DStreams 可以从源的输入数据流创建 例如 Kafka、Flume 和 Kinesis,或者通过应用高级 其他 DStream 上的操作。在内部,一个 DStream 表示为 一系列 RDD。

本质上,我想将一组函数应用于 DStream 中的每个元素。目前,我正在使用 pyspark.streaming.DStream 的“地图”功能。根据文档,我的方法似乎是正确的。 http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html#pyspark.streaming.DStream

map(f, preservesPartitioning=False) 通过应用 a 返回一个新的 DStream DStream 的每个元素的函数。

我应该使用地图,还是正确的方法是将函数/转换应用于 RDD(因为 DStream 使用 RDD)??

foreachRDD(func) 对这个 DStream 中的每个 RDD 应用一个函数。

更多文档: http://spark.apache.org/docs/latest/api/python/pyspark.streaming.html

【问题讨论】:

    标签: apache-spark pyspark apache-kafka spark-streaming


    【解决方案1】:

    DirectStream.map 在这里是正确的选择。关注map

    stream.map(f)
    

    相当于:

    stream.transform(lambda rdd: rdd.map(f))
    

    另一方面,DirectStream.foreachRDD 是一个输出操作并创建一个输出DStream。与 foreachRDD 一起使用的函数预计不会返回任何内容,与方法本身相同。看一下 Scala 签名就很明显了:

    def foreachRDD(foreachFunc: RDD[T] => Unit): Unit
    

    【讨论】:

    • 感谢您的反馈!我做了一些研究,并研究了文档。本质上,我想通过映射/转换/过滤功能来完成所有的转换/按摩方面。要插入数据库(即一些“辅助功能”),我将使用 .foreachRDD
    • 除了非常简单的应用程序之外,这不是一个非常有用的方法。退出 foreachRDD 的任何转换都将丢失。所以这意味着你只能应用“线性`工作流。
    • 除了简单的应用程序之外,什么不是有用的方法?您能否进一步详细说明,不确定您的意思。至于 foreachRDD,我的意图只是用它来将数据插入数据库。
    猜你喜欢
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2017-07-02
    • 2018-07-02
    • 2016-12-22
    • 2014-12-21
    相关资源
    最近更新 更多