Flink系列:Broadcast的使用方法

本文探讨了Flink中Broadcast和Accumulator两种机制的不同。Broadcast能让只读变量在所有工作节点上共享但不可修改,而Accumulator则支持在不同任务间累加操作,其结果仅在任务结束时可见。

 

区别

DataStream 中的 Broadcast (分区规则):分区规则是把元素广播给所有的分区,数据会被重复处理
DataStream.broadcast ()
 
 
Flink 中的 Broadcast(广播变量〉功能
Broadcast可以理解为一个公共的共享变量。可以把一个 DataSet(数据集)广播出去,不同的Task在节点上都能够获取到它,这个数据集在每个节点上只会存在一份
如果不使用,则需要每个节点的每个task都要保存一份(一个节点存在多份)
 
 

Flink Broadcast和Accumulator 的区别

• Broadcast 允许将1个只读的变量缓存在多台机器上,而不用在任务之间传递变量。广播变量可以进行共享 ,但是不可以进行修改

• Accumulator 可以在不同任务中对同1个变量进行累加操作,但是只有在任务执行 结束的时候才能获得累加器的最终结果

提供的引用内容中未提及Flink SQL中广播的相关信息,以下是关于Flink SQL中广播的使用和原理的介绍: ### 原理 在Flink中,广播变量允许用户将一个数据集广播到所有的并行任务中。在Flink SQL里,广播表是一种特殊的表,它会被复制到每个并行的任务实例中。当一个流表和广播表进行连接时,每个并行实例都可以在本地访问广播表的数据,而不需要进行数据的网络传输,这样可以显著提高连接操作的性能。 ### 使用方法 以下是一个简单的Flink SQL中使用广播表的示例代码: ```java import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; public class FlinkSQLBroadcastExample { public static void main(String[] args) throws Exception { // 创建流执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建表执行环境 StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env); // 创建主表 tableEnv.executeSql("CREATE TABLE main_table (\n" + " id INT,\n" + " name STRING\n" + ") WITH (\n" + " 'connector' = 'datagen',\n" + " 'rows-per-second' = '10'\n" + ")"); // 创建广播表 tableEnv.executeSql("CREATE TABLE broadcast_table (\n" + " id INT,\n" + " config STRING\n" + ") WITH (\n" + " 'connector' = 'datagen',\n" + " 'rows-per-second' = '1'\n" + ")"); // 广播表配置 tableEnv.executeSql("CREATE TEMPORARY SYSTEM FUNCTION BroadcastJoin AS 'org.apache.flink.table.functions.BroadcastJoinFunction';"); // 执行广播连接查询 tableEnv.executeSql("SELECT main_table.id, main_table.name, broadcast_table.config\n" + "FROM main_table\n" + "JOIN broadcast_table FOR SYSTEM_TIME AS OF main_table.proctime\n" + "ON main_table.id = broadcast_table.id") .print(); // 执行作业 env.execute("Flink SQL Broadcast Example"); } } ``` 在上述代码中,首先创建了主表`main_table`和广播表`broadcast_table`,然后通过`JOIN`操作将主表和广播表进行连接。 ### 最佳实践 - **数据量控制**:广播表的数据量应该较小,因为它会被复制到每个并行任务中,如果数据量过大,会导致内存压力增大。 - **更新频率**:广播表的数据更新频率不宜过高,因为每次更新都需要将新的数据广播到所有的并行任务中,会带来一定的开销。 - **一致性保证**:在使用广播表进行连接操作时,需要考虑数据的一致性问题,确保在广播表更新时,主表的数据不会出现不一致的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NIO4444

如果对您有帮助,欢迎打赏支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值