- 博客(202)
- 收藏
- 关注
原创 Starrocks 关于 trace 命令的说明
本文介绍了Starrocks 3.5.5中TRACE命令的使用方式,支持TIMES/VALUES/LOGS/ALL等模式,并可指定BASE/MV/OPTIMIZER等模块。在ConnectProcessor.handleQuery中通过Tracers.init初始化指定模块,仅记录选定模块的指标信息(如OPTIMIZER模块的任务执行时间),避免保留所有模块数据导致FE内存过高引发OOM。这种设计通过模块化跟踪机制有效控制了内存使用。
2025-08-05 21:21:31
115
原创 Starrocks中的 Query Profile以及explain analyze及trace命令中的区别
本文分析了Starrocks中SQL性能分析的四种方法:Query Profile、EXPLAIN ANALYZE、ANALYZE PROFILE和trace。Query Profile提供最详细的执行指标,包括BE端信息但重启后丢失;EXPLAIN ANALYZE展示简化执行计划;ANALYZE PROFILE提供更丰富的执行指标;trace则专注于特定规则耗时。通过解析SQL语法树和执行流程,文章详细说明了各方法的实现机制,其中Query Profile通过FE-BE交互收集运行时数据,而EXPLAIN
2025-08-05 19:50:43
410
原创 Starrocks ShortCircuit短路径的调度
本文分析了Starrocks 3.3.5中的点查(ShortCircuit)优化机制。点查通过跳过复杂的优化器和调度流程,直接向BE节点请求数据,相比常规查询节省了DAG构建、任务部署等时间。文章指出,在行存模式下点查只需通过PK获取单行数据,而列存模式则需要从不同列块中获取并组装数据,因此效率较低。调度机制方面,Starrocks默认采用Pipline调度,并行度参数随引擎模式切换而变化。代码分析显示,点查直接进入ShortCircuit路径,而常规查询还需经历prepareExec和deliverExe
2025-08-03 15:53:53
373
原创 Paimon中BloomFilter在key查找中的应用
本文分析了Paimon 0.9.0中BloomFilter的构造与使用机制。在构造方面,通过bfGenerator方法根据行数和误判率动态计算位数组大小和哈希函数数量,使用MemorySegment管理位数组内存。在使用方面,通过LookupLevels.createLookupFile将键值写入BloomFilter,并采用MurmurHash计算哈希值,最终通过BitSet设置对应位。整个过程实现了高效的空间占用和快速查询验证,为Paimon的查找操作提供了性能优化。
2025-07-27 09:57:56
666
原创 Paimon的部分更新以及DeleteVector实现
本文基于Paimon 0.9源码分析了主键表的部分更新和DeleteVector实现机制。部分更新通过MergeTreeWriter的SortBufferWriteBuffer和PartialUpdateMergeFunction实现,按主键+sequenceNumber排序后合并更新字段。DeleteVector在Compaction时生成,通过"Compaction+lookup"机制标记需要删除的记录,仅支持主键表且为bucket级别。核心逻辑集中在MergeTreeWriter的
2025-07-23 21:49:40
1043
原创 Spark 4.0的 VariantType 类型优点以及使用分析
Spark 4.0引入新型Variant数据类型优化半结构化数据处理,兼具JSON的灵活性和Struct类型的高性能。Variant采用二进制编码存储,无需预定义模式,支持快速查询。其核心方法getFieldByKey通过智能搜索策略(短列表线性搜索,长列表二分查找)高效获取字段值,handleObject方法解析对象元数据布局。相比JSON字符串解析,Variant直接读取二进制数据,显著提升处理速度,为半结构化数据提供了更优的存储和查询方案。
2025-07-09 07:02:53
340
原创 Spark 4.0的VariantType 类型以及内部存储
本文介绍了Spark 4.0中VariantType类型的存储机制,该类型通过优化字节存储来高效处理JSON数据。文章详细解析了VariantBuilder.buildJson方法对不同JSON数据类型(如字符串、数字、布尔值、对象等)的处理逻辑:字符串根据长度分为LONG_STR和SHORT_STR两种存储格式;数字根据范围采用INT1/2/4/8或DECIMAL4/8/16分级存储;浮点数优先尝试Decimal存储,否则用IEEE DOUBLE格式。每种类型都通过特定字节组合标识类型和存储内容,采用小端
2025-07-03 19:39:16
1008
原创 Starrocks 低基数全局字典优化
本文基于StarRocks 3.3.5版本,分析了全局字典优化中涉及的两个关键规则:AddDecodeNodeForDictStringRule和LowCardinalityRewriteRule。该优化主要针对低基数字符串列,将其改写为整型列以提高查询性能。规则通过自底向上方式遍历物理计划树,在Scan、Filter、Agg等操作中应用字典优化,并在必要时插入decode节点还原原始字符串。文章详细解读了AddDecodeNodeForDictStringRule的实现逻辑,包括优化开关检查、表类型判断、
2025-06-24 21:33:39
718
原创 Starrocks中RoaringBitmap杂谈
RoaringBitmap是高效压缩位图,简称RBM,它的原理是将 32bit int(无符号的)类型数据 划分为 2^16 个桶,即2^16=65536个桶,每个桶内用container来存放一个数值的低16位
2025-06-04 19:28:24
888
原创 Starrocks 物化视图的实现以及在刷新期间能否读数据
本文基于Starrocks 3.3.5版本分析了物化视图的原子性更新机制。研究显示,Starrocks通过Insert Overwrite方式实现物化视图更新:首先创建临时分区写入数据,最后通过加锁操作原子性地替换分区。分析核心流程发现,在doCommit阶段会对表加写锁(LockType.WRITE),确保分区替换操作的原子性,而数据写入阶段不加锁以保证性能。这种设计既保证了数据一致性(不存在读取中间状态),又维持了高QPS场景下的稳定响应时间(RT)。元数据操作仅在最终替换时短暂加锁,使整个更新过程高效
2025-05-29 13:33:42
802
原创 Starrocks 怎么计算各个算子的统计信息
本文分析了Starrocks 3.3.5版本中算子代价计算机制,重点关注StatisticsCalculator类对三种核心算子的统计信息估算方法: Scan算子:从CachedStatisticStorage获取表行数和列统计信息,处理分区剪枝,并通过谓词分析进一步优化统计估算。 Filter算子:直接继承子节点的统计信息,不进行额外计算。 Projection算子:基于子节点统计信息,通过表达式分析估算新生成列的统计值。 研究表明,Starrocks采用自顶向下的统计信息估算方法,大部分统计值都是通过近
2025-05-24 07:19:15
517
原创 Starrocks的CBO基石--统计信息的来源 StatisticAutoCollector
本文分析了Starrocks 3.3.5版本中统计信息的收集机制。统计信息通过周期性运行SQL语句(以分区为维度)进行收集,并存储在_statistics_.column_statistics表和GlobalStateMgr.CachedStatisticStorage中,供后续基于CBO的代价计算使用。统计信息的收集由StatisticAutoCollector类管理,默认调度周期为5分钟。收集过程包括调度时间检查、统计表状态检查、初始化默认任务和运行采集任务。任务运行时会根据配置和表健康度决定是否进行全
2025-05-22 19:29:59
1153
原创 Starrocks的主键表涉及到的MOR Delete+Insert更新策略
本文总结了大数据场景下实时写入更新策略的演进,重点分析了COW、MOR和Delete+Insert三种技术策略。Starrocks的主键表通过Delete+Insert策略优化了实时更新和查询效率,避免了MOR策略中的读放大问题。在写入时,Starrocks利用主键索引和DelVector标记删除数据,更新操作则转换为Delete+Insert,确保数据一致性。读取时,仅需查询主键索引,避免了历史数据的合并操作,提升了查询性能。此外,谓词和索引的下推进一步减少了数据扫描量。总体而言,Starrocks的主键
2025-05-13 18:34:17
684
原创 Starrocks 的 ShortCircuit短路径
本文基于Starrocks 3.3.5版本,探讨了如何在FE端实现短路径查询以加速点查速度。用户需将enable_short_circuit设置为true以启用该功能。通过ShortCircuitPlanner.checkSupportShortCircuitRead方法判断SQL是否支持短路径查询,该方法首先检查enable_short_circuit是否启用,然后通过LogicalPlanChecker判断SQL操作是否支持短路径。目前,仅支持Scan、Project、Filter和Limit操作。对于
2025-05-09 16:48:19
1315
原创 Starrocks 数据均衡DiskAndTabletLoadReBalancer的实现
其中 balanceClusterDisk balanceClusterTablet balanceBackendDisk balanceBackendTablet 分别对应上述的1 2 3 4 四点。最近在研究了一下 Starrocks的tablet的Rebalance的能力,这里进行记录一下。其中里面设计到的移动都是以 tablet Replica(副本)为单位进行移动的,,而最终的信息是来源于 BE和 FE进行交互的。本文基于 StarRocks 3.3.5。的统计信息,这个是来自于。
2025-04-18 18:03:08
545
原创 Chainlit 快速构建Python LLM应用程序
chainlit 是一款简单易用的Web UI goggle,它支持使用 Python 语言快速构建 LLM 应用程序,提供了丰富的功能,包括文本分析,情感分析等。鉴于国内需要VPN访问openai的模型问题, 我们以 chainlit + deepseek(openai) 的方式进行演练。这里面的 api_key 用你在deepeeek 申请到的 api_key替换即可。提供的例子,快速的开发一个带有UI的聊天界面,且支持MCP方式。,对于api的调用的话,这里也提供了一些。接下来就可以进行交互了。
2025-04-16 08:06:53
425
原创 快速部署大模型 Openwebui + Ollama + deepSeek-R1模型
提供了用户友好的 AI 界面(支持 Ollama、OpenAI API 等),且能够支持多种大模型,我们可以部署除了deepseek以外的其他模型,可以很方便的在模型之间切换等功能。是一个开源的本地化大模型部署工具,提供与OpenAI兼容的Api接口,可以快速的运行大模型服务,我们用他来部署deepseek。本文主要快速部署一个带有web可交互界面的大模型的应用,主要用于开发测试节点,其中涉及到的三个组件为。上的模型为例进行演示,运行如下命令就会下载并运行deepseek-r1模型。在这里可以进行提问了。
2025-04-15 18:14:54
495
原创 Starrocks的Bitmap索引和Bloom filter索引以及全局字典
写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。
2025-04-09 19:45:58
897
原创 Spark中排序--前缀排序prefixSort
中 内存排序(UnsafeInMemorySorter)最基本的思想:先根据前缀比较算法进行比较,如果相等的话,则再遍历实际数据的指针去获取真正的数据进行比较,这种可以规避随机内存读取从而提交缓存的命中率,进而提高比较的速度。这里特别说一下:两种类型的BinaryType(对应内部的类型为Array[Byte]) 和 StringType(对应的内部的类型为UTF8String) 获取prefix的.会根据Spark的内部类型,获取Long类型的可以用于比较的值,所以我们可以看到在。
2025-04-03 18:32:22
1108
原创 StarRocks 中 CURRENT_TIMESTAMP 和 CURRENT_TIME 分区过滤问题
方法中, 具体的实现,可以细看 PartitionPruneRule对应的方法,也就是在这个规则里会对涉及到的谓词来过滤出对应的分区,很显然因为。至于 PartitionPruneRule 则会在“Optimizer” 阶段完成 ,也就是。函数不支持常量折叠,也就是不支持在计划解析和优化阶段来计算结果。以上的 都在 “Transformer” 阶段完成的。是常量,所以能够裁剪到对应的分区中去,而。在优化算子阶段就已经计算出来了,为。在计划优化阶段就可以计算出结果。函数的 只选择了一个分区的数据。
2025-03-28 18:12:15
620
原创 Starrocks 命令 Alter table DISTRIBUTED 重分布数据的实现
job 放入要执行的队列中,之后SchemaChangeHandler 以 alter_scheduler_interval_millisecond (10000ms)的轮询间隔从队列中取出要执行的任务,并调用。SchemaChangeHandler.process 会把当前的。来改变数据的分布状态,具体的执行过程是怎么样的呢?
2025-03-19 22:29:47
476
原创 Starrocks 写入报错 primary key memory usage exceeds the limit
经过分析我发现我们这边的分区是以月维度划分的,而且bucket的个数为2,这样每次写入数据的时候,就会把一个月的的数据的索引加载到内存中,这样就会导致BE的内存占用越来越大,除此之外,我们的业务场景就是会 更新 以往 的历史数据,且这样类似的任务有很多。我们的表结构是主键表。在Flink Yaml CDC 任务往 Starrocks写数据的过程中,突然遇到了。本文基于 StarRocks 3.3.5。可以通过如下命令查看 索引所占用的内存。所以我们进行了bucket调整,内存占用节约了5GB。
2025-02-28 17:21:19
605
原创 StarRocks FE leader节点CPU使用率周期性的忽高忽低问题分析
最近在做一些 StarRocks 相关的指标监控的时候,看到了FE master的CPU使用率相对其他FE节点是比较高的,且 呈现周期性的变化(周期为8分钟),于此同时FE master节点的GC频率相对于其他节点高出很多倍,于是我们利用arthas采集了大约15分钟CPU的火焰图。所以说在这种要收集的分区信息很多的情况下,HashMap的初始化,就很消耗CPU。这里会对里面涉及到的所有对象进行内存的评估,用来后续的内存使用指标显示。这种方法收集每个分区中某些字段的信息,这里后续会详细说。
2025-02-21 07:11:25
1045
原创 StarRocks 怎么让特定的SQL路由到FE master节点的
大家都知道对于Starrocks来说FE是分master和follower的,而只有master节点才能对元数据进行写操作。,也就是会重定向到FEmaster节点。这其中的原因在网上是搜不到的,所以大家只知道。本文基于StarRocks3.1.7。
2025-01-18 08:24:53
632
原创 StarRocks关于ConcurrentModificationException 问题的解决
然而在查询的时候, Starrocks会做语法解析,以及基于CBO的优化,在这期间会统计涉及到的表的分区信息统计,而此时恰好遇到了后台线程的分区删除,导致了。阶段,这个阶段由于默认情况下是基于CBO的优化,所以会统计涉及的表所扫描的数据量,最终会走到。StarRocks 对分区带有TTL的表,会后台启动线程轮询的去删除分区,轮询的间隔受到。方法,进而生成物理执行计划,而在生成物理执行计划的阶段,会经过。这个后台线程进行分区的删除。对于这种带有TTL的分区表来说,会有。中就会删除正在进行查询迭代的。
2024-12-03 19:00:21
849
原创 Flink CDC 使用实践以及遇到的问题
最近公司在做一些业务上的架构调整,有一部分是数据从mysql采集到Starrocks,之前的一套方法是走debezium到puslar到starrocks,这一套下来比较需要配置很多东西,而且出现问题以后,需要修改很多配置,而且现阶段问题比较多,且采集的是所有线上的数据库,维护起来很费劲。于是我们进行了采集的数据流调整,使用 Flink CDC这一套,这一套 是端到端的,且采用配置化的方式,支持schema的变更,无需再多一层中间存储层。
2024-11-27 18:04:42
1936
1
原创 Flink CDC 源码解析--整体流程
这里主要就是解析 yaml文件,以及根据source sink构建 pipeline并生成 filnk DataStream 任务 ,这种方式和 flink SQL的方式很像,只不过 SQL方式 是 解析SQL形成对应的flink DataStream任务。但是以上几种方式都是得写SQL或者写代码实现,这种是要一定的专业知识和门槛的,恰好 FLink CDC 提供了一种yaml文件配置化的方式来降低这种门槛,不需要掌握专业知识就能够进行快速的进行数据传输的工作,在此分析一下 Flink CDC的整个流程。
2024-11-14 12:44:35
1393
原创 Starocks中的一致性检查ConsistencyChecker
其中涉及到的 变量为 consistency_check_end_time consistency_check_start_time 以及 MAX_JOB_NUM。把任务提交到后端的backend中去执行,主要代码在。AgentBatchTask.run方法中。本文基于Starrocks 3.1.7。
2024-11-06 21:34:00
1220
原创 Starrocks Compaction的分析
如果是失败任务的话,还会记录到failHistory中,并会重新进行Compaction的任务的延迟提交(延迟间隔为LOOP_INTERVAL_MS*10,其中LOOP_INTERVAL_MS 为200ms)中,并会重新进行Compaction的任务的延迟提交(延迟间隔为LOOP_INTERVAL_MS*2,其中LOOP_INTERVAL_MS 为200ms)注意: 这个命令只是修改了当前内存中的变量的值,如果需要永久的修改,需要配置到。处理完正在运行的Compaction任务后,会构建当前的。
2024-11-05 21:35:30
1454
原创 记一次 Flink mongoDB CDC 到Kafka遇到的问题
是用来Flink用来产生CDC数据的,Flink SQL Planner 会自动为 Upsert 类型的 Source 生成一个 ChangelogNormalize 节点,并按照上述操作将其转换为完整的变更流;所以这里我们选择把 kakfa的数据转换成的正常的 数据流,而不是CDC数据,因为我们最终存储的 Adb 是可以支持upsert操作。这里获取到的数据就是 正常的json数据,而不是 debezium-json数据,具体区别,可以参考下面的说明。,因为我们现在选择 kafka sink的是。
2024-10-13 20:26:58
1576
1
原创 Flink SQL中怎么注册python以及使用python注册的UDF中数据流是怎么流转的
所以说 Flink SQL 调用 python UDF 还是采用了 Py4j ,这种方式也是采用了进程间通信的方式,在效率上还是比不了基于 java/scala 而写的UDF,这种方式和Spark SQL中怎么注册python以及使用python注册的UDF中数据流是怎么流转的类似。
2024-10-07 15:18:05
823
原创 Spark SQL中怎么注册python以及使用python注册的UDF中数据流是怎么流转的
分享本文的目的就在于 使读者明确 怎么在Spark SQL中调用 python注册的UDF,这里的的SQL 可以不仅仅是在 python api 中调用,也可以是在 java或者scala api中调用的。,好像都没有说到在Spark SQL中怎么直接调用 python定义的UDF,但是其实在使用上,Spark SQL是可以直接使用 python定义的UDF的,可以看到 这种运行 python UDF的方式是以socket的方式进行交互的,所以这种方式相对来说还是会比较慢的。
2024-10-04 17:33:46
823
原创 StarRocks 中如何做到查询超时(QueryTimeout)
通过本文的分析大致可以了解到在Starrocks的FE端是如何进行Command的交互以及数据流走向,其他的命令也是可以举一反三。和Spark以及hive等但是解析一样,StarRocks也是采用的Anltr4进行语法的解析,对应的java数据结构,但是一条SQL从客户端发送过来,是怎么一个数据流呢?操作的时候,就会根据执行的长短进行超时处理了。整体的数据流就结束了,待在同一个连接中进行。获取设置的超时时间,如果超时,则调用。中了,后续的流程和之前的一致。这种情况的解析,是通过。就会在语法层面解析为。
2024-10-01 15:48:51
1963
原创 Spark关于 ExpressionEncoder[T] 以及 RowEncoder 以及Spark怎么做外部数据和内部数据的转换
该方法,该方法是用来把表示涉及的属性,给映射到对应的计划的属性值上,这样我们计算的时候,就可以获取到对应的值,一般是调用。这里会涉及到两个ROW的转换,两个ROW的 Schema 是不一致的,如果要涉及到两个ROW之间的转换的时候,而且。的值,所以get(0)是 GenericRowWithSchema类型的ROW,也就是ROW类型。, 前者是 Spark 内部的使用的一行数据的表示,后者是给Spark开发者使用的行数据表示。可执行表达式,最最终绑定到表的特定属性上,从而获取对应的值。
2024-06-05 16:49:29
883
1
原创 记一次Spark cache table导致的数据问题以及思考
这会导致shuffle后的数据进行了错位(因为之前是shuffle(200),现在变成了shuffle(10)),具体原因笔者还是没有分析清楚,但是其中涉及到的点跟规则。从以上的分析知道:是在做join的一方(包含了AQEshuffleRead-coalesced) 影响了join的另一方,导致。目前在做 Spark 升级(3.1.1升级到3.5.0)的时候,遇到了。导致的数据重复问题,这种情况一般来说是很少见的,因为一般很少用。会做一些执行前的判断,主要是做任务shuffle的协调,
2024-05-22 19:54:53
556
原创 Spark AQE 导致的 Driver OOM问题
因为原则上来说,如果没有开启AQE之前,一个SQL执行单元的是属于同一个Job的,开启了AQE之后,因为AQE的原因,一个Job被拆成了了多个Job,但是从逻辑上来说,还是属于同一个SQL处理单元的所以还是得归属到一次执行中。类在内存中存放着 一个整个SQL查询链的所有stage以及stage的指标信息,在AQE中 一个job会被拆分成很多job,甚至几百上千的job,这个时候 stageMetrics的数据就会成百上倍的被存储在内存中,从而导致。主要的作用是设置当前计划的所属的。该方法会获取事件中的。
2024-04-26 22:39:30
1588
3
原创 Spark Rebalance hint的倾斜的处理(OptimizeSkewInRebalancePartitions)
假如说hash(col)为0,那实际上只有reduceTask0有数据,其他的ReduceTask1等等都是没有数据的,所以最终只有ReduceTask0写文件,并且只有一个文件。这些值配置,如果这些配置调整的不合适,就会导致写文件的时候有可能只有一个Task在运行,那么最终就只有一个文件。的作用是对小文件进行拆分,使得罗盘的文件不会太大,这个会有个问题,如果我们在使用。的作用主要是进行文件的合并,是得文件不会太小,本文基于Spark 3.5.0。的值是固定的,比如说值永远是。
2024-03-21 09:05:55
1512
1
原创 Spark中InsertIntoHiveTable 和 InsertIntoHadoopFsRelationCommand(两种写hive的方式)区别和注意的点
目前Spark写hive表有两种形式,一种是基于 Hive 原生的模式,一种是Spark native datasource的模式, 这两种模式可以通过配置的参数。方法的过程,尤其如果说是已存在的hive表有百万分区的话,很容易造成。,该方法会从把hive中的properties的信息传给。,这个方法如果对于分区数比较多的情况下是比较耗时的,而且。对于第一种原生的hive写入方式来说,最终调用的是。中的方法,里面采用的是spark自身的进行写入。中的方法,而这里面的都是采用。本文基于Spark 3.5。
2024-03-08 17:14:41
1413
原创 关于Spark中OptimizeShuffleWithLocalRead 中自己的一些理解
这种情况下,在Spark的内部表示 ShuffleOrigin 为 REBALANCE_PARTITIONS_BY_NONE,这种情况下 是hint为。这里的条件默认是根据shuffle的个数来计算的,如果优化后的shuffle数有增加,则会回退到之前的物理计划中去,当然用户也可以配置。针对第二种情况,这种情况一般来说都是有正向的提升效果的,但是也会经过第一种情况的逻辑判断。规则下,有可能会增加额外的Shuffle操作,这种情况就是负优化了,所以在进行了。的作用简单的来说,就是会按照一定的规则,从一个。
2024-03-06 22:58:52
960
原创 Spark中读parquet文件是怎么实现的
因为对于Spark来说,任何一个事情都不是独立的存在的,比如说parquet文件的rowgroup设置的大小对读写的影响,以及parquet写之前排序对读parquet的影响,以及向量化读取等等。为‘true’(默认就是true),则会进行unsafeRow的转换,当然这里的好处就是节约内存以及能够减少GC。最近在整理了一下 spark对Parquet的写文件的过程,也是为了更好的理解和调优Spark相关的任务,这条filter,则只会拿出rowgroup的信息和rowgrups的的行数。
2024-03-04 20:27:22
1261
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人