使用 Spark 检测大型数据集中的重复连续值

Detecting repeating consecutive values in large datasets with Spark

干杯,

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

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

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

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

  • repartitionAndSortWithinPartitions 使用自定义分区器和排序:

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

    • keyBy(名称、时间戳)对
    • sortByKey
    • 使用mapPartitionsWithIndex跟踪每个分区的前导/尾随模式来处理各个分区
    • 调整最终结果以包含跨越多个分区的模式
  • 使用 mllib.rdd.RDDFunctions.

    中的 sliding 在已排序数据上创建固定大小 windows
    • sortBy(名称、时间戳)
    • 创建覆盖多个 names
    • 的滑动 RDD 和过滤器 windows
    • 检查是否有 window 包含所需的模式。