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());
        }
    }
}
相关推荐
core5123 分钟前
Flink SQL Cookbook on Zeppelin 部署使用
flink·notebook·zeppelin·示例·手册
喝醉酒的小白20 分钟前
Elasticsearch(ES)监控、巡检及异常指标处理指南
大数据·elasticsearch·搜索引擎
lucky_syq35 分钟前
Spark和Hadoop之间的区别
大数据·hadoop·spark
WTT001111 小时前
2024楚慧杯WP
大数据·运维·网络·安全·web安全·ctf
云云32116 小时前
怎么通过亚矩阵云手机实现营销?
大数据·服务器·安全·智能手机·矩阵
新加坡内哥谈技术16 小时前
苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
大数据·人工智能·语言模型
Data-Miner16 小时前
经典案例PPT | 大型水果连锁集团新零售数字化建设方案
大数据·big data
lovelin+v1750304096616 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
道一云黑板报17 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes