- 博客(43)
- 收藏
- 关注
原创 Merge-On-Read
Merge-On-Read,顾名思义,就是在读取的时候进行合并,是与Copy-On-Write相反的一种模式在Iceberg中,Merge-On-Read同样用于行级更新,整体过程如下当更新数据时,Iceberg不再Copy一份旧数据,而是直接将更新数据写入独立的一个文件用来标识需要删除的数据这种模式减少了写入时的合并操作,但是加重了读取数据时的合并操作,因此适合写多读少的场景。
2024-07-20 10:23:02
1325
原创 Iceberg Copy-On-Write
Copy-On-Write:顾名思义,就是在写入的时候进行复制,最初是计算机领域用来解决读多写少场景下的并发访问控制问题的如下,在Copy-On-Write模式下,用户写数据时,会先将原始数据Copy出一份副本,此时其他用户读数据时仍然读取的是原始的数据;之后进行写的用户对副本进行修改,修改完成以后,将访问指向的原始数据替换为修改后的数据;替换完成后,用户访问都会访问这个被修改过的数据Copy-On-Write在读多写少的场景下可以提供有效的性能,因为读操作不受影响,可以一直正常访问资源数据。
2024-07-20 10:10:35
1100
原创 FlinkSQL ChangeLog
登录sql-client,创建一个upsert-kafka的sql作业(注意,这里发送给kafka的消息必须带key,普通只有value的消息无法解析,这里的key即是主键的值)发送消息带key和消费消息显示key方式如下作业的DAG图如下。
2024-03-02 09:40:59
2082
原创 Flink分区相关
真正有用的信息是在table表的信息当中,核心在tables.put(tablePath, table.copy());这一句当中,table.copy()存储了表信息,最终调用到实现类CatalogTableImpl,其父类的构造函数有分区信息。表中存储了相应的分区信息,SQL最终操作的都是表,所以都是从这取的分区信息,注意这是一个StringList。
2024-02-29 19:47:55
770
原创 Range-Encoded Bit-Slice Index
算法使用Bit-Sliced Range-Encoded BitMap算法,在基础bitmap的基础上,添加了范围查询和Bit-Sliced范围查询用来弥补bitmap范围查询能力弱的问题;Bit-Sliced用来降低索引Key值的存储数量,进而降低整体索引的空间占用BSI就是Bit-Sliced,即将数值按位切分表示,用更少的内容代表更多的数据,通常有十进制方式和二进制方式,二进制方式更佳。
2024-02-29 09:43:07
1402
原创 Spark Bloom Filter Join
Bloom Filter Join,或者说Row-level Runtime Filtering(还额外有一条Semi-Join分支),是Spark 3.3对运行时过滤的一个最新补充之前运行时过滤主要有两个:动态分区裁剪DPP(开源实现)、动态文件裁剪DFP(Databricks实现),两者都能有效减少数据源层面的Scan IOBloom Filter Join的主要优化点是在shuffle层,通过在join shuffle前对表进行过滤从而提高运行效率。
2024-02-28 10:15:04
1665
原创 Iceberg Flink FLIP-27实现
前面步骤完成后是把所有的分片全部放在了assigner当中,没有进行分配。分配在AbstractIcebergEnumerator接口当中定义,这是Iceberg当中enumerator的最上层父类,直接实现Flink的SplitEnumeratorSplitEnumerator定义了handleSourceEvent接口,负责处理来自读取器的自定义消息,有SourceCoordinator调用LOG.debug(subtask,
2024-02-28 09:37:56
1409
原创 Flink动态分区裁剪
静态分区裁剪的原理跟谓词下推是一致的,只是适用的是分区表,通过将where条件中的分区条件下推到数据源达到减少分区扫描的目的动态分区裁剪应用于Join场景,这种场景下,分区条件在join的一侧,另一侧无法应用条件进行裁剪静态分区裁剪是静态的规则优化下推,动态分区裁剪是运行时过滤,通过对有条件一侧的表进行过滤,提取结果中的分区数据,然后传递到另一侧的表中进行数据过滤。
2024-02-27 20:38:48
1246
原创 Iceberg小文件合并
Iceberg提供了Actions来进行小文件合并,需要手动调用执行这个任务目前仅仅将小文件进行了合并生成大文件,但旧的文件并没有删除,也就是文件反而变多了功能一路调用,到RowDataRewriter类中的rewriteDataForTasks这里构建Flink任务,核心是RewriteMap的算子,其map方法如下,本质是读取并写入数据注意,这边小文件合并任务是多并发的,目前flink的并发度这里不提供配置,所以用的是flink的parallelism.default的值。
2024-02-27 20:26:06
1373
原创 FLIP27-Source
Source通常有两个核心的部件:当前的Source接口就是用来创建SplitEnumerator和Reader的工厂类。
2024-02-27 20:16:24
1102
原创 DolphinScheduler
可以看到时间的具体处理在WorkflowExecuteRunnable的call,根据事件的状态不同,做分支处理,核心三个步骤:buildFlowDag、initTaskQueue、submitPostNode。转换之后,run方法中的最后一步就是执行ProcessInstance,这里是发送一个执行的事件请求,具体的操作在WorkflowExecuteRunnable。前面提到,点击执行后整个流程走到发送WorkflowEvent事件这一步,之后就是基于事件进行处理,这里有一个循环调用迭代处理的过程。
2024-02-27 20:03:55
1264
原创 Flink Catalog
按照SQL的解析处理流程在Parse解析SQL以后,进入执行流程——executeInternal。其中有个分支专门处理创建Catalog的SQL命令创建Catalog会去全包查找对应的CatalogFactory的子类,然后使用配置的子类构建这里注意,上面的步骤只查询classpath下的类,像HiveCatalog这种外置增加的,在这个步骤里找不到,会抛出NoMatchingTableFactoryException异常之后继续其他步骤处理来获取。
2024-02-27 19:59:13
1638
原创 计算引擎CodeGen
解释执行:生成的是非机器码,需要通过中间的解释器翻译成机器码然后执行,一行一行读取翻译,所以执行效率低编译执行:直接生成机器码,执行效率高,但编程难度也高,而且跨平台能力差。
2023-08-05 16:00:24
642
原创 Flink Adaptive Batch Scheduler
自适应批调度器,即自动推导设置作业并行度,无需用户手动设置作业并行度,由Flink根据用户设置的期望及作业执行情况,自动设置作业的并行度。
2023-08-05 15:52:01
437
原创 DolphinScheduler作业流程
之后第一个任务按正常流程走完,由WorkflowExecuteRunnable的handleEvents处理结束事件,到TaskStateEventHandler当中,走回WorkflowExecuteRunnable的taskFinished,成功和失败都有submitPostNode的调用,这次的输入是结束的任务。submitPostNode当中有工作流任务拆分的过程,在submitPostNode当中,解析DAG图,由于第一次进来parentNodeCode,所以这里只获取到第一个任务。
2023-08-05 15:46:02
793
原创 Flink Catalog
Flink提供了基础的Catalog接口,自定义Catalog实现此接口即可此外还有一个CatalogFactory接口,用于创建Catalog。
2023-08-03 21:07:31
432
原创 Iceberg读取过程
与写入过程类似,IcebergTableSource对标IcebergTableSink,produceDataStream对标consumeDataStream,在Flink SQL的同一处理流程中产生这里稍微特殊的是,由于Flink的Source提供了两版实现,所以produceDataStream也根据条件内部有两条分支。FLIP27是Flink新的Source结构以传统的DataStream追踪,通过FlinkSource的build构建,分批和流两种场景。
2023-08-03 21:02:15
473
原创 Flink优化规则-JoinConditionEqualityTransferRule
Flink扩展的规则,是做相等条件传递的,目前只在批执行模式下有应用l_a = r_b and l_a = r_c的条件推导出 r_b = r_c,同时l_a = r_b和l_a = r_c只会保留一个。
2023-08-03 20:50:22
142
原创 Iceberg写入接口
Iceberg写数据文件时的类调用关系:TaskWriter -> BaseRollingWriter -> FileWriter -> FileAppender -> Iceberg封装的文件类型实现类 -> 具体文件类型的实现类。
2023-05-26 18:29:09
397
原创 Flink类加载
1.配置以下三个是主要的加载方式配置,其他还有一些插件加载和加载异常处理的配置1、classloader.resolve-orderchild-first(默认)、parent-first。从业务代码加载类时的策略,即先检查业务包还是按通常的java加载机制2、classloader.parent-first-patterns.default指定哪些类首先通过父类加载器解析,默认主要是java、flink、log4j一系列的3、classloader.parent-first-patterns.
2022-05-14 10:41:55
2679
Flink FFA Flink Towards Streaming Data Warehouse
2024-02-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人