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

时间:2016-02-23 14:03:09

标签: java apache-spark reduce

Cheerz,

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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