日志表

本文将介绍Fluss的日志表。

基本概念

日志表(Log Table)是 Fluss 中的一种表类型,用于按照数据写入的顺序存储数据。日志表仅支持追加记录,不支持更新或删除操作。通常情况下,日志表用于存储高吞吐量的日志数据,类似于 Apache Kafka 的典型应用场景。

日志表是通过在 CREATE TABLE 语句中不指定PRIMARY KEY子句来创建的。例如,以下 Flink SQL 语句将创建一个包含 3 个分桶的日志表。

CREATE TABLE log_table (
  order_id BIGINT,
  item_id BIGINT,
  amount INT,
  address STRING
)
WITH ('bucket.num' = '3')
;

其中,'bucket.num' 应该为一个大于 0 的整数。如果不填该值,则系统将采用集群的默认值(1)作为该表的分桶数量。

桶分配策略

分桶(Bucketing)是 Fluss 中实现并行化和可扩展性的基本单元。Fluss 中的单个表会被划分为多个桶,每个桶是读写操作的最小存储单位。向日志表写入记录时,Fluss 会根据分桶分配策略将每条记录分配到特定的桶中。Fluss 提供以下三种分桶分配策略:

  • 黏性桶策略(默认策略)

    随机选择一个桶并持续写入,直到已经达到了设定的最大容量(如大小或记录条数限制) ,无法再继续写入更多记录。

  • 轮询策略

    在写入每条记录前,按轮询方式选择目标桶。

  • 基于哈希的分桶

    将根据指定桶键(bucket keys)的哈希值分配记录。

更多详情请参见数据分桶

数据的消费

Fluss中的日志表支持实时数据消费,并严格保持每个桶内数据的写入顺序。具体规则如下:

  • 同一表且同一桶的两条数据记录:先写入 Fluss 表的数据会优先被消费。

  • 同一表但不同桶的两条数据记录:消费顺序无法保证,因为不同桶可能由不同的数据消费任务并行处理。