本文来自官网: https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/operators/#physical-partitioning

Flink还通过以下函数对转换后的数据精确流分区进行低级控制(如果需要)。

1、自定义分区

  使用用户定义的分区程序为每个元素选择目标任务。

  1. dataStream.partitionCustom(partitioner, "someKey")
  2. dataStream.partitionCustom(partitioner, 0)

如简单的hash 分区(下面的实例不是官网):

  1. val input = env.addSource(source)
  2. .map(json => {
  3. // json : {"id" : 0, "createTime" : "2019-08-24 11:13:14.942", "amt" : "9.8"}
  4. val id = json.get("id").asText()
  5. val createTime = json.get("createTime").asText()
  6. val amt = json.get("amt").asText()
  7. LateDataEvent("key", id, createTime, amt)
  8. })
  9. .setParallelism(1)
  10. .partitionCustom(new Partitioner[String] {
  11. override def partition(key: String, numPartitions: Int): Int = {
  12. // numPartitions 是下游算子的并发数
  13. key.hashCode % numPartitions
  14. }
  15. }, "id")
  16. .map(l => {
  17. LateDataEvent(l.key, l.id, l.amt, l.createTime)
  18. })
  19. .setParallelism(3)

注:key 是传入的field 的类型

2、随机分区

根据均匀分布随机分配元素(类似于: random.nextInt(5),0 - 5 在概率上是均匀的)

  1. dataStream.shuffle()

源码:

  1. @Internal
  2. public class ShufflePartitioner<T> extends StreamPartitioner<T> {
  3. private static final long serialVersionUID = 1L;
  4.  
  5. private Random random = new Random();
  6.  
  7. @Override
  8. public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {
    // 传入下游分区数
  9. return random.nextInt(numberOfChannels);
  10. }
  11.  
  12. @Override
  13. public StreamPartitioner<T> copy() {
  14. return new ShufflePartitioner<T>();
  15. }
  16.  
  17. @Override
  18. public String toString() {
  19. return "SHUFFLE";
  20. }
  21. }

3、均匀分区  rebalance

分区元素循环,每个分区创建相等的负载。在存在数据偏斜时用于性能优化。

  1. dataStream.rebalance()

源码:

  1. public class RebalancePartitioner<T> extends StreamPartitioner<T> {
  2. private static final long serialVersionUID = 1L;
  3.  
  4. private int nextChannelToSendTo;
  5.  
  6. @Override
  7. public void setup(int numberOfChannels) {
  8. super.setup(numberOfChannels);
  9.  
  10. nextChannelToSendTo = ThreadLocalRandom.current().nextInt(numberOfChannels);
  11. }
  12.  
  13. @Override
  14. public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {
  15. // 轮训的发往下游分区
  16. nextChannelToSendTo = (nextChannelToSendTo + 1) % numberOfChannels;
  17. return nextChannelToSendTo;
  18. }
  19.  
  20. public StreamPartitioner<T> copy() {
  21. return this;
  22. }
  23.  
  24. @Override
  25. public String toString() {
  26. return "REBALANCE";
  27. }
  28. }

4、rescale

分区元素循环到下游操作的子集。如果您希望拥有管道,例如,从源的每个并行实例扇出到多个映射器的子集以分配负载但又不希望发生rebalance()会产生完全重新平衡,那么这非常有用。这将仅需要本地数据传输而不是通过网络传输数据,具体取决于其他配置值,例如TaskManagers的插槽数。
上游操作发送元素的下游操作的子集取决于上游和下游操作的并行度。例如,如果上游操作具有并行性2并且下游操作具有并行性4,则一个上游操作将元素分配给两个下游操作,而另一个上游操作将分配给另外两个下游操作。另一方面,如果下游操作具有并行性2而上游操作具有并行性4,那么两个上游操作将分配到一个下游操作,而另外两个上游操作将分配到其他下游操作。在不同并行度不是彼此的倍数的情况下,一个或多个下游操作将具有来自上游操作的不同数量的输入。

  1. dataStream.rescale()

源码:

  1. public class RescalePartitioner<T> extends StreamPartitioner<T> {
  2. private static final long serialVersionUID = 1L;
  3.  
  4. private int nextChannelToSendTo = -1;
  5.  
  6. @Override
  7. public int selectChannel(SerializationDelegate<StreamRecord<T>> record) {
    if (++nextChannelToSendTo >= numberOfChannels) {
  8. nextChannelToSendTo = 0;
  9. }
  10. return nextChannelToSendTo;
  11. }
  12.  
  13. public StreamPartitioner<T> copy() {
  14. return this;
  15. }
  16.  
  17. @Override
  18. public String toString() {
  19. return "RESCALE";
  20. }
  21. }

很遗憾这段代码只能看出,上游分区往下游分区发的时候,每个上游分区内部的数据是轮训发到下游分区的(没找到具体分配的地方,从这段代码debug,一直往上,找到分区出现在 RuntimeEnvironment 的对象里面,找不具体分配的地方)。

5、广播

向每个分区广播元素。

  1. dataStream.broadcast()

Flink 物理分区的更多相关文章

  1. linux下vmware的安装、物理分区使用及卸载

    1.安装 先下载安装文件VMware-Workstation-Full-12 在命令行下执行下载的文件安装即可(需要root权限) wget https://download3.vmware.com/ ...

  2. 扩大缩小Linux物理分区大小

    由于产品在不同的标段,设备硬盘也不同, 有些500G,有些320G有些200G,开始在大硬盘上做的配置,想把自己定制好的Linux克隆到小硬盘上,再生龙会纠结空间大小的问题, 因此需要做一些分区的改变 ...

  3. ubuntu下挂载物理分区到openmediavault4

    准备弄个NAS,但还没想好直接买现成,还是自己组装一台,先在虚拟机上体验下OpenMediaVault4和黑群晖.主系统是ubuntu,但刚买的时候这笔记本是装windows的,除了ubuntu的系统 ...

  4. aliyun添加数据盘后的物理分区和lvm逻辑卷两种挂载方式

    一.普通磁盘分区管理方式 1.对磁盘进行分区 列出磁盘 # fdisk -l # fdisk /dev/vdb Welcome to fdisk (util-linux 2.23.2). Change ...

  5. linux 分区 物理卷 逻辑卷

    今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk   -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...

  6. linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例

    转自:truemylife.linux磁盘 分区 物理卷 卷组 逻辑卷 文件系统加载点操作案例 基本概念: 磁盘.分区.物理卷[物理部分] 卷组[中间部分] 逻辑卷.文件系统[虚拟化后可控制部分] 磁 ...

  7. Flink学习笔记:Operators串烧

    本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKhaz ...

  8. <译>Flink编程指南

    Flink 的流数据 API 编程指南 Flink 的流数据处理程序是常规的程序 ,通过再流数据上,实现了各种转换 (比如 过滤, 更新中间状态, 定义窗口, 聚合).流数据可以来之多种数据源 (比如 ...

  9. flink学习笔记-split & select(拆分流)

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

随机推荐

  1. pandas数据类型判断(三)数据判断

    1.函数:空值判断 1)判断数值是否为空用 pd.isna,pd.isnull,np.isnan2)判断字符串是否为空用 pd.isna,pd.isnull:3)判断时间是否为空用 pd.isna,p ...

  2. 2019ICPC南京网络赛B super_log——扩展欧拉定理

    题目 设函数 $$log_a*(x) = \begin{cases}-1, & \text{ if } x < 1 \\ 1+log_a*(log_ax) & \text{ if ...

  3. linux下Boost序列化问题解决

    由于项目需要,要使用boost,所以在网上找了一些例子帮助理解,其中遇到很多问题,再次总结记录一下.#include <boost/archive/text_oarchive.hpp> # ...

  4. IDEA的安装和使用

    IDEA的特色功能 IDEA所提倡的是智能编码,是减少程序员的工作,IDEA的特色功能有以下22点 [1]  : ● 智能的选取 在很多时候我们要选取某个方法,或某个循环或想一步一步从一个变量到整个类 ...

  5. UOJ426. 【集训队作业2018】石像 [状压DP,min_25筛]

    UOJ 思路 (以下思路是口胡,但正确性大概没有问题.) 刚学min_25筛的时候被麦老大劝来做这题? 结果发现这题是个垃圾二合一?? 简单推一下式子可以得到答案就是这个: \[ \sum_{T=1} ...

  6. javascript生成表格增删改查 JavaScript动态改变表格单元格内容 动态生成表格 JS获取表格任意单元格 javascript如何动态删除表格某一行

    jsp页面表格布局Html代码 <body onload="show()"> <center> <input type="text" ...

  7. Pytest权威教程06-使用Marks标记测试用例

    目录 使用Marks标记测试用例 在未知标记上引发异常: -strict 标记改造和迭代 返回: Pytest权威教程 使用Marks标记测试用例 通过使用pytest.mark你可以轻松地在测试用例 ...

  8. 模板 - 数学 - 同余 - 扩展Euclid算法

    普通的扩展欧几里得算法,通过了洛谷的扩展欧几里得算法找乘法逆元.修复了容易溢出的bug,虽然新版本仍有可能会溢出longlong,假如参与运算的数字都是longlong,假如可以的话直接使用__int ...

  9. RabbitMQ面试问答(子文章)(持续更新)

    -----> 总文章 入口 文章目录 [-----> 总文章 入口](https://blog.csdn.net/qq_37214567/article/details/90174445) ...

  10. 开源GIT仓库-----gogs

    简介:Gogs 是一款极易搭建的自助 Git 服务,其目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 Go 语 ...