【问题标题】:Detecting repeating consecutive values in large datasets with Spark使用 Spark 检测大型数据集中的重复连续值
【发布时间】:2016-06-05 09:54:25
【问题描述】:

干杯,

最近我一直在尝试 Spark,到目前为止,我观察到了非常有趣的结果,但目前我遇到了著名的 groupByKey OOM 问题。基本上它的工作是尝试在大型数据集中搜索测量值连续增加至少 N 次的时期。我设法通过将结果写入磁盘来解决这个问题,但应用程序现在运行速度要慢得多(这是由于磁盘 IO 而导致的)。现在的问题是:是否有任何其他内存有效策略,我可以运行排序数据并检查相邻值(对于同一个键)是否在至少 N 个连续观察中增加,而无需重复使用 groupByKey 方法?

我已经设计了一种算法来使用reduceByKey,但是有一个问题,reduce 似乎忽略了数据排序并在最后喊出完全错误的结果。

任何想法表示赞赏,谢谢。

【问题讨论】:

  • 如何表达订单?或者换句话说,是什么让值相邻?
  • @zero323 数据由变量名、时间戳和测量值组成。时间戳是我对数据进行排序的字段。变量名是关键。

标签: java apache-spark reduce


【解决方案1】:

有几种方法可以解决这个问题:

  • repartitionAndSortWithinPartitions 带有自定义分区器和排序:

    • keyBy(名称、时间戳)对
    • 创建只考虑名称的自定义分区器
    • repartitionAndSortWithinPartitions 使用自定义分区器
    • 使用mapPartitions 迭代数据并产生匹配序列
  • sortBy(Key) - 这类似于第一个解决方案,但以额外的后处理为代价提供了更高的粒度。

    • keyBy(名称、时间戳)对
    • sortByKey
    • 使用mapPartitionsWithIndex 处理各个分区,跟踪每个分区的前导/尾随模式
    • 调整最终结果以包含跨越多个分区的模式
  • 使用来自mllib.rdd.RDDFunctionssliding 在排序数据上创建固定大小的窗口。

    • sortBy(姓名、时间戳)
    • 创建覆盖多个names的滑动RDD和过滤窗口
    • 检查是否有任何窗口包含所需的图案。

【讨论】:

  • 实施了您提出的第一个策略,似乎在没有内存问题的情况下执行。非常感谢!
猜你喜欢
  • 2017-06-22
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多