一、资料准备

1、mysql地址选择

因为阿里云只读节点binlog保留时间短,需要用读写集群地址。可以登录阿里云控制台查看地址是只读还是读写,不清楚的话可以找dba要读写地址。

二、Iceberg概念

1、Iceberg选择合适的表版本

简述:Iceberg目前有两个表版本(V1和V2),根据数据选择合适的表版本。

V1表只支持增量数据插入,适合做纯增量写入场景,如埋点数据。

V2表才支持行级更新,适合做状态变化的更新,如订单表同步。

使用方式:建表语句时指定版本'format-version'='2',不指定参数默认使用V1

2、建表类型转换问题

简述:mysql表create_time大多为timestamp类型,同步到iceberg后使用spark查询会报timezone错误。

原因:源表没有timezone, 下游表需要设置local timezone

使用方式:建iceberg表时指定字段类型为TIMESTAMP_LTZ类型

3、任务全量同步和增量同步配置

简述:全量同步阶段需要速度快,可以把flink checkpoint设置为1分钟,并发可以调高(比如1CU*10)这样可以快速同步数据。同时要考虑你的数据源能支持多快抽取,评估好抽取并发,否则dba会找你。

增量阶段一般数据量比较低了,全量同步完后可以调小资源和并发(比如0.5CU*1)然后重新发布可以节省资源。mysql增量阶段只能单线程跑,设置并发多也没用

三、任务开发

1、建表

可以联系平台在spark客户端建表

(1)Iceberg v2更新表sql(只有v2表才支持更新数据,v1表只能追加数据)
CREATE TABLE data_lake_ods.test3(
id bigint COMMENT 'unique id',
`empcode` STRING
)USING iceberg
TBLPROPERTIES(
'format-version'='2'
,'write.upsert.enabled'='true'
,'engine.hive.enabled'='true'
,'table.drop.base-path.enabled'='true'
); (2)Iceberg v1非更新表sql(不支持数据更新,适合只有insert场景,如埋点数据)
CREATE TABLE data_lake_ods.test3 (
`id` int ,
`empcode` STRING
) USING iceberg; (3)修改表format版本或其他属性
alter table data_lake_ods.test3 SET TBLPROPERTIES('format-version'='2');

2、删表-腾讯定制(spark客户端方式删表)

简述:和hive删表不一样,iceberg默认只删除元数据不清理hdfs表目录,删表语句后面需要加purge关键字可删除。腾讯特殊改造过包

功能描述:默认drop table 不会清理hdfs数据,使用官方 DROP TABLE spark_catalog.db.sample PURGE时会清理数据,但是还留存【表/data】、【表/metadata】文件。

修改包:iceberg-spark-runtime-3.2_2.12-1.3.1.jar

社区提交代码:https://github.com/apache/iceberg/pull/1839/files

官方ddl文档:https://iceberg.apache.org/docs/1.3.1/spark-ddl/

使用方式:

!!!使用优化后的icebrg包

在建表时需要开启'table.drop.base-path.enabled'='true'

删表时:DROP TABLE data_lake_ods.test3 PURGE;

3、新增字段

ALTER TABLE data_lake_ods.table_name ADD COLUMN `event_timestamp` timestamp COMMENT 'kafka更新时间戳';

4、插入和更新数据

insert into table data_lake_ods.test3 values (1,"code1");
update data_lake_ods.test3 set empcode='code2' where id=1;

5、数据集成建数据源

6、配置同步任务

1)数据源高级参数

--优化抽数速度,如非均匀分布表,设置此参数可以加快分片速度

scan.incremental.snapshot.chunk.size=50000

--最后一个分片切割,适用于同步时间长的大表,在同步后新增数据很多场景
scan.lastchunk.optimize.enable=true

2)任务高级参数

--由于分布式系统中的 shuffle 会造成 ChalgeLog 数据的乱序,所以 sink 接收到的数据可能在全局的 upsert 中乱序,所以要在 upsert sink 之前添加一个 upsert 物化算子。该参数控制是否添加

table.exec.sink.upsert-materialize=NONE

7、整库同步--同步前设置高级参数,整库同步支持新表自动同步

mysql新增加表后iceberg会自动新加表,mysql删表后iceberg会暂停这个表的同步,任务不会中止,iceberg表不会删除

scan.newly-added-table.enabled=true

8、查询数据

presto引擎: select * from data_lake_ods.test1 limit 200

kyuubi引擎: select * from data_lake_ods.test1 limit 200

9、iceberg表治理

原因:实时程序每个checkpoint写入都会生成多个文件,小文件太多会影响下游查询速度,逐渐变慢直到不可用。所以需要每天定时治理任务小文件

http://127.0.0.1:9090/luoshu/

全量数据同步完成后,修改checkpoint为5分钟以上,在洛书平台设置治理任务。

四、任务运维注意事项

因每次插入数据都会生成一个快照和很多小文件,为预防快照和小文件过多影响查询速度,需要定时清理。请全量同步完成时,配置治理任务开始治理

治理平台:http://127.0.0.1:9090/luoshu/

1、小文件合并

简述:全量同步后因为每分钟一次checkpoint会生成大量的小文件,全量同步结束后需要做一下小文件合并,提高查询速度。

参考信息:Iceberg小文件合并测试

2、过期快照清理

全量同步后因为每分钟一次checkpoint会产生大量快照,全量同步结束后需要做一下快照清理,提高查询速度。

参考信息:Iceberg过期快照清理

五、附录

1、建表优化

建表时设置metadata.json保留版本个数

功能描述:每次插入数据都会生成一个metadata文件,插入次数太多会影响查询,所以设置保留版本个数

详细介绍和测试文档:Iceberg元数据合并-metadata.json文件

CREATE TABLE data_lake_ods.test3 (
`id` int ,
`empcode` STRING
) USING iceberg
TBLPROPERTIES(
'format-version'='2'
,'write.metadata.delete-after-commit.enabled'='true'
,'write.metadata.previous-versions-max'='3'
);
--插入和更新数据
insert into table iceberg_test.test3 values (1,"code1");
update iceberg_test.test3 set empcode='code2' where id=1;

使用iceberg-使用Iceberg数据湖需要注意的点的更多相关文章

  1. 使用 Iceberg on Kubernetes 打造新一代云原生数据湖

    背景 大数据发展至今,按照 Google 2003年发布的<The Google File System>第一篇论文算起,已走过17个年头.可惜的是 Google 当时并没有开源其技术,& ...

  2. 均有商业公司支持!2023再看数据湖 hudi iceberg delta2 社区发展现状!

    开源数据湖三剑客 Apache hudi.Apache iceberg .Databricks delta 近年来大动作不断. 2021年8月,Apache Iceberg 的创始人 Ryan Blu ...

  3. 印度最大在线食品杂货公司Grofers的数据湖建设之路

    1. 起源 作为印度最大的在线杂货公司的数据工程师,我们面临的主要挑战之一是让数据在整个组织中的更易用.但当评估这一目标时,我们意识到数据管道频繁出现错误已经导致业务团队对数据失去信心,结果导致他们永 ...

  4. 对话Apache Hudi VP, 洞悉数据湖的过去现在和未来

    Apache Hudi是一个开源数据湖管理平台,用于简化增量数据处理和数据管道开发,该平台可以有效地管理业务需求,例如数据生命周期,并提高数据质量.Hudi的一些常见用例是记录级的插入.更新和删除.简 ...

  5. JuiceFS 在数据湖存储架构上的探索

    大家好,我是来自 Juicedata 的高昌健,今天想跟大家分享的主题是<JuiceFS 在数据湖存储架构上的探索>,以下是今天分享的提纲: 首先我会简单的介绍一下大数据存储架构变迁以及它 ...

  6. 从 Delta 2.0 开始聊聊我们需要怎样的数据湖

    盘点行业内近期发生的大事,Delta 2.0 的开源是最让人津津乐道的,尤其在 Databricks 官宣 delta2.0 时抛出了下面这张性能对比,颇有些引战的味道. 虽然 Databricks ...

  7. 重磅!flink-table-store 将作为独立数据湖项目重新加入 Apache

    数据湖是大数据近年来的网红项目,大家熟知的开源数据湖三剑客 Apache hudi.Apache iceberg .Databricks delta 近年来野蛮生长,目前各自背后也都有商业公司支持,投 ...

  8. lamba数据架构以及数据湖

    面试大数据项目,面试过程中发现面试官提到的两个概念没有搞清楚: 1. lamba数据架构:这个概念的提出是由storm的作者提出来的,其实主旨就是想要说明,数据的处理分成三层,一类是批处理程序(bat ...

  9. 构建企业级数据湖?Azure Data Lake Storage Gen2不容错过(上)

    背景 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 数据湖的核心功能, ...

  10. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(中)

    引言 相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 因此数据湖相关服务 ...

随机推荐

  1. 轻松使用线程: 不共享有时是最好的——利用 ThreadLocal 提高可伸缩性

    Brian Goetz (brian@quiotix.com), 软件顾问 简介: ThreadLocal 类是悄悄地出现在 Java 平台版本 1.2 中的.虽然支持线程局部变量早就是许多线程工具( ...

  2. Ubuntu下xrdp登陆故障解决方案

    故障描述: Ubuntu使用xrdp远程桌面运行一段时间后,出现登陆错误: xrdp_mm_process_login_response: login failed 原因分析: 远程桌面没有正确关闭所 ...

  3. LeetCode题集-5 - 最长回文子串(一)

    题目:给你一个字符串 s,找到 s 中最长的回文子串. 这一题作为中等难度,常规解法对于大多数人应该都没有难度.但是其中也有超难的解决办法,下面我们就一起由易到难,循序渐进地来解这道题. 01.暴力破 ...

  4. ruoyi若依前端验证码不显示的终极解决方法-20230721

    ​搞了3天啊,查了各种资料啊. 然后使劲的看log啊,总算搞定了啊. 一般情况,本地开发环境测试没问题,部署到服务器就各种不适应,就是服务器配置的问题了. 本次这种验证码不显示,典型的nginx的配置 ...

  5. JVM简介—2.垃圾回收器和内存分配策略

    大纲 1.垃圾回收概述 2.如何判断对象存活 3.各种引用介绍 4.垃圾收集的算法 5.垃圾收集器的设计 6.垃圾回收器列表 7.各种垃圾回收器详情 8.Stop The World现象 9.内存分配 ...

  6. 关于Java的UUID

    UUID或者UNID或者UID,是一个统一唯一标识,可以用来标记文档.数据或其它需要唯一标识的东西.Java 5.0内置UUID的实现,见java.util.UUID. 下面代码是找到的2种实现方式, ...

  7. Qt编写可视化大屏电子看板系统25-模块3设备监控

    一.前言 设备监控主要用来实时监测制造零件等使用的设备的工作运行状态,每个设备都有对应的需要.分组名称.分组编号.设备名称.文字1.文字2.工作状态(1-开机 2-待机 3-维护 4-空),不同的工作 ...

  8. Qt编写地图综合应用26-覆盖物交互

    一.前言 百度地图本身提供了非常友好完善的JS函数接口用于添加各种覆盖物,比如标注点.矩形区域.圆形区域.不规则线段.弧形等,基本上涵盖了各种应用场景,官方的文档和示例也是比较完善的,虽然示例用的都是 ...

  9. [转]gcc的-g,-o,-c,-D,-w,-W,-Wall,-O3等参数的意义

    一.-g -g可执行程序包含调试信息-g为了调试用的加个-g 是为了gdb 用,不然gdb用不到 二.-o -o指定输出文件名-o output_filename,确定输出文件的名称为output_f ...

  10. vue引入element-ui插件 “export ‘default‘ (imported as ‘Vue‘) was not found in ‘vue‘

    注意:出现该问题的原因主要是使用的Vue版本与Element-UI的版本不匹配. Vue.Vue-cli与Element-UI之间版本的正确的匹配关系是: Vue库版本 Vue-cli库版本 Elem ...