使用 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 包含所需的模式。
干杯,
最近我一直在试用 Spark,到目前为止我观察到了非常有趣的结果,但目前我遇到了著名的 groupByKey
OOM 问题。基本上,它的工作是尝试在大型数据集中搜索测量值连续增加至少 N 次的时间段。我通过将结果写入磁盘设法解决了这个问题,但应用程序现在 运行ning 慢得多(由于磁盘 IO,这是预期的)。现在的问题是:是否有任何其他内存有效策略,我可以 运行 排序数据并检查相邻值(对于同一键)是否在至少 N 个连续观察中增加,而无需重复使用 groupByKey 方法?
我设计了一种算法来用 reduceByKey
来完成它,但是有一个问题,reduce 似乎忽略了数据排序并在最后大喊完全错误的结果。
任何想法表示赞赏,谢谢。
有几种方法可以解决这个问题:
repartitionAndSortWithinPartitions
使用自定义分区器和排序:keyBy
(名称、时间戳)对- 创建仅考虑名称的自定义分区程序
repartitionAndSortWithinPartitions
使用自定义分区程序- 使用
mapPartitions
迭代数据并产生匹配序列
sortBy(Key)
- 这类似于第一个解决方案,但以额外的 post 处理为代价提供了更高的粒度。keyBy
(名称、时间戳)对sortByKey
- 使用
mapPartitionsWithIndex
跟踪每个分区的前导/尾随模式来处理各个分区 - 调整最终结果以包含跨越多个分区的模式
使用
中的mllib.rdd.RDDFunctions
.sliding
在已排序数据上创建固定大小 windowssortBy
(名称、时间戳)- 创建覆盖多个
names
的滑动 RDD 和过滤器 windows
- 检查是否有 window 包含所需的模式。