Flink 广播-broadcast

在Apache Flink中,"广播"是一种特殊的数据分发模式,用于将数据从一个并行操作传播到整个作业的所有并行任务中。广播操作对于将少量数据有效地分发给并行任务,以便它们能够共享这些数据而不必进行昂贵的网络通信,是非常有用的。它通常用于将配置信息、静态数据集或参考数据传播给Flink作业中的所有并行任务。

广播的主要优势在于,它避免了将数据通过网络发送到所有并行任务的开销,而是直接将数据复制到每个任务的本地内存中。这样,任务可以直接从本地内存访问数据,无需进行远程通信。这对于那些需要频繁访问同一份数据的场景非常有利,可以显著降低作业的整体延迟。

  1. 配置参数传播: 广播非常适合将配置参数传播到所有并行任务。例如,如果您的Flink作业需要根据特定的配置进行处理,您可以将这些配置参数广播到所有任务中,避免了每个任务单独获取配置的开销。

  2. 规则和字典传递: 在一些数据处理场景中,需要使用一组静态的规则或字典进行数据转换或处理。通过广播这些规则或字典,可以避免每个任务都去加载这些数据,从而减少处理延迟和资源消耗。

  3. 静态数据集共享: 如果您有一个静态数据集(不随时间变化)需要在整个作业的所有任务之间共享,广播可以提供一种高效的方式来共享这些数据,而不需要进行重复传输。

  4. 机器学习模型参数共享: 在机器学习任务中,有时候需要将训练好的模型参数广播给所有任务,以便它们在进行推断或预测时能够共享这些参数,避免重复计算。

  5. 数据分片信息: 在一些任务中,需要根据数据的分片信息来进行特定处理。通过广播数据分片信息,所有任务可以了解到数据的分片情况,从而更有效地进行处理。

  6. 数据缓存: 当需要频繁访问同一份数据时,通过广播将数据复制到每个任务的本地内存中,可以避免重复从磁盘或网络读取数据,从而提高处理性能。

需要注意的是,广播适用于较小的数据集。如果广播的数据集非常大,超过了内存容量,反而可能导致性能问题,因为它会消耗过多的内存资源。

在Flink中,要实现广播操作,需要遵循以下步骤:

  1. 创建要广播的数据集:首先,您需要准备要广播的数据集。通常,这是一个小型的静态数据集,例如配置参数、字典、规则等。这些数据将被广播到整个作业的所有并行任务中。

  2. 广播数据集:一旦您有了要广播的数据集,您需要使用broadcast()方法将其标记为广播数据集。这将会在作业的整个执行过程中将数据复制到所有任务的本地内存中。

  3. 使用广播数据集:在作业的其他部分,您可以通过调用withBroadcastSet()方法将广播数据集传递给算子函数。这样,每个并行任务都可以访问广播数据集,而不必重新复制或通过网络通信。

    java 复制代码
    package com.fwmagic.flink.batch;
    
    import org.apache.flink.api.common.functions.MapFunction;
    import org.apache.flink.api.common.functions.RichMapFunction;
    import org.apache.flink.api.common.restartstrategy.RestartStrategies;
    import org.apache.flink.api.common.time.Time;
    import org.apache.flink.api.java.DataSet;
    import org.apache.flink.api.java.ExecutionEnvironment;
    import org.apache.flink.api.java.operators.DataSource;
    import org.apache.flink.api.java.tuple.Tuple2;
    import org.apache.flink.configuration.Configuration;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    /**
     * Broadcast操作
     */
    public class Broadcast {
    
        public static void main(String[] args) throws Exception {
            ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
            env.setRestartStrategy(RestartStrategies.fixedDelayRestart(4,Time.of(10, TimeUnit.SECONDS)));
            //1、准备要广播的数据
            ArrayList<Tuple2<String,Integer>> broadData = new ArrayList<>();
            broadData.add(new Tuple2<>("zs", 23));
            broadData.add(new Tuple2<>("ls", 34));
            broadData.add(new Tuple2<>("ww", 45));
    
            //1.1 处理需要广播的数据,把数据集转成map,key为name,value为age
            DataSet<HashMap<String, Integer>> dateSet = env.fromCollection(broadData).map(new MapFunction<Tuple2<String, Integer>, HashMap<String, Integer>>() {
                @Override
                public HashMap<String, Integer> map(Tuple2<String, Integer> tuple) throws Exception {
                    HashMap<String,Integer> hashMap = new HashMap<>();
                    hashMap.put(tuple.f0, tuple.f1);
                    return hashMap;
                }
            });
    
            //源数据
            DataSource<String> dataSource = env.fromElements("zs", "ls", "ww");
    
            //注意:在这里需要使用到RichMapFunction获取广播变量
            DataSet<String> result = dataSource.map(new RichMapFunction<String, String>() {
    
                List<HashMap<String, Integer>> broadcastMap = new ArrayList<>();
                HashMap<String, Integer> allMap = new HashMap<>();
    
    
                @Override
                public void open(Configuration parameters) throws Exception {
                    broadcastMap = getRuntimeContext().getBroadcastVariable("mybroadcastdata");
                    for (HashMap<String, Integer> map : broadcastMap) {
                        allMap.putAll(map);
                    }
                }
    
                @Override
                public String map(String name) throws Exception {
                    Integer age = allMap.get(name);
                    return name + "," + age;
                }
    
            }).withBroadcastSet(dateSet, "mybroadcastdata");
    
            result.print();
        }
    }
相关推荐
IT毕设梦工厂18 分钟前
大数据毕业设计选题推荐-基于大数据的国家医用消耗选品采集数据可视化分析系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·信息可视化·spark·毕业设计·数据可视化·bigdata
华略创新1 小时前
利用数据分析提升管理决策水平
大数据·数据分析·crm·管理系统·软件
pingao1413781 小时前
PG-210-HI 山洪预警系统呼叫端:筑牢山区应急预警 “安全防线”
大数据·人工智能·科技
庄小焱1 小时前
大数据存储域——Kafka设计原理
大数据·kafka·消息中间件
Elastic 中国社区官方博客2 小时前
带地图的 RAG:多模态 + 地理空间 在 Elasticsearch 中
大数据·人工智能·elasticsearch·搜索引擎·ai·语言模型·全文检索
做萤石二次开发的哈哈3 小时前
萤石安全生产监管解决方案:构建企业安全智能化防护网
大数据·人工智能
万米商云3 小时前
碎片化采购是座金矿:数字化正重构电子元器件分销的价值链
大数据·人工智能·电子元器件·供应链采购
健康有益科技3 小时前
大模型食材识别技术革新:AI重构精准营养管理
大数据·人工智能·计算机视觉·重构
天翼云开发者社区4 小时前
flink on k8s的基本介绍
大数据
问道飞鱼4 小时前
【大数据相关】ClickHouse命令行与SQL语法详解
大数据·sql·clickhouse