flink keyby使用与总结 基础片段梳理

文章目录


提示:以下是本篇文章正文内容,下面案例可供参考

一、KeyBy的源码分析

总结:

保证key相同的一定进入到一个分区内,但是一个分区内可以有多key的数据;

是对数据进行实时的分区,不是上游发送给下游,而是将数据写入到对应的channel的缓存中,下游到上游实时拉取;

keyBy底层是new KeyedStream,然后将父DataStream包起来,并且传入keyBy的条件(keySelector);

最终会调用KeyGroupStreamPartitioner的selectChannel方法,将keyBy的条件的返回值传入到该方法中;

流程:

1.先计算key的HashCode值(有可能会是负的)

2将key的HashCode值进行特殊的hash处理,MathUtils.murmurHash(keyHash),一定返回正数,避免返回的数字为负

3.将返回特特殊的hash值模除以默认最大并行的,默认是128,得到keyGroupId

4.keyGroupId * parallelism(程序的并行度) / maxParallelism(默认最大并行),返回分区编号

注意:1.如果将自定义POJO当成key,必须重新hashcode方法,2.不能将数组当成keyBy的key

java 复制代码
public <K> KeyedStream<T, K> keyBy(KeySelector<T, K> key) {
        Preconditions.checkNotNull(key);
        return new KeyedStream<>(this, clean(key));
    }


public KeyedStream(
            DataStream<T> dataStream,
            KeySelector<T, KEY> keySelector,
            TypeInformation<KEY> keyType) {
        this(
                dataStream,
                new PartitionTransformation<>(
                        dataStream.getTransformation(),
                        new KeyGrouppublic KeyGroupStreamPartitioner(KeySelector<T, K> keySelector, int maxParallelism) {
        Preconditions.checkArgument(maxParallelism > 0, "Number of key-groups must be > 0!");
        this.keySelector = Preconditions.checkNotNull(keySelector);
        this.maxParallelism = maxParallelism;
    }

    public int getMaxParallelism() {
        return maxParallelism;
    }

    @Override
    public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {
        K key;
        try {
            key = keySelector.getKey(record.getInstance().getValue());
        } catch (Exception e) {
            throw new RuntimeException(
                    "Could not extract key from " + record.getInstance().getValue(), e);
        }
        return KeyGroupRangeAssignment.assignKeyToParallelOperator(
                key, maxParallelism, numberOfChannels);
    }StreamPartitioner<>(
                                keySelector,
                                StreamGraphGenerator.DEFAULT_LOWER_BOUND_MAX_PARALLELISM)),
                                keySelector,
                                keyType);
    }

public static int assignKeyToParallelOperator(Object key, int maxParallelism, int parallelism) {
        Preconditions.checkNotNull(key, "Assigned key must not be null!");
        return computeOperatorIndexForKeyGroup(maxParallelism, parallelism, assignToKeyGroup(key, maxParallelism));
    }

    public static int assignToKeyGroup(Object key, int maxParallelism) {
        Preconditions.checkNotNull(key, "Assigned key must not be null!");
        return computeKeyGroupForKeyHash(key.hashCode(), maxParallelism);
    }
    
// 将key的HashCode值进行特殊的hash处理,MathUtils.murmurHash(keyHash),一定返回正数,避免返回的数字为负
public static int computeKeyGroupForKeyHash(int keyHash, int maxParallelism) {
        return MathUtils.murmurHash(keyHash) % maxParallelism;
    }
// keyGroupId * parallelism(程序的并行度) / maxParallelism(默认最大并行),返回分区编号
public static int computeKeyGroupForKeyHash(int keyHash, int maxParallelism) {
        return MathUtils.murmurHash(keyHash) % maxParallelism;
    }
相关推荐
乐迪信息13 小时前
乐迪信息:船舶AI逆行检测算法在单向航道中的强制管控
大数据·人工智能·安全·计算机视觉·目标跟踪
NOCSAH14 小时前
统好AI数智平台CRM:用自然语言高效管理客户
大数据·人工智能·统好ai·数智一体化平台
STLearner15 小时前
WWW 2026 | 时空数据(Spatial Temporal)论文总结(交通预测,人群移动,轨迹表示,信控等)
大数据·论文阅读·人工智能·深度学习·机器学习·数据挖掘·自动驾驶
摸鱼仙人~15 小时前
从Demo到可用:TodoWrite 幻觉问题优化指南
大数据·人工智能
唐可盐15 小时前
【数据治理实践】第 15 期:数据质量提升实战——从“问题发现”走向“根因根治”
大数据·人工智能·数据治理·数字化转型·数据资产·数据资产入表
切糕师学AI15 小时前
Elasticsearch 列式存储详解:Doc Values 的原理与实践
大数据·elasticsearch·搜索引擎·列式存储
Crazy CodeCrafter16 小时前
小城消费降级,服装实体要跟风转线上吗?
大数据·人工智能·自动化·开源软件
财经资讯数据_灵砚智能16 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月4日
大数据·人工智能·python·信息可视化·自然语言处理·ai编程
色空大师17 小时前
【ElasticSearch(ES)】安装及介绍
大数据·elasticsearch·搜索引擎·搜索
第二只羽毛17 小时前
C++高性能内存池6(面试题)
大数据·开发语言·c++