处理flink广播流中的大数据

时间:2020-07-24 06:22:40

标签: java apache-kafka apache-flink flink-streaming broadcast

我正在使用Flink流式 Java 应用程序,输入源为Kafka。我的应用程序中总共使用了4个流。一个是主数据流,另外三个是广播流。

流A是主要流,它从Kafka连续流出。

流B是浓缩数据的数据集。流B是流C,流D,流E的组合流。这是一个很大的流(所有三个流的大小都很大)。

流C,流D,流E流对象类型不同。 (例如,一种流类型是Employee,另一种类型是AttendanceDetails,另一种是SalaryDetails,等等。)

我使用 Either 类型加入了三个广播流。我已经将其作为流B进行广播,并且能够在“广播流程功能”上下文状态(即在processBroadcastElement()中)接收。

我的问题是

  1. 是否可以在广播状态下存储大数据?

  2. 是否可以广播大数据?

如果可能的话,存储大数据意味着可以在广播状态下存储多少数据(即数据大小),并且可以应用容错和 Flink检查点?我的Flink系统内存和存储大小为:

       Memory: 8 GB
       Disk Size: 20-25 GB

如何为Flink中的广播状态配置内存大小?

注意:据我了解,Flink广播状态在运行时会保存在内存中(这意味着广播状态不会存储在rockdb中),并且广播流用作低吞吐量事件流。从目前开始,RocksDB状态后端无法用于操作员状态。

1 个答案:

答案 0 :(得分:0)

广播状态的工作副本始终在堆上;不在RocksDB中。因此,它必须足够小以适合内存。此外,每个实例会将所有广播状态复制到其检查点,因此所有检查点和保存点将具有广播状态的 n 个副本(其中 n 是并行性)。

如果您可以对此数据进行关键分区,则可能不需要广播它。听起来可能是由employeeId键入的每个员工数据。但是,如果没有,则必须将其保持足够小以适合内存。