sparkStreaming 中使用累加器遇到的坑

最近使用sparkstreaming是有个场景需要统计入mysql的数据量,因此考虑使用累加器;按照官网使用

如下方式:

 JavaStreamingContext jssc = new JavaStreamingContext (conf, Durations.seconds(3));
 LongAccumulator  BroadbandArrearsAll = jssc.sparkContext().sc().longAccumulator("BroadbandArrearsAll");

然后在处理逻辑中调用累加器

directStream.foreachRDD(rdd-> {
    //处理逻辑...
    //其他逻辑
    phoneData.foreachPartition(partitions->{
        
        if(满足条件统计){
            处理逻辑
            broadbandArrears.add(1L);
        }
    })

})

把任务提交到集群发现broadbandArrears.add(1L);报空指针错误。累加器实例在task中没实例化;官网例子就是最外面实例的累加器???

之后使用下面方式实例化累加器

directStream.foreachRDD(rdd-> {
            LongAccumulator  broadbandArrears = rdd.context().longAccumulator("BroadbandArrears");
            //获取kafka的 offset
            OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
             //处理逻辑....
            phoneData.foreachPartition(partitions->{
                if(满足条件){
                        处理逻辑
                        broadbandArrears .add(1L);
                    }

            });
});

提交任务后发现没有问题,但是累加器累加的是一个task的计数,也就是流计算定义的一个Dstream中的数据

查阅资料后发现,应该使用单例模式,就是整个流任务定义一个累加器实例;代码如下

class BroadbandArrears {
    private volatile  static LongAccumulator instance = null;
    public static   LongAccumulator  getInstance(SparkContext sc) {
        if (instance == null) {  //如果累加器不存在则创建
            synchronized(BroadbandArrears.class) {
                if (instance == null) {
                    instance = sc.longAccumulator("BroadbandArrears"); //用以记录被删除的词
                }
            }
        }
        return  instance;
    }
}

directStream.foreachRDD(rdd-> {
            LongAccumulator instance = BroadbandArrears.getInstance(rdd.context());
            //获取kafka的 offset
            OffsetRange[] offsetRanges = ((HasOffsetRanges) rdd.rdd()).offsetRanges();
            //处理逻辑....
            phoneData.foreachPartition(partitions->{
                if(满足条件){
                        处理逻辑
                        instance.add(1L);
                    }

            });
});

你会发现达到了自己的目的;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值