Flink中序列化RoaringBitmap不同方式的对比

背景

在flink中,我们有时候会使用到RoaringBitmap进行统计计数等操作,而当使用RoaringBitmap时,这就涉及到了最重要的问题,如何序列化?序列化的目的是为了进行网络通信或者状态序列化的目的,本文的重点是比较kryo使用默认的序列化器序列化RoaringBitmap和自定义序列化器序列化RoaringBitmap的性能对比

性能对比

当在flink中使用RoaringBitmap时,flink自身携带的序列化器是没法处理这个类的序列化的,只能交给kryo进行序列化,而kryo都是使用FieldSerializer来对对象进行序列化,当kryo对RoaringBitmap类进行序列化时,他会对里面的

的每个字段分别调用对应的序列化器进行序列化/反序列化,但是其实这样的性能不高,因为其实不是这里面数组里面的每个元素都需要序列化,而是可以根据情况来决定的,所以RoaringBitmap本身提供了serializer/deserializer方法,这相比于直接序列化每个字段有极大的性能提升,所以我们这里需要实现自己的kryo序列化器来直接使用RoaringBitmap提供的serializer/deserializer方法,以下是得到的性能测试结果:

附测试代码:

java 复制代码
    @Benchmark @OperationsPerInvocation(value = SerializationFrameworkMiniBenchmarks.RECORDS_PER_INVOCATION_SER)
    public void serializerKryoBitmap(FlinkEnvironmentContext context) throws Exception {
        StreamExecutionEnvironment env = context.env;
        env.setParallelism(4);
        ExecutionConfig executionConfig = env.getConfig();
        executionConfig.enableForceKryo();

        env.addSource(new BitMapWrapperSource(RECORDS_PER_INVOCATION_SER, 10)).rebalance()
                .addSink(new SelfBitMapSink<BitMapWrapper>());
        env.execute();
    }

    @Benchmark @OperationsPerInvocation(value = SerializationFrameworkMiniBenchmarks.RECORDS_PER_INVOCATION_SER)
    public void serializerKryoBitmapSerializer(FlinkEnvironmentContext context) throws Exception {
        StreamExecutionEnvironment env = context.env;
        env.setParallelism(4);
        ExecutionConfig executionConfig = env.getConfig();
        executionConfig.enableForceKryo();
        executionConfig.registerTypeWithKryoSerializer(RoaringBitmap.class, BitMapSerializer.class);

        env.addSource(new BitMapWrapperSource(RECORDS_PER_INVOCATION_SER, 10)).rebalance()
                .addSink(new SelfBitMapSink<BitMapWrapper>());
        env.execute();
    }
  /**
     * RoaringBitmapSource
     */
    public static class BitMapWrapperSource extends BaseSourceWithKeyRange<BitMapWrapper> {
        private static final long serialVersionUID = 2941333602938145599L;

        private transient BitMapWrapper template;

        public BitMapWrapperSource(int numEvents, int numKeys) {
            super(numEvents, numKeys);
        }

        @Override protected void init() {
            super.init();
            template = initNewBitMapWrapper(0);
        }


        @Override protected BitMapWrapper getElement(int keyId) {
            template.setId(keyId);
            return template;
        }

        private BitMapWrapper initNewBitMapWrapper(int keyId) {
            BitMapWrapper template = new BitMapWrapper();
            RoaringBitmap r32 = new RoaringBitmap();
            for (int i = 0; i < BITMAP_INIT_NUM / 2; i++) {
                r32.add(1000000 + i);
            }
            for (int i = BITMAP_INIT_NUM / 2; i < BITMAP_INIT_NUM; i++) {
                r32.add(9000000 + i);
            }
            r32.runOptimize();
            template.setR1(r32);
            template.setId(keyId);
            return template;
        }
    }
    public class SelfBitMapSink<BitMapWrapper> implements SinkFunction<org.apache.flink.benchmark.selfbitmap.BitMapWrapper>, SupportsConcurrentExecutionAttempts {

    private static final long serialVersionUID = 1L;

    public SelfBitMapSink() {
    }

    public void invoke(org.apache.flink.benchmark.selfbitmap.BitMapWrapper value) throws Exception{
        if (value.getId() > 10 || value.getId() < 0) {
            throw new Exception("id is illegal" + value.getId());
        }
        if(value.getR1().getCardinality() != SerializationFrameworkMiniBenchmarks.BITMAP_INIT_NUM){
            throw new Exception("bitmap error" + value.getR1().getCardinality());
        }
    }
}
相关推荐
最初的↘那颗心1 小时前
Flink Stream API - 源码开发需求描述
java·大数据·hadoop·flink·实时计算
白鲸开源1 小时前
收藏!史上最全 Apache SeaTunnel Source 连接器盘点 (2025版),一篇通晓数据集成生态
大数据·数据库·开源
爱疯生活1 小时前
车e估牵头正式启动乘用车金融价值评估师编制
大数据·人工智能·金融
Lx3522 小时前
MapReduce作业调试技巧:从本地测试到集群运行
大数据·hadoop
计算机程序员小杨2 小时前
计算机专业的你懂的:大数据毕设就选贵州茅台股票分析系统准没错|计算机毕业设计|数据可视化|数据分析
java·大数据
BYSJMG2 小时前
计算机大数据毕业设计推荐:基于Spark的气候疾病传播可视化分析系统【Hadoop、python、spark】
大数据·hadoop·python·信息可视化·spark·django·课程设计
励志成为糕手3 小时前
大数据MapReduce架构:分布式计算的经典范式
大数据·hadoop·mapreduce·分布式计算·批处理
计算机毕设残哥3 小时前
大数据毕业设计选题推荐:护肤品店铺运营数据可视化分析系统详解
大数据·信息可视化·课程设计
君不见,青丝成雪3 小时前
大数据云原生是什么
大数据·云原生
金融小师妹4 小时前
AI多因子模型解析:黄金涨势受阻与美联储9月降息政策预期重构
大数据·人工智能·算法