自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(192)
  • 收藏
  • 关注

原创 深入解析Paimon MergeFunction

本文分析了Apache Paimon中的MergeFunction接口及其四种核心实现类。MergeFunction定义了合并相同键记录的核心方法,包括reset()、add()、getResult()等。DeduplicateMergeFunction保留最新记录实现去重;FirstRowMergeFunction仅保留第一条记录;PartialUpdateMergeFunction支持部分字段更新,通过序列组保证一致性;AggregateMergeFunction提供字段级聚合能力。

2025-08-29 20:59:28 481

原创 深入解析 Java interrupt

Java中断机制提供了一种协作式的线程间通信方式,允许一个线程请求另一个线程停止当前操作。核心方法包括interrupt()设置中断状态,isInterrupted()检查状态,interrupted()检查并清除状态。关键特点: 阻塞方法(sleep/wait/join等)被中断时会抛出InterruptedException 非阻塞代码需手动检查中断状态 正确处理模式:传播中断状态或执行清理后退出 底层通过本地方法实现,JVM会检查线程中断状态并响应

2025-08-29 20:25:43 442

原创 HBase Compaction HFile 可见性和并发安全性分析

HStore通过StoreFileTracker管理StoreFiles元数据,使用读写锁机制确保并发安全。Compaction由HStore触发,经Region协调,最终由RegionServer调度执行,采用分层协同设计平衡效率与可靠性。核心机制包括:Store级别检测需求、RegionServer统一调度、线程池资源管理,解决并发冲突和资源竞争问题。

2025-08-28 19:25:14 490

原创 Paimon 是否能够多个任务同时写同一个桶(Sequence field 、自定义比较顺序、partial update 和 多流join 详解)

本文深入分析了Apache Paimon中多流Join场景下的并发写入机制。通过配置last_non_null_value聚合函数,多个Flink任务可以安全地并发写入同一Paimon表的不同字段。关键点包括:1) 各任务写入的字段需严格不重叠;2) 独立sequenceNumber不会影响最终合并结果;3) PartialUpdateMergeFunction通过字段级比较器确保正确合并。

2025-08-28 16:05:43 1377

原创 深入解析 Flink Function

Flink Function是最基础的接口,仅定义核心业务逻辑方法,适用于无状态简单转换。RichFunction继承Function并扩展了生命周期管理和运行时上下文访问能力。 AbstractRichFunction作为RichFunction的抽象实现,提供了默认空实现和RuntimeContext管理逻辑。KeyedProcessFunction和ProcessFunction是两种底层处理原语,前者用于KeyedStream支持状态和定时器,后者用于普通DataStream。

2025-08-27 22:48:40 552

原创 揭秘Kafka 生产者 高性能缓冲池:BufferPool设计解析

Kafka生产者中的BufferPool是其高性能的关键组件,负责在固定内存配额内高效管理ByteBuffer的分配与回收。它通过池化标准大小的ByteBuffer(等于batch.size)来减少GC压力,采用公平锁机制防止线程饥饿,确保最长等待线程优先获取内存。核心逻辑包括:快速路径从空闲列表获取缓冲区、必要时阻塞等待内存释放、公平唤醒等待线程。BufferPool通过精细的内存管理为Kafka生产者提供了稳定的高性能支持,同时避免内存溢出风险。

2025-08-27 20:12:52 469

原创 Hadoop MapReduce 任务/输入数据 分片 InputSplit 解析

InputSplit和InputFormat是MapReduce框架处理输入数据的核心机制。InputSplit定义了单个Mapper处理的数据逻辑分片,包含位置元信息而非数据本身,其getLocations()方法为实现数据本地化提供关键支持。InputFormat负责验证输入、切分数据和创建数据读取器,其CombineFileInputFormat实现能有效解决海量小文件问题。两者协同工作,通过逻辑分片和数据本地化实现了大规模数据的高效并行处理,是MapReduce"计算向数据移动"理念的核心体现。

2025-08-26 20:04:10 732

原创 RocketMQ 索引文件核心解析:如何支持key查找

RocketMQ的IndexFile是实现消息索引功能的核心组件,通过Header+Hash-Slot+Index-Entry结构高效存储和查询消息索引。IndexFile由三部分组成:40字节的文件头存储元数据信息;哈希槽区域用于快速定位Key的最新索引条目;索引条目区域存储具体索引数据,每个条目包含Key哈希值、物理偏移量、时间差和链表指针。消息生产者可通过setKeys()方法为消息设置业务相关Key(如订单ID、用户ID等),支持多Key索引。查询时根据Key哈希值定位槽位,遍历链表筛选符合时间范围

2025-08-26 19:29:39 966

原创 Hadoop MapReduce Task 设计源码分析

本文深入解析了Hadoop MapReduce框架中的核心组件Task及其子类MapTask和ReduceTask的实现机制。Task作为任务执行基类,封装了任务标识、状态管理、序列化等通用功能。MapTask通过环形缓冲区和多轮溢写-归并机制实现高效数据处理,ReduceTask则通过Shuffle阶段拉取数据并执行最终归并排序。文章详细剖析了ShuffleSchedulerImpl的调度算法、失败处理机制以及多层次的容错设计,包括失败计数限制和健康检查机制。这些组件构建了一个高效、健壮的分布式计算框架。

2025-08-25 19:47:32 1353

原创 Flink 状态 RocksDBListState(写入时的Merge优化)

RocksDBListState是Flink基于RocksDB实现的高效List状态存储方案。它通过继承AbstractRocksDBState获得底层存储能力,并实现InternalListState接口提供标准API。核心特性包括: 利用RocksDB的Merge操作符实现高效追加写入,避免 读-改-写的序列化开销,适用于读少写多场景 采用ListDelimitedSerializer处理列表序列化,元素间用分隔符拼接 支持窗口状态合并,通过mergeNamespaces方法实现多命名空间状态迁移

2025-08-25 19:06:26 867

原创 Java Stream 并行和有状态算子 临时存储设计:Nodes

本文深入分析了Java Stream API中的Nodes类及其相关组件,揭示了并行流处理的核心机制。Nodes作为工具类,负责创建和管理Node树结构,支持并行流的分治-合并策略。关键点包括: 节点类型:Node分为叶子节点(存储数据)和内部节点(连接子树),通过ArrayNode和ConcNode实现 并行处理: 已知大小时使用SizedCollectorTask直接写入预分配数组 未知大小时通过CollectorTask构建树状结构,再使用ToArrayTask扁平化

2025-08-24 15:56:49 878

原创 Java Stream创建工具类 StreamSupport

StreamSupport是Java8 Stream API的核心工具类,主要用于创建流。它作为底层桥梁,将Spliterator(可分割迭代器)包装成Stream,支持泛型流和基本类型流。通过两种重载方式创建流:直接使用Spliterator或通过Supplier延迟创建。内部实现上,它作为工厂类生成流管道的头节点,并将Spliterator特性转换为StreamOpFlag以优化流处理。理解StreamSupport有助于深入把握Stream本质——基于Spliterator构建的、支持并行处理数据管道

2025-08-24 15:56:06 935

原创 Java22 stream 新特性 窗口算子:GathererOp 和 GatherSink

GathererOp是Java Stream API中gather()操作的核心实现,负责将用户定义的Gatherer应用于流元素并生成新流。它继承自ReferencePipeline,支持顺序和并行执行。关键特性包括:实现gather.gather和gather.collect操作融合;包含Sequential、Hybrid和Parallel三种执行策略;通过GatherSink连接Gatherer与下游操作。其中Hybrid策略针对不可合并的Gatherer采用"上游并行+下游串行"的混合模式

2025-08-23 15:59:24 826

原创 Java22 stream 新特性 窗口算子 与 虚拟线程map操作:Gatherer 和 Gatherers工具类

Java 22引入的Gatherer是一个强大的流处理中间操作,它提供了比map、filter等更灵活的数据转换能力。Gatherer支持有状态、多对多的元素转换,能实现窗口化、滑动窗口等复杂操作。其核心由四个组件构成:initializer(初始化状态)、integrator(处理元素)、combiner(合并并行状态)和finisher(收尾处理)。Gatherers工具类提供了windowFixed、windowSliding等预置实现。特别的是,mapConcurrent方法利用虚拟线程实现并发处理

2025-08-23 15:59:07 906

原创 JCTools Spmc 单生产者-多消费者的无锁并发有界队列

SpmcArrayQueue是JCTools中针对单生产者-多消费者场景设计的高性能队列,核心通过CAS操作解决多消费者竞争问题。采用分层内存布局隔离热点字段,引入producerIndexCache减少volatile读开销。生产者使用简单检查机制,消费者通过快慢路径分离和CAS争用实现高效并发消费。相比SPSC队列,SPMC在保持单生产者优势的同时,通过精巧设计解决了多消费者协调难题,但在生产者端允许短暂自旋等待以简化实现。整体展现了并发队列设计中性能与复杂度的精妙权衡。

2025-08-22 21:01:35 995

原创 JCTools 并发无锁链表队列 LinkedQueue

JCTools中BaseLinkedQueue是高性能无锁并发队列的基础设计,通过缓存行填充解决伪共享问题,采用哨兵节点简化算法。其核心是为单消费者场景优化,通过非原子操作更新队头指针以提升性能,但因此不支持多消费者。SpscLinkedQueue在此基础上进一步优化单生产者场景,用普通读写替代原子操作。该设计体现了高性能并发编程的权衡艺术,通过约束使用场景换取极致性能,是JCTools的核心设计哲学。

2025-08-22 19:02:54 701

原创 Java Stream skip和limit算子实现:SliceOps

SliceOps是Java Stream API实现skip()和limit()操作的核心类。它根据流的不同特性(顺序/并行、有序/无序、大小已知/未知)采用多种优化策略:顺序流通过包装Sink和计数器实现简单高效的跳过和限制;并行流则根据情况选择SliceSpliterator、UnorderedSliceSpliterator或SliceTask来处理。其中SliceTask通过ForkJoin框架实现分治处理,在保持元素顺序的同时进行结果合并和短路优化,确保并行环境下skip/limit的高效执行。

2025-08-21 20:13:49 980

原创 深入解析Java Stream StreamSpliterators

StreamSpliterators主要负责将流操作转换为可遍历的Spliterator。它包含多种关键实现: AbstractWrappingSpliterator作为基类,封装了包装其他Spliterator的通用逻辑,支持延迟绑定和缓冲机制,是连接流管道与数据源的桥梁。其子类WrappingSpliterator和基本类型特化版本处理不同类型流的遍历。此外通过各种子类支持 skip/limit、无序skip优化、去重、无限流的处理。

2025-08-21 15:50:37 954

原创 深入解析EventPoller:Disruptor的轮询式事件处理机制

Disruptor框架中的EventPoller是一个实验性的基于轮询的事件消费接口,与BatchEventProcessor不同,它允许用户控制执行流程。EventPoller不管理线程,而是通过poll()方法由调用者主动发起事件处理,提供更大的灵活性。它依赖于四个核心字段:数据提供者、序列号管理器、消费进度序列和门控序列。Handler接口定义了事件处理逻辑,其返回值控制是否继续处理。EventPoller适用于需要在现有线程中执行消费逻辑或实现复杂调度策略的场景。

2025-08-20 21:47:02 657

原创 Disruptor核心接口EventHandler解析

EventHandlerBase是Disruptor框架内部的基础接口,整合了事件处理的核心生命周期方法(如onEvent、onStart、onShutdown等),供BatchEventProcessor统一调用。用户通常实现其子接口EventHandler(处理业务逻辑)或LifecycleAware(管理资源生命周期)。RewindableEventHandler是特殊变体,通过抛出RewindableException支持批次回滚重试,适用于网络抖动等可恢复错误场景。

2025-08-20 21:40:06 561

原创 Paimon LogStore:秒级数据可见的秘诀

LogStore是Paimon实现低延迟流式读取的可选组件,通过双写机制将数据同时写入主存储和外部消息队列(如Kafka)。流读作业无需等待写入作业的Checkpoint完成,可直接从消息队列消费最新数据,实现毫秒级延迟。KafkaLogStoreFactory是具体实现,通过配置表属性启用。测试用例StreamingReadWriteTableWithKafkaLogITCase验证了这一机制,但也揭示潜在风险:下游可能消费到未确认数据,导致数据撤回问题。

2025-08-19 22:34:05 929

原创 JCTools Spsc:单生产者-单消费者无锁队列

SpscArrayQueue是JCTools中高性能单生产者单消费者(SPSC)队列,通过精巧设计实现极致性能。其核心优化包括:1)内存布局优化,使用继承链和缓存行填充彻底消除伪共享;2)前瞻机制,通过producerLimit缓存消费者进度,减少volatile读;3)精细化内存操作,针对不同场景使用plain/ordered/volatile语义。生产者通过"快车道/慢车道"机制实现高效入队,批量操作进一步优化性能。该设计完美结合计算机体系结构、Java内存模型和算法优化,是SPSC场景下的性能标杆。

2025-08-19 22:17:20 901

原创 RocksDB 解密可逆哈希:BijectiveHash的设计奥秘

可逆哈希是一种无冲突的双向置换函数,其核心设计融合了密码学和数论原理。与普通哈希不同,它采用无损操作(如128位乘法)、模逆元计算和Feistel网络结构,确保输入输出一一对应且可逆。通过种子密钥、大素数乘法和雪崩效应实现数据混淆,使输出呈现随机性。逆向过程通过精确的反向操作实现解密,体现了对称的设计思想。这种技术适用于ID混淆等场景,在保证安全性的同时维持高效性能。

2025-08-18 20:27:28 836

原创 Fluss:颠覆Kafka的面向分析的实时流存储

Fluss是一个面向实时分析的流式存储系统,旨在解决传统消息队列(如Kafka)在复杂查询、数据更新和历史分析方面的不足。其核心创新包括:1)融合数据库与流处理特性,支持流式更新和高效查询;2)采用列式存储格式实现10倍性能提升;3)内置KV存储引擎支持毫秒级点查;4)实现湖流一体架构,无缝集成实时数据与数据湖。系统采用分层设计,通过TabletServer协调LogStore和KvStore的协作,以预写日志机制保证数据一致性。相比Kafka+Flink方案,Fluss简化了实时数仓架构。

2025-08-18 20:20:41 2819

原创 Java ArraysParallelSortHelpers 并行排序

本文分析了Java并行排序核心实现关键设计:1. 分治策略:基于CilkSort的四分法递归分解2. 混合排序:大数组并行分解 + 小数组TimSort串行处理3. 智能归并:动态选择分割点实现并行归并实现亮点:• 使用Fork/Join框架构建任务依赖图• Relay/EmptyCompleter实现无锁任务协调• 工作空间复用减少内存分配• 稳定排序保持元素相对顺序性能关键:• 粒度控制优化并行/串行切换• 尾递归优化避免堆栈溢出• 四分法减少最终数组拷贝

2025-08-17 19:09:24 668

原创 Java Stream ForEach算子实现:ForEachOps

ForEachOps是Java Stream API中实现forEach和forEachOrdered终端操作的核心类,通过静态工厂方法(如makeRef)创建不可变的TerminalOp实例。其内部抽象类ForEachOp兼具TerminalOp(控制执行)和TerminalSink(消费元素)双重职责。串行流直接遍历元素,而并行流通过ForEachTask(无序并行)或ForEachOrderedTask(有序并行)分治处理。后者利用CountedCompleter构建任务依赖链。

2025-08-17 16:34:05 995

原创 Java Stream sort算子实现:SortedOps

SortedOps是Java Stream API中实现排序操作的核心类,该类提供静态工厂方法(makeRef/makeInt等)为不同类型流创建排序实例,内部通过OfRef/OfInt等StatefulOp子类实现有状态排序操作。关键设计包括:1)串行流处理时通过Sink实现缓冲排序,区分大小已知/未知场景;2)并行流采用两阶段 收集-并行排序策略( Arrays.parallelSort());3)内置优化机制避免重复排序已有序流;4)原始类型特化处理避免装箱开销。

2025-08-16 20:44:46 719

原创 JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue

ConcurrentCircularArrayQueue是JCTools中基于数组的无锁并发循环队列的抽象基类,采用循环数组结构实现高效FIFO操作。其核心设计包括:使用2的幂容量数组配合位运算优化索引计算;通过缓存行填充防止伪共享;将具体并发策略(如SPSC/MPSC)交由子类实现。关键特性包括弱一致性迭代器和标准化的并发接口(MessagePassingQueue等)。派生类ConcurrentSequencedCircularArrayQueue通过引入sequenceBuffer数组实现协作。

2025-08-16 20:39:13 898

原创 JUC LongAdder并发计数器设计

本文深入解析了Java并发包中的Striped64及其子类LongAdder的设计原理。Striped64采用空间换时间 策略,通过维护基础值base和动态扩容的Cell数组,将高并发场景下的竞争热点分散到不同Cell中。LongAdder继承这一设计,优先CAS更新base,竞争时转向线程专属Cell,通过哈希映射、动态扩容和重哈希机制降低冲突。相比AtomicLong,LongAdder显著提升写入性能,但sum()结果是弱一致性的。它适用于高并发统计场景,如API调用计数,但不适合需要原子快照的操作。

2025-08-15 19:24:16 609

原创 JCTools 无锁并发计数器:ConcurrentAutoTable

ConcurrentAutoTable是一种高性能并发计数器,通过分片和动态扩容机制解决高并发场景下的缓存争用问题。它将计数器分散到long数组中,每个线程根据哈希值更新不同槽位,减少冲突。当检测到激烈争用时,自动创建双倍大小的新数组并形成链表结构,实现无锁扩容。读取时递归求和所有历史数据,提供近似值。相比JDK的LongAdder,它采用完全无锁的链表扩容方式,虽然求和逻辑稍复杂,但展示了更精妙的动态扩容思路。该设计通过改变数据结构适应并发模式,实现了近乎线性的性能扩展。

2025-08-15 16:16:34 742

原创 Java stream distinct findAny anyMatch实现 :DistinctOp、FindOp、MatchOp

本文深入分析了Java Stream API中的三个核心内部类:DistinctOps、MatchOps和FindOps。DistinctOps实现流去重操作,根据流的有序性和并行性采用不同策略,包括HashSet记录、排序优化和并行处理。MatchOps封装anyMatch/allMatch/noneMatch操作,通过MatchKind枚举统一处理逻辑,支持短路特性。FindOps实现findFirst/findAny,区分有序和无序查找,在并行流中采用不同任务取消策略。

2025-08-14 22:15:28 952

原创 Flink on YARN启动全流程深度解析

Flink on YARN 启动流程包含三个阶段:1) JobManager 作为 AM 启动,客户端提交 JobGraph 并申请资源;2) TaskManager 动态分配,Flink RM 通过 YARN 获取容器并启动 TM 进程;3) 任务部署执行,JM 将任务分发到 TM 的 Slot。核心在于 Flink 通过 YARN 实现资源动态管理,其 RM 作为中介协调资源申请与任务调度,而 TM 主动连接 JM 进行任务注册。整个过程展现了 Flink 与 YARN 的深度集成机制,实现了弹性调度。

2025-08-14 19:59:30 753

原创 深入解析Java Integer类

本文深入解析了Java中的Integer类,重点分析了其缓存机制、位操作方法和字符串转换功能。Integer通过IntegerCache实现-128到127的自动装箱缓存,提升性能但需注意==比较的陷阱。核心方法包括高效的位操作(如bitCount、numberOfLeadingZeros)、字符串转换(parseInt、toString)和循环移位(rotateLeft)等,许多方法采用《算法心得》中的经典算法并通过@IntrinsicCandidate优化为CPU指令。

2025-08-13 16:26:35 908

原创 Java19 Integer 位操作精解:compress与expand《Hacker‘s Delight》(第二版,7.4节)

Java 19新增的compress()和expand()方法实现高效位操作,前者根据掩码保留并压缩特定位,后者是前者的逆操作。两个方法基于《Hacker's Delight》中的分治算法,通过parallelSuffix()辅助函数并行计算移动距离,采用5轮处理完成位移动,具有无分支循环的特点。算法通过位掩码和异或运算实现高效位重组,适合需要密集位操作的场景。

2025-08-13 16:25:46 1046

原创 Java Stream ReduceOps

ReduceOps是Java Stream中用于执行规约操作的工厂类,负责创建TerminalOp实例。它采用"任务描述(ReduceOp)与具体工人(ReducingSink)分离"的设计模式:每个make方法都会定义内部类ReducingSink实现元素累加逻辑,并返回一个包含makeSink()方法的ReduceOp实例。该类支持串行和并行两种执行方式:串行模式下直接创建Sink处理数据;并行模式下通过ReduceTask将任务分解,各子任务使用独立的Sink实例处理数据片段,最终通过combine

2025-08-12 22:09:15 793

原创 揭秘RocksDB MemTable 抽象数据结构设计: MemTableRep架构解析

RocksDB中的MemTableRep是一个关键接口类,定义了内存表存储引擎的核心行为。作为LSM-Tree架构的内存写缓存,它决定了数据库的写入和读取性能。MemTableRep采用纯虚基类设计,允许不同实现方式(如跳表、哈希跳表和向量),支持插入、查找、迭代等操作。通过工厂模式MemTableRepFactory实现灵活创建,该架构将内存表逻辑与底层数据结构解耦,使RocksDB能适应不同硬件和工作负载。这种设计体现了RocksDB高度可定制化的特点,用户可自行实现特定存储结构来优化性能。

2025-08-12 19:18:52 564

原创 HBase BlockCache:LRU Cache

HBase的BlockCache采用灵活的二级缓存架构(L1+L2),其中LruBlockCache作为堆内一级缓存,BucketCache作为堆外二级缓存。LruBlockCache通过三级优先级(SINGLE/MULTI/MEMORY)和异步淘汰机制优化缓存命中率,采用ConcurrentHashMap保证高并发读写性能。与Caffeine等现代缓存库不同,LruBlockCache通过牺牲低频淘汰操作性能换取高频读操作的极致性能,体现了特定场景下的设计权衡。

2025-08-11 19:35:15 2749

原创 深入解析Java String类的核心设计与实现

String类在Java中通过final修饰确保不可变性,其内部使用private final byte[]存储数据,并采用紧凑字符串优化存储。从Java 9开始,String根据字符编码选择LATIN-1或UTF-16存储方式,显著提升内存效率。字符串拼接运算符在编译时会被优化为StringBuilder或StringConcatFactory实现,后者在运行时动态生成最优拼接策略。split()方法针对简单分隔符场景进行专门优化,避免正则表达式开销。

2025-08-11 16:09:59 973

原创 Hadoop MapReduce过程

本文深入解析了MapReduce的执行流程。客户端负责分片计算(getSplits)和作业提交,通过InputFormat将数据逻辑切分为InputSplit;而集群(YARN)负责任务调度执行,包括启动MapTask、创建RecordReader和数据处理。文章详细介绍了MapReduce的完整流程:输入分片、Map阶段、Shuffle(分区、排序、溢写、合并)、Reduce阶段和输出,并阐述了Mapper与Reducer通过中间键值对的联系机制。此外,还探讨了Partitioner的作用。

2025-08-10 20:11:27 860

原创 Disruptor核心工具:SequenceGroup详解

Disruptor中的SequenceGroup是一个用于聚合多个Sequence对象的工具类,它继承自Sequence并提供了线程安全的动态管理能力。核心功能包括:1)通过get()方法返回组内最小序列号;2)使用CAS机制实现线程安全的动态增删Sequence;3)支持运行时通过addWhileRunning方法添加新消费者。FixedSequenceGroup是其不可变版本,适用于消费者拓扑固定的场景。SequencerFollowingSequence是特殊的代理类,用于跟踪RingBuffer游标

2025-08-10 16:06:04 932

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除