SparkStreaming 对Window的reduce的方法解析
2016-06-30 11:57
232 查看
在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
如果我们看:
reduceByWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration)
实际上他是调用了效率非常高的reduceByKeyAndWindow(reduceFunc, invReduceFunc, windowDuration, slideDuration, numPartitions, filterFunc) 方法 ==》 详细计算过程参考之前的博文
这样的话其实他只对newRDDs和oldRDDs做reduce, 由于这两个RDDs都非常小, 可以想象效率是非常高的
如果看reduceByKeyAndWindow的话, 情况也是一样, 一个是执行:
而另外一个确是在已有的window值基础上做了简单的加加减减
宗上, 从效率上面考虑, 我们应该尽量使用包含invReduceFunc的方法, 同样情况下摒弃只有reduceFunc的方法
在这之前, 最好了解我之前一篇博客内容:
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的方法
相关文章推荐
- MapReduce中一次reduce方法的调用中key的值不断变化分析及源码解析
- 解析window.open的使用方法总结
- <转>Sparkstreaming reduceByKeyAndWindow(_+_, _-_, Duration, Duration) 的源码/原理解析
- JavaScript数组方法reduce解析
- javaScript--数组(Array)的reduce方法解析
- onAttachedToWindow方法解析
- Sparkstreaming reduceByKeyAndWindow(_+_, _-_, Duration, Duration) 的源码/原理解析
- window.open方法解析
- 解析JavaScript数组方法reduce
- JavaScript数组方法reduce解析
- Window 下面利用Oid 获取SNMP主机信息 以及计算方法
- QT http抓包,post和get方法,解析返回的json包
- 解析PHP多种序列化与反序列化的方法
- DOM方式解析XML文件的方法分析
- 如何实现window系统cmd环境下从远程FTP服务器上下载文件的方法
- Python解析mnist出错的解决方法
- mapreduce中map处理过程?参数如何解析传递给map方法?
- 黑马程序员——java基础——ServerSocket、Socket构造方法解析
- window.open的例子和使用方法以及参数说明(完整版)
- Android中三种主要的XML解析方法