JavaSpark-编程进阶-累加器

来源:互联网 发布:要不要复读知乎 编辑:程序博客网 时间:2024/05/17 07:56

spark的一些进阶特性

  • 累加器(accumulate):用于聚合和统计
  • 广播变量(broadcast variable):高效分发大对象(分发大查询表)
  • spark可与外部程序进行交互(R语言编写的脚本进行交互)
  • spark为需要大配置代价的操作引入了批操作(查询数据库、连接数据库、创建随机数)
  • spark有专用的操作数值数据的方法

驱动器定义的变量可向spark函数(map()、filter())传递,但集群中的每一个任务只会得到变量的副本,更新副本不会影响驱动器中的对应变量(不会反回给driver)
。共享变量(累加器和广播变量突破了这一限制)。
累加器:提供了将worker上的值聚合到driver中的语法(常用于作业执行过程事件的调试。也是对worker返回给driver的值进行聚合)

//累加器        SparkConf conf = new SparkConf().setMaster("local").setAppName("accumulate_test");        JavaSparkContext jsc = new JavaSparkContext(conf);        Accumulator<Integer> count = jsc.accumulator(0);        List<String> data = new ArrayList<String>();        data.add("haha");        data.add("");        data.add("test");        data.add("");        JavaRDD<String> word = jsc.parallelize(data,2        );        word.mapToPair(x -> {            if(x.equals("")){                count.add(1);            }            return new Tuple2<String,Integer>(x,1);        }).collect();        System.out.println(count.value());              jsc.close();

累加器的用法
调用(java)sparkcontext.accumulate(initialvalue)返回一个Accumulator[T]对象
spark闭包里执行代码可用add()增加累加器值
驱动器用value属性访问累加器值
worker上的任务不可访问累加器的值,对于worker的task来说累加器是只写变量,这种模式下累加器实现更高效,不用在每次更新操作都进行通信
(多值跟踪就创建多个累加器)


累加器与容错性

  • spark机制

    • 自动更新执行失败或慢的节点
    • 重运行任务获取缓存中被移除数据
    • 早结束可取到结果

    结果就导致同一个函数对同一数据进行了多次运算,累加器多次传递给excutor节点
    在终止操作中累加器只执行一次,转化操作多次执行。想要绝对可靠的累加器就把累加器放在行动操作中

原创粉丝点击