flink 集成 iceberg问题 持续更新

本文分享了Flink集成Iceberg的实际经验,包括不同版本间的兼容性问题、使用过程中的常见错误及其解决方案。重点关注小文件合并导致的问题及解决办法。

调研iceberg的使用,记录下flink 集成iceberg的坑(持续更新)
简单来说 iceberg可以看作hdfs的一个文件格式,hive的升级版,提供sql操作的kafka升级版,可以用来做实时数仓,分钟级别

flink和iceberg集成以及hive的版本不兼容问题,暂为解决

目前测试1.3x flink with 0.13.x iceberg,stream api 可以正常读kafka数据源 写/读iceberg(hive/hadoop catalog)
目前测试1.11x flink with 0.11.x iceberg,stream/table api 均可正常读kafka数据源 写/读iceberg(hive/hadoop catalog)
目前测试1.3x 和1.11 数据可以互通,即使用1.13版本的stream 插入数据,如需使用sql则可以使用1.1x版本

flink stream读取iceberg时,小文件合并程序运行后导致flink 程序挂掉,报snapshot 不存在

前提:在小文件合并程序中,对data文件进行合并,并且只保留一个快照,flink 读取iceberg报错
原因:iceberg对数据的每一次写,都会产生快照,在程序中对data文件进行合并后,快照时间戳为最新,但是其他data还被其他的快照所引用,元数据找不到快照报错
解决:删除一段时间前即可

		Snapshot snapshot = table.currentSnapshot();
        // 删除一个小时前的
        long l = snapshot.timestampMillis() - 3600000;
        table.expireSnapshots().expireOlderThan(l).commit();

待续

### FlinkIceberg集成概述 Flink能够通过其SQL接口以Streaming的方式读取Apache Iceberg中的增量数据[^1]。此特性使得实时数据分析成为可能,而无需等待批量处理完成。 对于希望利用这一特性的开发者来说,在Apache Iceberg 0.10.0版本及以上实现了对Flink流批入湖的支持,不仅限于将外部源的数据导入至Iceberg中作为静态存储,还允许通过Flink执行批处理作业来查询这些已存放在Iceberg内的数据集[^2]。 ### 创建并操作Iceberg表 为了在Flink环境中创建一个新的Iceberg表,可以采用如下所示的DDL语句: ```sql CREATE TABLE IF NOT EXISTS my_iceberg_table ( id BIGINT, data STRING, event_time TIMESTAMP(3), WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND ) PARTITIONED BY (bucket(16, id)) WITH ('connector'='iceberg', 'catalog-name'='my_catalog'); ``` 上述命令定义了一个名为`my_iceberg_table`的新表格,并指定了几个字段及其类型;同时也设置了分区策略以及连接器参数用于指定目标目录位置和使用的Catalog名称。 ### 实现持续读取Iceberg表中的新记录 当涉及到从Iceberg表里获取最新的变更时,可以通过设置特定选项让Flink SQL引擎识别到这一点。下面是一个简单的例子展示如何配置这样的场景: ```sql SELECT * FROM my_iceberg_table; -- 默认情况下会返回所有历史记录加上任何后续发生的更新/插入事件。 ``` 如果仅需关注自某个时间点之后发生的变化,则可以在启动应用程序之前调整相应的配置项或者是在查询过程中加入过滤条件以限定范围。 ### 使用Python API编写应用逻辑 除了纯SQL之外,还可以借助PyFlink库开发更复杂的业务流程。这里给出一段简短的例子说明怎样加载先前建立好的Iceberg表并将其中的内容转换为DataFrame对象以便进一步分析: ```python from pyflink.dataset import ExecutionEnvironment from pyflink.table import BatchTableEnvironment, TableConfig env = ExecutionEnvironment.get_execution_environment() t_config = TableConfig() t_env = BatchTableEnvironment.create(env, t_config) result = t_env.sql_query("select * from my_iceberg_table") for row in result.execute().collect(): print(row) ``` 这段脚本初始化了必要的运行环境,并调用了`sql_query()`函数执行了一条针对`my_iceberg_table`的选择语句,最后遍历输出每一行的结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值