Java Databricks Spark参考应用程序:在Spark流中使用静态变量进行状态维护
第节提到使用静态变量来维护:Java Databricks Spark参考应用程序:在Spark流中使用静态变量进行状态维护,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,第节提到使用静态变量来维护: 运行计数 runningSum 润宁民 runningMax 我的理解是:在分布式模式下,数据流:contentSizeDStream(一个无限系列的RDD)将被分割并分布在多个工作进程中进行处理,每个工作进程将拥有自己的静态变量副本(runningCount…runningMax) 问:静态变量如何帮助维护状态? 代码段: JavaDStream<Long> contentSizeDStream = accessLogDStream.map(Apa
- 运行计数
- runningSum
- 润宁民
- runningMax
contentSizeDStream
(一个无限系列的RDD)将被分割并分布在多个工作进程中进行处理,每个工作进程将拥有自己的静态变量副本(runningCount…runningMax)
问:静态变量如何帮助维护状态?
代码段:
JavaDStream<Long> contentSizeDStream =
accessLogDStream.map(ApacheAccessLog::getContentSize).cache();
contentSizeDStream.foreachRDD(rdd -> {
if (rdd.count() > 0) {
runningSum.getAndAdd(rdd.reduce(SUM_REDUCER));
runningCount.getAndAdd(rdd.count());
runningMin.set(Math.min(runningMin.get(), rdd.min(Comparator.naturalOrder())));
runningMax.set(Math.max(runningMax.get(), rdd.max(Comparator.naturalOrder())));
System.out.print("Content Size Avg: " + runningSum.get() / runningCount.get());
System.out.print(", Min: " + runningMin.get());
System.out.println(", Max: " + runningMax.get());
}
return null;
});
JavaDStream contentSizeDStream=
accessLogDStream.map(ApacheAccessLog::getContentSize).cache();
contentSizeDStream.foreachRDD(rdd->{
如果(rdd.count()>0){
运行SUM.getAndAdd(rdd.reduce(SUM_REDUCER));
运行count.getAndAdd(rdd.count());
set(Math.min(runningMin.get(),rdd.min(Comparator.naturalOrder());
runningMax.set(Math.max(runningMax.get(),rdd.max(Comparator.naturalOrder());
System.out.print(“平均内容大小:”+runningSum.get()/runningCount.get());
System.out.print(,Min:+runningMin.get());
System.out.println(,Max:+runningMax.get());
}
返回null;
});
虽然DStream
表示分布式流数据,但这些操作揭示了一个多级抽象:应用于元素的操作,例如map
、filter
,以及它们的经典好友都分布在集群中操作。
在上面的代码中,accessLogDStream.map(ApacheAccessLog::getContentSize)
就是一个例子contentSize
将应用于accessLogDStream
的元素
然后,我们有应用于RDD
s的操作,例如transform
和foreachRDD
。它们对底层RDD抽象进行操作。这些操作的闭包中的代码附加到SparkStreaming调度程序,并在驱动程序上执行,而不是分发。然而,由于它们提供了对RDD
的访问,我们仍然可以对RDD应用分布式操作,并将结果应用到单个驱动程序上下文
回到示例代码,runningCount
是驱动程序上下文的局部变量。当我们执行运行count.getAndAdd(rdd.count())时
我们在rdd
上有效地应用了分布式count
操作,将所有分区和执行器上的合计计数收集到驱动程序上,然后将该数字添加到本地上下文中的runningCount
的值中
这样,流式处理程序就可以集中地汇总分布在集群中的数据,其他对流式处理作业的结果感兴趣的应用程序可以进一步使用这些数据