在sparkstreaming中对窗口范围进行reduce主要有下面四个方法, 其他方法都是直接或者间接调用下面的方法来获取结果
在这之前, 最好了解我之前一篇博客内容:
http://humingminghz.iteye.com/blog/2308138
对非(K,V)形式的RDD 窗口化reduce:
1.reduceByWindow(reduceFunc, windowDuration, slideDuration)
2.reduceByWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration)
对(K,V)形式RDD 按Key窗口化reduce:
1.reduceByKeyAndWindow(reduceFunc, windowDuration, slideDuration)
2.reduceByKeyAndWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration, numPartitions, filterFunc)
从方法上面来看, 理解和使用#1的方法确实非常简单, 但是在大数据计算过程中, 我们还是应该把效率放到第一位, 如果简单的看一下源码, 或许可以明白为什么我们应该在允许的情况下尽量用#2的方法。
reduceByWindow(reduceFunc, windowDuration, slideDuration) 代码:
可以看到他做了两次reduce, 第一次对整个self做一次reduce, 然后截取时间区间, 对结果再做一次reduce。
第一点: 对整个self做reduce会比较慢, 因为self都是相对比较大的集合。
第二点:进行了两次reduce
def reduceByWindow(
reduceFunc: (T, T) => T,
windowDuration: Duration,
slideDuration: Duration
): DStream[T] = ssc.withScope {
this.reduce(reduceFunc).window(windowDuration, slideDuration).reduce(reduceFunc)
}
如果我们看:
reduceByWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration)
实际上他是调用了效率非常高的reduceByKeyAndWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration, numPartitions, filterFunc) 方法 ==》 详细计算过程参考之前的博文
这样的话其实他只对newRDDs和oldRDDs做reduce, 由于这两个RDDs都非常小, 可以想象效率是非常高的
def reduceByWindow(
reduceFunc: (T, T) => T,
invReduceFunc: (T, T) => T,
windowDuration: Duration,
slideDuration: Duration
): DStream[T] = ssc.withScope {
this.map(x => (1, x))
.reduceByKeyAndWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration, 1)
.map(_._2)
}
如果看reduceByKeyAndWindow的话, 情况也是一样, 一个是执行:
self.reduceByKey(reduceFunc, partitioner)
.window(windowDuration, slideDuration)
.reduceByKey(reduceFunc, partitioner)
而另外一个确是在已有的window值基础上做了简单的加加减减
宗上, 从效率上面考虑, 我们应该尽量使用包含invReduceFunc的方法, 同样情况下摒弃只有reduceFunc的方法
分享到:
相关推荐
- **日志解析**:在 Spark Streaming 中,我们需要先读取这些日志文件,然后通过正则表达式或其他解析方法提取有意义的信息。 - **日志过滤**:实验可能涉及根据特定关键词或模式过滤日志,例如只保留包含特定错误...
- **特性**:支持多种数据源(如Kafka、Flume、Twitter等),并通过简单的API操作(如map、reduce、join、window等)进行数据处理。此外,DStream还能够利用Spark提供的机器学习算法、图算法等高级功能进一步处理...
《Spark全案例——Java API深度解析与实战指南》 Spark作为一个强大的分布式计算框架,因其高效、易用的特点在大数据处理领域备受青睐。本资源“Spark全案例”专注于使用Java API进行Spark开发,提供了详尽的示例...
- **微批处理**:深入解析Spark Streaming采用的微批处理机制。 ### 24. SortShuffle原理 - **Shuffle过程**:解释Spark中SortShuffle的特点及其与其他Shuffle类型的差异。 - **排序机制**:分析SortShuffle如何...
5.1 Flink通过分布式快照(checkpoint)实现容错,对比Storm和Spark Streaming的容错机制。 5.2 Checkpoint的生命周期涉及触发、任务状态保存和barrier同步。 5.3 State和StateBackend用于存储和管理任务状态,确保...
以下是对这些示例代码的详细解析和相关知识点的介绍: 1. **Flink基础概念**: - **流处理与批处理**:Flink是流处理引擎,同时支持批处理。流处理处理无限数据流,而批处理处理有限数据集。 - **DataStream与...
Spark Streaming 通过定期收集数据并进行批量处理的方式实现容错,同样存在数据重复的问题。 - **5.1.3 Google Cloud Dataflow 的事务式模型** Google Cloud Dataflow 提出了基于事务的容错机制,但其实现较为...