【问题标题】:Does it help to persist data between transformations in Scala Spark?在 Scala Spark 中的转换之间持久化数据是否有帮助?
【发布时间】:2018-08-27 01:39:41
【问题描述】:

一个

首先我阅读了一条推文并通过映射到我的解析函数parseTweet解析成一个推文案例类:

val tweets = sc.textFile("/home/gakuo/Documents/bigdata/NintendoTweets").map(parseTweet)

两个

然后我使用一个函数对 RDD 进行配对,通过 toPairRdd 中的映射生成 (hashtags, likes) 形式的对 RDD:

val pairedRDD = toPairRdd(tweets).persist()

问题

在阅读了我在上面 (one) 中的 RDD 之后,是否有助于坚持它,因为 (two) 中的后续内容是一种转换?我在想,既然都懒,那么坚持其实就是浪费内存。

三个

计算pairRDD后,我想计算每个主题标签的分数:toScores uses reduceByKey

  val scores = toScores(pairedRDD).persist()

问题

我使用reduceByKey。这个 pairRDD 方法会导致洗牌吗?我读过一篇论文,上面写着:

“当生成的 RDD 依赖于来自相同 RDD 或另一个 RDD 的其他元素时,可能会发生 shuffle。 cogroup,groupWith,加入,leftOuterJoin,rightOuterJoin, groupByKey,reduceByKey,combineByKey,distinct,交集, 重新分区,合并导致洗牌。为避免此类操作的混洗,请确保转换遵循与原始 RDD 相同的分区"

同一篇论文还指出reduceByKey 遵循与原始 RDD 相同的分区。

【问题讨论】:

标签: scala apache-spark


【解决方案1】:

当您有许多操作总是再次执行相同的转换次数时,使用持久化(在内存/磁盘/两者上)很重要。如果一次又一次重新计算花费的时间太长。

【讨论】:

    【解决方案2】:

    在您的情况下,不需要持久化或缓存,因为它是一次性过程。您需要知道,在洗牌之前会生成阶段,将尽可能多的转换放在一起。你会在这里有 2 个。

    如果您要使用pairedRDD 处理一些其他数据需求,则建议使用persist。

    这些动作在任何情况下都更相关。

    【讨论】:

      【解决方案3】:

      如果你有多个操作使用同一个 rdd,那么建议坚持。到目前为止,我在您的代码中没有看到任何操作。所以我看不出有任何理由缓存 rdd。持久化/缓存也懒惰地评估。

      持久化/缓存 - 不保证数据会在执行的生命周期内保持不变,因为持久化遵循 LRU 最近最少使用的算法,如果内存已满,可能会根据最少使用的 rdd 刷新数据。使用persist时需要牢记的所有事项。

      Reducebykey - 这是一个广泛的转换,因为可能会发生随机播放。但首先它确实首先将数据与分区内的键相结合,然后再进行归约操作。所以成本更低。始终避免使用 groupbykey 直接对数据进行洗牌,而无需将数据与分区中的键组合在一起。编码时请避免使用 groupbykey。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-13
        • 2017-02-27
        相关资源
        最近更新 更多