Apache spark Spark流中数据流的缓存

Apache spark Spark流中数据流的缓存,apache-spark,spark-streaming,kafka-consumer-api,Apache Spark,Spark Streaming,Kafka Consumer Api,我有一个Spark流媒体程序从kafka读取数据, 进入数据流 在我的管道中,我做了两次(一次又一次): foreachRDD(RDD上的转换和插入到目标中) (每次我执行不同的处理并将数据插入不同的目标) 我想知道你会怎么做​DStream.cache​, 就在我读了卡夫卡作品的资料之后?有可能吗 这个过程现在真的从卡夫卡那里读取了两次数据吗 请记住,不可能将两个forEachRDD放在一个中(因为两条路径完全不同,存在状态转换-需要应用于数据流…) 感谢您的帮助有两种选择: 使用Dstre

我有一个Spark流媒体程序从kafka读取数据, 进入数据流

在我的管道中,我做了两次(一次又一次):

foreachRDD(RDD上的转换和插入到目标中)

(每次我执行不同的处理并将数据插入不同的目标)

我想知道你会怎么做​DStream.cache​, 就在我读了卡夫卡作品的资料之后?有可能吗

这个过程现在真的从卡夫卡那里读取了两次数据吗

请记住,不可能将两个forEachRDD放在一个中(因为两条路径完全不同,存在状态转换-需要应用于数据流…)

感谢您的帮助

有两种选择:


  • 使用
    Dstream.cache()
    将底层RDD标记为缓存。Spark Streaming将负责在超时后解除RDD的持久化,由
    Spark.cleaner.ttl
    配置控制

  • 使用附加的
    foreachRDD
    对数据流中的RDD应用
    cache()
    unpersist(false)
    副作用操作:

e、 g:

请注意,如果这是一个选项,您可以将缓存合并为
do stuff 1
的第一条语句

我更喜欢这个选项,因为它可以让我对缓存生命周期进行细粒度的控制,并让我在需要时立即清理内容,而不是依赖ttl。

有两个选项:


  • 使用
    Dstream.cache()
    将底层RDD标记为缓存。Spark Streaming将负责在超时后解除RDD的持久化,由
    Spark.cleaner.ttl
    配置控制

  • 使用附加的
    foreachRDD
    对数据流中的RDD应用
    cache()
    unpersist(false)
    副作用操作:

e、 g:

请注意,如果这是一个选项,您可以将缓存合并为
do stuff 1
的第一条语句


我更喜欢这个选项,因为它可以让我对缓存生命周期进行细粒度的控制,并让我在需要时尽快清理内容,而不是依赖ttl。

Dstream.cache可以工作。它在第一次看到动作时缓存流。对于数据流中的后续操作,它使用缓存。@Knight71我还需要设置DStream.unpersist(true),与缓存RDD时相同,在不再需要数据流时结束?所有操作后,数据流数据将自动清除,并由基于转换的火花流决定。@Knight71,谢谢你的回答?如果我不放置DStream.cache,是否意味着Spark将从Kafka读取两次数据(基于我在问题中指定的用例),另一个有用的链接:DStream.cache将起作用。它在第一次看到动作时缓存流。对于数据流中的后续操作,它使用缓存。@Knight71我还需要设置DStream.unpersist(true),与缓存RDD时相同,在不再需要数据流时结束?所有操作后,数据流数据将自动清除,并由基于转换的火花流决定。@Knight71,谢谢你的回答?如果我不放置DStream.cache,是否意味着Spark将从Kafka读取两次数据(基于我在问题中指定的用例),另一个有用的链接:
Spark.cleaner.ttl
被删除。此控件的新属性是什么?
spark.cleaner.ttl
已删除。这是什么新的财产控制?
val kafkaDStream = ???
val targetRDD = kafkaRDD
                       .transformation(...)
                       .transformation(...)
                       ...
// Right before the lineage fork mark the RDD as cacheable:
targetRDD.foreachRDD{rdd => rdd.cache(...)}
targetRDD.foreachRDD{do stuff 1}
targetRDD.foreachRDD{do stuff 2}
targetRDD.foreachRDD{rdd => rdd.unpersist(false)}