Flink学习6-自定义分区器介绍

这篇具有很好参考价值的文章主要介绍了Flink学习6-自定义分区器介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 背景说明
    我们都知道自定义source是可以自定义并行度的,数据读写有几个并行度就意味着有几个分区。那么怎么控制我想要的数据流入到指定分区呢?flink1.12官方文档给我们提供了一下几种方式,接下来我们分别进行讨论。
    Flink学习6-自定义分区器介绍

  2. partitionCustom分区器
    按照官方的原话翻译过来就是使用一个用户自定义的分区策略为每一个元素分配一个目标task。这里的的分区策略官方提到了两种:第一个是下标,第二个是字段。Flink学习6-自定义分区器介绍
    下面看一个实例

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class TestParaPartition {
    public static void main(String[] args) throws Exception{
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(3);
        test01(env);
        env.execute();
    }
    public static void test01(StreamExecutionEnvironment env){
        DataStreamSource<String> elements = env.fromElements("zhangsan", "lisi", "wangwu");
       elements.map(new MapFunction<String, Tuple2<String,String>>() {
           @Override
           public Tuple2<String, String> map(String value) throws Exception {
               return Tuple2.of("value is: ", value);
           }
       }).partitionCustom(new TestPartition(),1)
               .map(new MapFunction<Tuple2<String, String>, String>() {
                   @Override
                   public String map(Tuple2<String, String> value) throws Exception {
                       System.out.println("当前线程是:"+Thread.currentThread().getId()+"   value is : "+value.f1);
                       return value.f1;
                   }
               })
               .print();
    }
    
}

自定义分区逻辑

import org.apache.flink.api.common.functions.Partitioner;

/**
 * 自定义分区器
 */
public class TestPartition implements Partitioner<String> {

    @Override
    public int partition(String s, int i) {
        if("zhangsan".equals(s)){
            return 0;
        }else if("lisi".equals(s)){
            return 1;
        }else{
            return 2;
        }

    }
}
  1. shuffle分区器
    Flink学习6-自定义分区器介绍
    Flink学习6-自定义分区器介绍
    从源码可以看出shuffle分区器自己定义了一个ShufflePartitioner类,此方法里用了随机数将元素随机分配到一个分区里。所以我们无需再定义使用方式,直接调用此分区器即可。

  2. rebalance分区器
    Flink学习6-自定义分区器介绍
    Flink学习6-自定义分区器介绍
    从实现类看出rebalance分区器是第一个元素是随机选择一个分区下发,然后下一个元素通过取模的方式轮询下发。这样就可以将元素均分分布在每一个分区。而shuffle分区器可能会导致数据下发到同一个分区里。使用方式同shuffle分区器直接调用方法即可。

  3. rescale分区器
    Flink学习6-自定义分区器介绍
    Flink学习6-自定义分区器介绍
    上游操作向其发送元素的下游操作子集取决于上游和下游操作的并行度。例如,如果上游操作具有并行度2,下游操作具有并行性4,则一个上游操作将元素分配给两个下游操作,而另一个上游作业将分配给其他两个下游作业。另一方面,如果下游操作具有并行度2,而上游操作具有并行性4,则两个上游操作将分配给一个下游操作,而另两个上游作业将分配给其他下游操作。
    在不同的并行不是彼此的倍数的情况下,一个或多个下游操作将具有来自上游操作的不同数量的输入。
    区别于rebalance分区器它是从下游第一个分区开始轮训,而且还是pointwise分发模式。(Flink中有两种分发模式:pointwise 和 all-to-all,两者时间复杂度不同,前者为O(n)后者为O(n)^2,所以在pointwise分发模式下可以减少网络开销。)但对比rebalance分区器其数据均衡性不足。

  4. broadcast分区器
    Flink学习6-自定义分区器介绍
    Flink学习6-自定义分区器介绍
    上游所有分区数据会自动给下游所有分区分发一份,分发模式是all-to-all。所以这里官方也提示不支持选择分区。文章来源地址https://www.toymoban.com/news/detail-412694.html

到了这里,关于Flink学习6-自定义分区器介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flink1.14新版KafkaSource和KafkaSink实践使用(自定义反序列化器、Topic选择器、序列化器、分区器)

    在官方文档的描述中,API FlinkKafkaConsumer和FlinkKafkaProducer将在后续版本陆续弃用、移除,所以在未来生产中有版本升级的情况下,新API KafkaSource和KafkaSink还是有必要学会使用的。下面介绍下基于新API的一些自定义类以及主程序的简单实践。 官方文档地址: https://nightlies.apache.o

    2024年01月21日
    浏览(54)
  • Flink|《Flink 官方文档 - DataStream API - 用户自定义 Functions》学习笔记 + 源码分析

    学习文档:Flink 官方文档 - DataStream API - 用户自定义 Functions 学习笔记如下: 用户可以通过实现接口来完成自定义 Functions。 实现接口并使用的样例: 使用匿名类实现的样例: 使用 Lambda 表达式实现(Java 8)样例: 所有的 Flink 函数类都有其 Rich 版本,在 Rick function 中,可以获

    2024年01月18日
    浏览(48)
  • 44、Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示例--网上有些说法好像是错误的

    一、Flink 专栏 Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。 3、

    2024年02月09日
    浏览(44)
  • 【Flink】Flink 的八种分区策略(源码解读)

    Flink 包含 8 种分区策略,这 8 种分区策略(分区器)分别如下面所示,本文将从源码的角度解读每个分区器的实现方式。 GlobalPartitioner ShufflePartitioner RebalancePartitioner RescalePartitioner BroadcastPartitioner ForwardPartitioner KeyGroupStreamPartitioner CustomPartitionerWrapper 该分区器会将所有的数据都

    2024年04月10日
    浏览(37)
  • 机器学习笔记之最优化理论与方法(十)无约束优化问题——共轭梯度法背景介绍

    本节将介绍 共轭梯度法 ,并重点介绍共轭方向法的逻辑与几何意义。 关于 最小化 二次目标函数: min ⁡ f ( x ) = min ⁡ 1 2 x T Q x + C T x begin{aligned}min f(x) = min frac{1}{2} x^T mathcal Q x + mathcal C^T xend{aligned} min f ( x ) = min 2 1 ​ x T Q x + C T x ​ ,其中 Q ∈ R n × n ; Q ≻ 0 mathcal Q

    2024年02月09日
    浏览(48)
  • 07-Flink的keyby怎么实现的分区?分区、分组的区别是什么?

    Keyby实现原理: 对指定的key调用自身的hashCode方法=》hash1 调用murmruhash算法,进行第二次hash =》键组ID 通过一个公式,计算出当前数据应该去往哪个下游分区: 键组id * 下游算子并行度 / 最大并行度(默认128) 分区:算子的一个并行实例可以理解成一个分区,是物理上的资源

    2024年02月11日
    浏览(37)
  • Flink状态编程之按键分区状态

    在实际应用中,我们一般都需要将数据按照某个 key 进行分区,然后再进行计算处理;所 以最为常见的状态类型就是 Keyed State。之前介绍到 keyBy 之后的聚合、窗口计算,算子所 持有的状态,都是 Keyed State。 另外,我们还可以通过富函数类(Rich Function)对转换算子进行扩展、

    2024年01月25日
    浏览(42)
  • Flink系列之:动态发现新增分区

    为了在不重新启动 Flink 作业的情况下处理主题扩展或主题创建等场景,可以将 Kafka 源配置为在提供的主题分区订阅模式下定期发现新分区。要启用分区发现,请为属性partition.discovery.interval.ms设置一个非负值。 flink程序增加自动发现分区参数: flink.partition-discovery.interval-mil

    2024年02月13日
    浏览(41)
  • Flink处理函数(2)—— 按键分区处理函数

     按键分区处理函数(KeyedProcessFunction):先进行分区,然后定义处理操作 定时器(timers)是处理函数中进行时间相关操作的主要机制 定时服务(TimerService)提供了注册定时器的功能 TimerService 是 Flink 关于时间和定时器的基础服务接口: 六个方法可以分成两大类:基于处理时

    2024年01月21日
    浏览(44)
  • flink重温笔记(五):Flink 流批一体 API 开发——物理分区(下)

    前言 :今天是学习 flink 的第五天啦! 主要学习了物理分区较难理解的部分,在这个部分的三个分区的学习中, rescale partition 和 forward partition 其原理可以归类 pointwise 模式,其他的 partition 其原理可以归类 all_to_all 模式,而比较有趣的是 custom partitioning,这个可以进行根据值

    2024年02月19日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包