Flink Broadcast 广播变量

本文详细介绍了Flink中的Broadcast广播变量功能,包括如何通过withBroadcastSet进行广播数据设定及通过getBroadcastVariable获取广播数据的过程。文章还提供了Java与Scala代码示例,并强调了广播变量在节点内存中的存储方式及使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Broadcast 广播变量:一句话解释,可以理解为是一个公共的共享变量,我们可以把一个dataset 数据集广播出去,然后不同的任务在节点上都能够获取到,这个数据在每个节点上只会存在一份。如果不使用broadcast,则在每个节点中的每个任务中都需要拷贝一份dataset数据集,比较浪费内存(也就是一个节点中可能会存在多份dataset数据)。

 

Broadcast variables允许你创建一个数据集在所有的并行操作节点都能获取到,除了常规的输入操作。针对一些小的依赖数据集,这种方式是非常有用的,这个data set数据集将会作为一个Collection集合被操作访问。

 

  • Broadcast(广播数据) :通过withBroadcastSet(DataSet, String) 进行广播数据,并给这份数据起名字
  • Access(获取数据):通过getRuntimeContext().getBroadcastVariable(String)获取广播出去的数据

java代码示例

// 1. 准备等待广播的DataSet数据
DataSet<Integer> toBroadcast = env.fromElements(1, 2, 3);

DataSet<String> data = env.fromElements("a", "b");

data.map(new RichMapFunction<String, String>() {
    @Override
    public void open(Configuration parameters) throws Exception {
      // 3. 获取广播的DataSet数据 作为一个Collection
      Collection<Integer> broadcastSet = getRuntimeContext().getBroadcastVariable("broadcastSetName");
    }


    @Override
    public String map(String value) throws Exception {
        ...
    }
}).withBroadcastSet(toBroadcast, "broadcastSetName"); // 2. 广播DataSet

scala代码示例

// 1. 准备等待广播的DataSet数据
val toBroadcast = env.fromElements(1, 2, 3)

val data = env.fromElements("a", "b")

data.map(new RichMapFunction[String, String]() {
    var broadcastSet: Traversable[String] = null

    override def open(config: Configuration): Unit = {
      // 3. 获取广播的DataSet数据 作为一个Collection
      broadcastSet = getRuntimeContext().getBroadcastVariable[String]("broadcastSetName").asScala
    }

    def map(in: String): String = {
        ...
    }
}).withBroadcastSet(toBroadcast, "broadcastSetName") // 2. 广播DataSet

 

确保在广播的时候,和获取数据的时候使用相同的broadcastSetName名称。

 

注意:

1:广播出去的变量存在于每个节点的内存中,所以这个数据集不能太大。因为广播出去的数据,会常驻内存,除非程序执行结束。

2:广播变量在初始化广播出去以后不支持修改,这样才能保证每个节点的数据都是一致的。

 

个人建议:如果数据集在几十兆或者百兆的时候,可以选择进行广播,如果数据集的大小上G的话,就不建议进行广播了。

 

 

获取更多大数据资料,视频以及技术交流请加群:

 

 

 

 

 

 

 

 

 

Flink中,可以通过广播变量Broadcast Variables)来实现变量的共享。广播变量是一种基于数据流的分布式共享机制,可以将一个数据集广播到所有Task中,从而实现Task之间的变量共享。 具体实现步骤如下: 1. 在程序中定义需要共享的变量。 2. 使用`ExecutionEnvironment`或者`StreamExecutionEnvironment`的`broadcast`方法将变量转换为`BroadcastVariable`。 3. 在算子中通过`getRuntimeContext().getBroadcastVariable(name)`方法获取广播变量,从而实现变量的共享。 注意:广播变量只能在算子函数中访问,不能在全局范围内访问。 示例代码: ``` val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment // 定义需要共享的变量 val config: Map[String, String] = Map("key1" -> "value1", "key2" -> "value2") // 将变量转换为BroadcastVariable val broadcastConfig: BroadcastVariable[Map[String, String]] = env.fromElements(config).broadcast() // 在算子中获取广播变量 val stream = env.socketTextStream("localhost", 9999) .map(new RichMapFunction[String, String] { var configMap: Map[String, String] = _ override def open(parameters: Configuration): Unit = { // 获取广播变量 configMap = getRuntimeContext.getBroadcastVariable[Map[String, String]]("config").get(0) } override def map(value: String): String = { // 使用共享变量 val key1 = configMap.getOrElse("key1", "") val key2 = configMap.getOrElse("key2", "") value + key1 + key2 } }) .withBroadcastSet(broadcastConfig, "config") stream.print() env.execute("Broadcast Variable Demo") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值