Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何截获驱动程序上累加器的部分更新?_Apache Spark_Java 8_Accumulator - Fatal编程技术网

Apache spark 如何截获驱动程序上累加器的部分更新?

Apache spark 如何截获驱动程序上累加器的部分更新?,apache-spark,java-8,accumulator,Apache Spark,Java 8,Accumulator,Spark 1.5.1+Java 1.8 我们正在使用spark将大量记录上传到数据库 操作代码如下所示: rdd.foreachPartition(new VoidFunction<Iterator<T>>() { @Override public void call(Iterator<T> iter) { //while there are more records perform the following ev

Spark 1.5.1+Java 1.8

我们正在使用spark将大量记录上传到数据库

操作代码如下所示:

rdd.foreachPartition(new VoidFunction<Iterator<T>>() {

     @Override
     public void call(Iterator<T> iter) {
          //while there are more records perform the following every 1000 records
          //int[] recoords = statement.executeBatch();
          //accumulator.add(recoords.length);
     }
     // ...
} 
rdd.foreachPartition(新的VoidFunction(){
@凌驾
公共无效调用(迭代器iter){
//当有更多记录时,每1000条记录执行以下操作
//int[]recoords=statement.executeBatch();
//累加器。添加(重新编码。长度);
}
// ...
} 
在驱动程序节点上有一个监视累加器值的线程。但是该值不会更新。在应用程序结束时,它只会更新一次。即使累加器使用了延迟值设置,也应该正确更新,因为我正在驱动程序节点线程中定期读取该值


我是否错误地使用了累加器?我是否可以更持续地监视我的员工的进度?

您可以监视累加器值,但不能连续进行,即在任务完成后进行更新

虽然累加器被称为共享变量,但实际上并没有共享。每个任务都有自己的累加器,在任务完成后合并。这意味着在任务运行时无法更新全局值

为了能够看到更新,执行者的数量必须小于已处理分区的数量(对应于任务的数量)。这是因为当累加器更新发送到驱动程序时引入了“屏障”

例如:

import org.apache.spark.{SparkConf,SparkContext}
对象应用程序{
def main(参数:数组[字符串]){
val conf=new SparkConf().setMaster(“本地[4]”)
val sc=新的SparkContext(配置)
val accum=sc.累加器(0,“累加器”)
val rdd=sc.parallelize(1到1000,20)
导入scala.concurrent.duration_
导入scala.language.postfix操作
导入rx.lang.scala_
val o=可观测的间隔(1000毫秒)。取(1000)
val s=o.subscribe(=>println(累计值))
foreach(x=>{
线程睡眠(x+200)
累计+=1
})
s、 退订
sc.停止
}
}
正如您所见,每个任务只更新一次全局值

如果您按照所提供的示例创建命名累加器,您也可以使用Spark UI监控其状态。只需打开“阶段”选项卡,导航到特定阶段并检查累加器部分

我是否可以更持续地监控员工的进度


最可靠的方法是通过添加更多的分区来提高粒度,但成本并不低。

“虽然累加器被称为共享变量,但实际上并没有共享。”-它们在工作人员和驱动程序之间共享@JacekLaskowski我认为这取决于您如何定义共享。IMHO调用状态无法从中观察到,并且永远不会传播到后台工作者是一种滥用。顺便说一句,感谢您的编辑。