- 博客(72)
- 资源 (4)
- 收藏
- 关注
原创 hudi系列-schema evolution(一)
在非schema on read模式下对schema进行变更需要注意以下情况可以增加新字段,但是建议只是追加,而且新schema数据需写入成功后才进行查询可以删减字段,一般不建议不可以改变列的数据类型不支持更改列名。
2024-06-27 18:42:07 220
原创 hudi系列-schema evolution
hudi对schema evolution进行了统一设计,在官网文档中也指明了从0.11版本开始,spark-sql ddl是支持schema evolution的,而flink-sql在旧版本中并不支持ddl方式对表结构,所以full schema evolution都隐藏在读写过程中。对于使用者,我们最终只关心表的读和写,但从实现层面来看,schema evolution需要覆盖不同的数据文件格式,还需要集成在各种hudi的表服务中。
2024-04-15 19:31:26 263
原创 【flink】Rocksdb TTL状态全量快照持续递增
rocksdb的压缩与sst文件数量和大小有关,所以猜测全量快照大小到达一个比较大的值后应该不会继续增长可以调整rocksdb的压缩策略,使压缩变得更“积极”,但是肯定会消耗更多资源rocksdb + MapState + TTL组合使用,建议使用增量快照方式。
2024-02-26 08:53:29 708
原创 【flink】状态清理策略(TTL)
三种状态清理策略不是互斥的,并不是三选一的问题,一般是全量快照清理配合另两个其中的一个来使用(需要根据不同的state backend),可以看到StateTtlConfig.CleanupStrategies.strategies是一个集合来的。
2023-12-22 18:19:02 1444
原创 【flink】基于flink全量同步postgres表到doris
flink有doris connector进行数据写入,实际是stream load方式(每个checkpoint都会开启一个streamload,期间sink算子接收的数据会通过http chunked机制流式往BE写),这个方式受streaming_load_max_mb参数限制,即一次checkpoint周期内数据的大小上限,因此我们期望的是流式读取postgres源表,同时周期性地触发checkpoint,每次checkpoint都将大表的部分数据归到一个streamload往doris提交,这样
2023-12-06 18:38:54 965
原创 【flink】ColumnarRowData
在调试flink读取parquet文件时,读出来的数据是,由于parquet是列式存储的文件格式,所以需要用一种列式存储的表示方式,就是用来表示列式存储的一行数据,它包含多个数组的数据结构,每个数组都代表一个列,并且数组中的元素是该列中的值,系统可以有效地加载和处理需要的列,从而提高查询性能,并减少不必要的数据访问和计算。RowData。
2023-07-21 18:12:39 1067
原创 hudi系列-KeyGenerator & 分区提取器
KeyGenerator和分区提取器都是插件化,并均提供了多种开箱即用实现,基本能覆盖常用的场景。两者的选择主要是依赖于分区的数量和数据类型。
2023-07-18 09:26:53 1083
原创 hudi系列-timeline service
Timeline Service(时间线服务)是hudi的一个组件,用于暴露接口给客户端,是一个基于Javalin+Jetty实现的web服务。当客户端使用远程文件系统视图()时,就是访问时间线服务http接口默认情况下,如果开启了时间线服务,则它运行在JobManager(如果是spark,则在driver中),所有写任务都会向它发出请求。
2023-06-26 19:23:54 1531
原创 【flink】SinkUpsertMaterializer
在flink cdc同步数据时,基于sql的实现方式中发现了作业DAG有个算子,而且检查checkpoint历史时发现该算子state越来越大,有必要搞清楚为什么会多了这个算子,作用又是什么。通过算子名称定位到了源码为类,这个算子将输入的记录以作区分保存到state中,并为下游算子提供一下upsert视图。单纯看类注释和代码逻辑,并不能理解它的用处及设计背景。
2023-06-16 18:02:53 4639 1
原创 hudi系列-文件系统视图(FileSystemView)
hudi表的数据一直在演变过程中,存储在文件系统中的数据文件也在不断增加和版本迭代,hudi提供了的文件系统视图(filesystem view)来简单、直观地了解表中的数据分布情况、数据文件的状态和变化,以及数据的版本控制信息。SliceView当然,文件系统视图持续进行着自我更新、重置,以保持最新视图。
2023-06-13 14:08:01 1842
原创 hudi系列-append写过程
Append模式每次都生成新的parquet文件,不涉及数据修改、去重。cow+insert一直是append模式,mor+insert在0.13.1后也统一走append写流程append写过程比upsert简单直接得多,因此写入性能远优于upsert.
2023-06-08 14:51:38 1830
原创 hudi系列-小文件优化
hudi使用mvcc来实现数据的读写一致性和并发控制,基于timeline实现对事务和表服务的管理,会产生大量比较小的数据文件和元数据文件。大量小文件会对存储和查询性能产生不利影响,包括增加文件系统的开销、文件管理的复杂性以及查询性能的下降。对于namenode而言,当整个集群中文件数到了几千万,就已经会变得很不稳定了。
2023-06-05 15:04:48 1941
原创 hudi系列-upsert写过程
hudi有很多种写入流程,使用不同的表类型、写类型()、索引类型(IndexType),流程上都会有所差异。使用flink流式写MOR表场景比较多,顺道梳理一下这个流程的细节。
2023-04-23 18:11:55 1808 1
原创 【flink】cdc 1.x 分析
是flink的一个数据源,将debezium引擎读取的数据注入到flink系统中,这个过程是生产者-消费者模式,使用该模式是为了兼容全量阶段和增量阶段两种不同行为,其中。,它是通过事务来提供一致性数据视图,同步阶段产生的变更在该事务中不可见,而是在增量阶段消费这些变更日志,所以刚好能做到恰好一次。是debezium默认的内置引擎,独立运行在一个线程,启动了一个连接器任务,并持续从连接器中阻塞地拉取源数据,最后将数据交由。为了一致性数据快照,mysql cdc在同步全量数据过程中一直处于锁表,
2023-04-20 22:04:54 1606
原创 hudi系列-增量查询ckp超时
hudi在对mor进行增量查询时会出现首次checkpoint超时报错,从现象到原因分析,并提出几种解决方案进行对比。
2023-04-08 19:00:00 1465
原创 hudi系列-基于cdc应用与优化
曾经做数据同步受存储引擎和采集工具的限制,经常都是全量定时同步,亦或是以自增ID或时间作为增量的依据进行增量定时同步,无论是哪种,都存在数据延时较大、会重复同步不变的数据、浪费资源等问题。后来刚接触canal时还大感惊奇,基于mysql的binlog可以这么方便实时同步最新数据,然而历史数据的初始化仍然得使用第三方ETL工具来全量同步。直到flink cdc项目诞生,完全解决了前面的痛点。实时技术的发展已经不能满足于数据只能实时采集,还需要实时地进行数据建模和数据分析,即全链路实时。
2023-03-30 20:03:21 1253
原创 hudi系列-数据写入方式及使用场景
hudi支持多种数据写入方式:insert、bulk_insert、upsert、boostrap,我们可以根据数据本身属性(append-only或upsert)来选择insert和upsert方式,同时也支持对历史数据的高效同步并嫁接到实时流程。
2023-03-14 16:51:14 2212 2
原创 superset基于docker修改数据库
如果使用内置的数据库,到时容器均衡负载和迁移都很麻烦,所以希望扩展一个连接到外部固定数据库的镜像。在自定义镜像基础上启动容器,并把superset默认端口8088映射到18088。superset原生安装比较麻烦,所以选择docker方式进行安装,官方提供了
2023-03-07 09:11:09 1476
原创 【flink】 各种join类型对比
动态表(dynamic table):动态表是流的另一种表达方式,动态表作为一个逻辑的抽象概念,使我们更容易理解flink中将streaming发展到table这个层次的设计,本质都是对无边界、持续变更数据的表示形式,所以动态表与流之间可以相互转换。版本表(dynamic table):动态表之上的定义,版本是一个拥有主键和时间属性的动态表(建表语句必需包含PRIMARY KEY和WATERMARK),所以版本表可以追踪每个key在某时间点/时间内的变化情况。
2023-02-22 19:07:34 3962
原创 hudi系列-不支持flink计算列
有个hudi mor的事实表,需要与外部的维表进行关联以生成明细宽表,方案是基于flink sql对事实表进行增量查询,同时与外部的维表进行lookup join,除了无需编码之外,通过jdbc的方式连接外部表还能利用flink jdbc-connector的缓存功能。这种join方式要求事实表必须有一个处理时间(process time)属性,所以在定义事实表时增加了一个计算列从flink sql的角度来看,这并没什么毛病,但是直接查这个表的数据时就会报错。
2023-02-18 22:55:59 1926 1
原创 hudi系列-文件布局(file layout)
hudi的文件布局是能实现增量查询、数据更新等特性的基础,每个hudi表有一个固定的目录,存放元数据(.hoodie)以及数据文件,其中数据文件可以以分区方式进行划分,每个分区有多个数据文件(基础文件和日志文件),这些数据文件在逻辑上被组织为文件组、文件分片上面的示例中,2023-02-15这个分区下有一个文件组,文件中组中有3个文件切片,其中一个只有log文件,一个只有base文件。
2023-02-16 09:17:33 1617
原创 Doris fe启动失败
由于一直有配置priority_network且机器没更改过网络配置,所以肯定是第二个原因,所以尝试启动另一个FE,注意,此时上面那个192.168.21.5是没完全启动的(9030 mysql查询端口)根本没起来。找到元数据最新那个FE节点(192.168.21.5),以metadata_failure_recovery=true启动,它将会成为master,然后去掉配置重启,把其它follow删掉重新添加。这是 bdbje 的一个 bug,尚未解决。此时另一个FE报了另外一个错。
2023-01-29 10:57:12 6549
原创 hive metastore去掉明文密码
hive metastore 在使用 remote 模式时,需要在 hive-site.xml 中配置远程数据库的连接信息在生产环境中肯定不能随意暴露明文密码,经过查找,还没发现可以支持配置加密密码,在使用时解密的处理方案。但是可以通过 Hadoop Credential Providers 功能把密码保存到密钥库中,然后移除配置文件中的密码项。
2023-01-03 15:48:07 1931 1
原创 hudi系列-索引机制
hudi的索引机制是为了加速upsert/delete操作,它维护着(分区 + key)-> fileID之间的映射关系,所以可以减少对非必要base文件的合并key是指索引key,可以是表的任意字段,在全局索引中常用主键key作为索引。
2023-01-03 09:50:15 2161
原创 hudi系列-设置合理清理策略
在中介绍了清理的大致流程,除了可以防止文件系统的无限膨胀,它是必须的。hudi提供三种查询方式:读优化、快照读、增量读,无论是哪种方式,由于hudi的文件组织是有版本的概念(FileGroup,FileSlice),旧版本的文件持续在执行清理,如果被清理的文件正在读取或者即将被读取到,那岂不是很影响使用,所以我们需要设置合理的清理策略保障上层数据处理任务的平稳运行,提高系统的容错性。可以通过来配置使用以上哪一种清理策略。
2022-11-08 20:56:32 3279 1
原创 【flink】算子ID生成
一般来说在使用Streaming Api编程时都建议给算子自定义uid,特别有些转换涉及到状态,因为算子ID是算子和状态之间的纽带,一直都认为指定的uid就是最终的算子ID。但是在基于flink sql层次编程时,很多时候并不清楚整个job最由多少个算子组成,也不知道每个算子的ID是怎么生成的,以及如果进行个修改会不会不能从状态中恢复。
2022-10-25 14:50:31 4629
原创 hudi系列-文件归档(archive)
hudi会不断生成commit、deltacommit、clean等类型的Instant从而形成活跃时间轴(ActiveTimeline),随着时间增长,时间轴变长,.hoodie元数据目录下的文件不断累积,为了限制元数据文件数量,需要对一些比较久远的元数据文件进行归档,保存到.hoodie/archived目录下,可以称之为归档时间轴(ArchivedTimeline)。
2022-09-16 15:43:18 6016
原创 【flink】运行方式和部署模式
flink的命令参数不可谓不多,常用的应该是用来提交job,从命令梳理了一下运行方式和部署模式。flink可以以local或cluster方式运行job,一般来说在本地开发调试时就以local在idea中运行,完成后就提交到cluster.根据资源管理器不同又可以分为standalone,yarn,k8s等,从命令参数也可以看出,flink对yarn和k8s的支持是最好的。
2022-09-09 17:57:58 7723 2
原创 hudi系列-文件压缩(compaction)
压缩(compaction)仅作用于MergeOnRead类型表,MOR表每次增量提交(deltacommit)都会生成若干个日志文件(行存储的avro文件),为了避免读放大以及减少文件数量,需要配置合适的压缩策略将增量的log file合并到base file(parquet)中。...
2022-08-17 17:13:17 8056
原创 hudi系列-旧文件清理(clean)
hudi采用的是mvcc设计,提供了清理工具cleaner来把旧版本的文件分片删除,默认开启了清理功能,可以防止文件系统的存储空间和文件数量的无限增长。
2022-08-04 15:30:00 8653
原创 hudi系列-流式增量查询
hudi的两大特性流式查询和支持upsert/delete,hudi的数据变更是基于timeline的,所以时间点(Instant)就成为了实现增量查询的依据。在与flink集成中,当开启了流式读,其实就是一个持续的增量查询的过程,可以通过配置参数read.start-commit和read.end-commit来指定一个无状态的flinkjob的初始查询范围。...............
2022-07-29 17:06:24 8261
原创 Spark序列化 & Encoders
spark序列化方式分布式的程序存在着网络传输,无论是数据还是程序本身的序列化都是必不可少的。spark自身提供两种序列化方式:java序列化:这是spark默认的序列化方式,使用java的ObjectOutputStream框架,只要是实现了java.io.Serializable接口的类都可以,这种方式虽然通用但是性能差,占用的空间也比较大kryo序列化:相比于java序列化,kryo更高效且序列化结果紧凑,占用空间小,但是不能序列化所有数据类型,且为更好的性能,需要在程序中注册需要序列化的类
2022-02-12 12:56:05 10701
原创 Spark数据格式UnsafeRow
1. 简介UnsafeRow是InternalRow的子类,它表示一个可变的基于原始内存(raw-memory)的二进制行格式,简单来说UnsafeRow代表一行记录,用于替代java对象(属于Tungsten计划的一部分,可以减少内存使用以及GC开销)InternalRow:spark sql内部使用的表示行的抽象类,对应表示输出的行有org.apache.spark.sql.Row/GenericRow/GenericRowWithSchema2. 类属性private Object base
2022-01-14 12:49:22 8514 2
原创 Spark统一内存划分
文章目录executor内存逻辑架构Executor 界面内存计算UnrollMemory理解参考executor内存逻辑架构堆内存,由JVM分配和回收,由spark.executor.memory控制大小,JVM中序列化的对象是以字节流形式,其占用内存大小可直接计算,对于非序列化对象,其占用的内存是通过周期性地采样近似估算,且被spark标记为释放的对象实例也有可能并没有被JVM回收,所以spark并不能准确记录实际可用堆内存,也就无法避免内存溢出非堆内存,不受JVM管理,有两部分,其中一部分通
2022-01-06 11:29:08 8459
原创 kudu设计-tablet
1. 逻辑组成tablettablet是kudu表的一个水平分区,类似于Hbase的region概念。每个tablet包含一个连续主键范围的记录,不同tablet的键范围不会有重叠,一个表的所有tablet就组成了这个表完整的键空间,充分利用kudu的分区功能,可以有效避免数据热点问题。RowSet每个tablet由若干个RowSet构成,一个RowSet由一组行数据组成,对于给定一个k......
2020-05-07 11:26:58 8076 4
原创 java并发-AbstractQueuedSynchronizer
AQS是个什么东西AbstractQueuedSynchronizer是java并发包下大部分的同步组件的底层基础框架,包括ReentrantLock、Semaphore、CountDownLatch等,有点类似在上文中可以基于ThreadPoolExecutor构造FixedThreadPool,CachedThreadPool,SingleThreadExecutor。虽然在开发中很少基于A...
2020-01-21 15:17:06 7708
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人