iceberg调研checklist清单 |
序号 | 功能点 | 问题现象 | 解决方案 | 结论 | 是否解决 |
1 | iceberg在Hive、Spark、Flink 中ddl 基本操作表 | 1.SQL的方式分在hive建表在spark,flink中查看、操作不了; 2.SQL的方式分spark或者flink建 表在hive中查看、操作不了; | 1.hive建表中要添加 ROW FORMAT SERDE ? 'org.apache.iceberg.mr.hive.HiveIcebergSerDe' STORED BY ? 'org.apache.iceberg.mr.hive.HiveIcebergStorageHandler' ; 同时 在TBLPROPERTIES? 中配置 'engine.hive.enabled' = 'true'; | 1.各引擎中dll 操作表略有不同, 支持hive操作的要注意配置指定项; 2.spark 中ddl 操作丰富一些,支持力度高 | ?是 |
2 | catalog 引用 | 1.进入库中,iceberg表与hive 表同时查看不了 | 1.注册hive的catalog ,同时也注册iceberg表的catalog, 切换到hive的catalog 使用show tables 可以同时看到hive表 和iceberg 表 | 1.catalog 类型不同,使用的表的时候最好要写全名称 即 catalog.database.table | 是 |
3 | 隐藏分区 | 1.spark建表隐藏分区表,hive 与flink 看不了 | 1.隐藏分区只能在spark中建立,hive,flink不支持,使用的时候icerberg 表自动权限条件进行筛选 | 1.隐藏分区一般用在时间上,使用相对应的时间转换函数 进行转换 | 是 |
4 | Metadata/metadata.json 文件过多 | 1.每次checkpoint 都会会产一个新的文件,导致metadata.json过多 | 1.配置 'write.distribution-mode'='hash', 'write.metadata.delete-after-commit.enabled'='true', 'write.metadata.previous-versions-max'='5', 保持最近5个,加上正在使用的,一共能看到6个,这个数字可配置 | 1.0.11版本后可以实现自动合并 | 是 |
5 | Metadata/snap.avro? 快照过期 | 1.每次checkpoint 都会会产一个新的快照,根据官方文档发现只能 手动执行Spark 或者Flink 的java API 才能设置过期,想看看能不能t和metadata.json 一样,通过配置实现自动清理 | 1.暂时没有发现自动设置过期快照,目前只能通过 java API的方式 实现,指定时间戳 | 自动设置过期功能期待中 | 是 |
6 | data 小文件过多合并清理删除 | 1.每次checkpoint 都会会产一个新的文件,导致数据小文件过多, 通过java API可以实现合并,定期删除孤文件,根据业务时间进行的分区,发现有操作分区,删除不掉孤文件; 2.如果快照时间过期设置比较靠近当时快照,在执行合并和删除孤文件,有可能会导致 程序报错,流写入程序也报错的情况 | 1.发生此现象是由于 合并文件中间的时间差过短,短时间内执行合并操作,发现并无变化,隔长时间段再次合并,如果发现合并后产生的新的文件,那么就可以清理掉 2.如果不指定时间,默认会删除3天前的孤文件,如果指定了时间,离快照比较近,因为是流式入湖的流式数据,和压缩合并程序在同时操作一个表,如果该程序在删除无用文件的同时,其他两个程序很有可能正在读取或者写入,这样会导致删除了一些元数据文件,两程序会报错 | 设定快照过期的时间之前的文件 才能形成孤文件,才能被删除 | 是 |
7 | v1 v2 表流读流写 | 1.v1表支持流读流写,v2支持流写,不支持流读 2.v1数据是 append 的不是 change log stream , 导致过多的无用数据 3.v2 是支持 upsert ,操作,却不支持下游流读,形成不了pipeline | 1.目前尝试spark merge into 方案,在验证中 | spark merge into 最终生成的是overwrite 操作,overwrite 不能流读,所以结论就是 流表 只做append , change log stream 只能做结果表 | 是 |
8 | 表中时间的读取 | 1.flink建表字段,timestamp 在spark 中查无法查看 | 1.flink timestamp 分有时区与无时区的概念,spark查看, 需要配置 set `spark.sql.iceberg.handle-timestamp-without-timezone`=true;? | flink与spark时间字段略有不同,细节问题 | 是 |
9 | flink读流表 | 1.直接读取发现是批读 | 1.flink 默认是批读,流读要指定参数 SET execution.type = streaming ; SET table.dynamic-table-options.enabled=true; select * from sample_stream_test01 /*+ OPTIONS('streaming'='true', 'monitor-interval'='1s')*/? ; | 注意官方API | 是 |
10 | flink流kafka表写入到iceberg表 | 1.正常提交任务,任务也很正常,有数据byte流动,,iceberg表中却无数据 | 1.设置checkpoint点,才能正常写入 | iceberg 必须得设置checkpoint | 是 |
11 | spark 代码 流读表 | 1.sparkspark.readStream.format("kafka"), df.writeStream.format("console") ?.trigger(Trigger.ProcessingTime("2 seconds")) 打印不出来数据 | 1.一定要设置.option("checkpointLocation", "~/tmp/ll") 路径, 路径根据实际情况是否写本地,或者 hdfs | 1.如果发现也都设置了还是没有执行不了, 可手动 删除 指定路径 | 是 |