自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(205)
  • 资源 (5)
  • 问答 (3)
  • 收藏
  • 关注

原创 Flink源码阅读:Kafka Connector

本文分析了Flink Kafka Connector的实现原理。首先介绍了Flink自定义Source/Sink的三层架构:Metadata层处理表元数据,Planning层通过工厂类创建DynamicTableSource/Sink,Runtime层实现与连接器的交互。接着详细解读了KafkaDynamicTableFactory的实现,包括配置解析、格式解码等核心功能。重点剖析了Source端的创建流程,涉及分区发现、启动模式、并行度设置等关键参数处理。

2026-01-20 21:59:49 468

原创 Flink源码阅读:Mailbox线程模型

Flink 通过 Mailbox 线程模型取代传统的 checkpointLock 机制,采用单线程加阻塞队列方式处理事件,确保线程安全。Mailbox 将事件封装为 Mail 对象存入队列,由单线程顺序执行,解决了锁竞争和代码可读性问题。核心组件包括 TaskMailbox(存储 Mail 队列)、MailboxProcessor(处理循环)和 MailboxExecutor(提交事件)。该模型优化了事件处理流程,支持优先级控制和 yield 机制避免死锁,提升了 Flink 的并发性能和调试便利性。

2026-01-15 21:23:10 647

原创 Flink源码阅读:JobManager的HA机制

Flink 通过高可用机制解决 JobManager 单点问题,支持 ZooKeeper 和 Kubernetes 两种 HA 模式。核心组件包括 Leader 选举、服务发现和信息存储服务。基于 ZooKeeper 的实现通过 LeaderLatch 机制选举 Leader,最小 ID 节点当选,并利用 TreeCache 监听节点变更。选举成功后新 Leader 会获取旧 Leader 存储在公共存储中的信息,确保集群稳定运行。

2026-01-12 20:38:58 985

原创 Flink源码阅读:Netty通信

本文摘要: Flink 网络通信模块基于 Netty 实现,主要涉及 NettyServer 和 NettyClient 的初始化过程。初始化在 TaskManager 启动时完成,通过 ShuffleEnvironment 创建 NettyConnectionManager,其中包含核心组件:服务端、客户端、缓冲池和 Netty 协议处理器。

2026-01-09 19:04:37 1024

原创 Flink源码阅读:Task数据交互

本文梳理了Flink中Task数据交互的源码实现。数据输出方面,介绍了RecordWriterOutput、RecordWriter等核心组件,详细分析了从StreamMap到BufferWritingResultPartition的数据写入流程,包括内存申请机制。数据输入方面,讲解了InputGate和InputChannel的概念,以及从StreamTask到StreamOneInputProcessor的数据读取过程。

2026-01-05 19:09:12 1114

原创 Flink源码阅读:双流操作

本文梳理了 Flink 双流操作的三种实现方式:Window Join、Interval Join 和 CoGroup。重点分析了 Window Join 和 CoGroup 的源码实现,其中 Window Join 底层通过 CoGroup 处理,使用两层遍历实现数据关联。CoGroup 则将两个流合并后创建窗口流进行处理。文章通过代码示例展示了核心调用链路和关键实现逻辑,帮助理解 Flink 多流 Join 的内部机制。

2025-12-30 20:10:01 1037

原创 Flink源码阅读:窗口

本文深入分析了Flink窗口机制的源码实现,重点剖析了Keyed Window和Non-Keyed Window两种类型。文章首先介绍了窗口的基本用法和分类,然后详细解读了WindowAssigner如何确定消息所属窗口,以TumblingEventTimeWindows为例展示了窗口分配逻辑。接着分析了Trigger触发机制,包括onElement、onProcessingTime、onEventTime等回调函数的作用,以及TriggerResult枚举类对窗口计算的控制逻辑。

2025-12-25 22:29:59 760

原创 Flink源码阅读:Watermark机制

本文分析了Flink中Watermark的源码实现,主要包含三个部分:1) Watermark的定义,它是一个带有时间戳的StreamElement;2) Watermark的生成过程,通过assignTimestampsAndWatermarks方法初始化,创建TimestampsAndWatermarksOperator并设置定时器周期性发送;3) 下游处理机制,获取上游最小Watermark并向下游广播。文章通过关键代码片段和调用链路图,详细阐述了Watermark在Flink中的实现原理和处理流程。

2025-12-22 22:38:51 1057

原创 Flink源码阅读:Checkpoint机制(下)

前面我们了解到在方法中会创建四个 Future,用来支持不同类型的状态写入。if (null!} else {我们主要关心 ManagedState,ManagedState 都是调用方法来写入数据的,下面具体看 KeyedState 和 OperatorState 的具体实现。本文我们重点梳理了 KeyedState 数据写入的代码。其主要步骤包括:同步拷贝状态数据的引用,创建 Checkpoint 输出流并完成 Checkpoint 持久化,最后返回元信息结果。

2025-12-21 22:24:19 1009

原创 Flink源码阅读:Checkpoint机制(上)

本文深入分析了Flink的Checkpoint机制源码实现,从JobManager端触发流程、TaskManager端执行流程到非Source节点处理流程进行了详细梳理。重点解析了CheckpointCoordinator的触发逻辑、Barrier消息广播、状态异步写入及上报机制,并区分了EXACTLY_ONCE和AT_LEAST_ONCE两种模式的不同处理方式。通过源码分析揭示了Flink如何通过Checkpoint实现可靠的容错机制,为理解Flink的容错原理提供了深入的技术细节。

2025-12-20 21:54:54 1040 1

原创 Flink源码阅读:状态管理

本文从源码层面分析了Flink状态管理的实现机制。首先介绍了State的分类和使用方式,包括Keyed State和Operator State的获取方法。接着详细讲解了State Backend的三种存储类型及其创建过程,重点剖析了StreamTask中keyedStateBackend的创建逻辑,包括KeyGroupRange计算和状态恢复流程。

2025-12-17 19:18:07 704

原创 Flink源码阅读:集群启动

摘要:本文介绍了Flink集群的启动流程,重点分析了JobManager的启动过程。通过分析启动脚本和核心代码,详细展示了StandaloneSessionClusterEntrypoint如何加载配置并启动集群,包括初始化RPC服务、HA服务、BlobServer等关键组件。

2025-12-16 20:50:13 950

原创 Flink源码阅读:如何生成ExecutionGraph

Flink ExecutionGraph 执行过程解析 本文详细介绍了Flink中ExecutionGraph的执行过程。

2025-12-15 22:46:14 955

原创 Flink源码阅读:如何生成JobGraph

Flink执行图转换:从StreamGraph到JobGraph的优化过程 摘要:本文详细分析了Flink中StreamGraph向JobGraph的转换机制。StreamGraph作为高层逻辑图,JobGraph则是优化后的执行图,主要区别包括:1)StreamGraph对应API逻辑,JobGraph侧重执行优化;2)JobGraph通过算子链优化提高性能。转换过程核心是StreamingJobGraphGenerator.createJobGraph方法,包括预验证、链化操作符、设置并行度等步骤。

2025-12-14 20:24:38 958

原创 Flink源码阅读:如何生成StreamGraph

Flink程序的执行流程通过四种图结构实现转换:StreamGraph、JobGraph、ExecutionGraph和Physical Graph。其中StreamGraph是根据用户代码生成的初始拓扑结构。代码分析从StreamExecutionEnvironment开始,重点研究了DataStream转换过程。

2025-12-14 20:22:07 1424

原创 Flink学习笔记:反压

本文介绍了Flink中的反压机制及其监控方法。反压是流式系统中下游对上游的数据处理反馈机制,当上游生产速度超过下游消费速度时触发。Flink数据传输分三种情况:同线程直接共享内存、本地跨线程通过Buffer交互、远程跨节点通过网络传输。反压监控通过Web UI显示状态(OK/LOW/HIGH),分别对应不同的反压程度。文章详细分析了本地和远程场景下反压的感知原理,为Flink运维提供了重要参考。

2025-12-12 22:38:55 663

原创 Flink学习笔记:状态后端

Flink状态存储机制解析:介绍了两种状态后端(HashMapStateBackend和EmbeddedRocksDBStateBackend)的存储方式、特点及适用场景,以及Checkpoint存储类型(JobManager和FileSystem)的配置方法。详细说明了三种组合配置方式(MemoryStateBackend、FsStateBackend、RocksDBStateBackend)及其实现代码,并解释了状态序列化/反序列化过程。帮助开发者根据应用需求选择合适的状态存储方案。

2025-12-11 21:57:21 1241

原创 Flink学习笔记:如何做容错

本文我们介绍了 Flink 是如何做容错的,分别介绍了 Checkpoint 和 Savepoint,以及它们之间的区别。本文多次提到了 Checkpoint 和 Savepoint 依赖的稳定存储,我会在下一篇文章进行详细的介绍。

2025-12-10 22:09:04 1055

原创 Flink学习笔记:状态类型和应用

Flink的容错机制和状态管理是其核心优势之一。文章首先区分了无状态和有状态计算,重点介绍了Flink的两种状态类型:Raw State(需开发者自行管理)和Managed State(由Flink Runtime管理)。Managed State又分为Keyed State(基于键值对)和Operator State(绑定到算子实例),详细说明了ValueState、ListState等具体状态类型的使用方法。

2025-12-09 22:42:23 644

原创 Flink学习笔记:多流 Join

本文介绍了 Flink 中实现流数据 Join 的两种主要方法:Window Join 和 Interval Join。Window Join 通过窗口机制对相同 key 的元素进行关联,分为滚动窗口、滑动窗口和会话窗口三种类型。Interval Join 则基于事件时间范围进行关联,支持设置上下偏移量。此外,文章还介绍了使用 CoGroup 实现 left join 的方法。

2025-12-08 22:08:47 724

原创 Flink学习笔记:窗口

Flink窗口机制是实时数据处理的核心概念,主要分为Keyed Window和Non-Keyed Window两类。根据数据划分依据可分为时间窗口和计数窗口,按规则又分为滚动窗口、滑动窗口、会话窗口和全局窗口四种类型。时间窗口最常用,其中滑动窗口以固定步长滑动,允许元素跨窗口计算;滚动窗口是滑动窗口的特例,窗口间无重叠;会话窗口根据数据间隔动态决定窗口大小;全局窗口则处理所有数据。每种窗口类型都提供了灵活的API配置选项,支持不同业务场景的实时计算需求。

2025-12-06 00:58:42 1099

原创 Flink学习笔记:时间与Watermark

本文摘要: 本文重点介绍了Flink流处理中的两个核心概念:时间属性和Watermark机制。首先阐述了Flink支持的三种时间属性:事件时间(EventTime)、处理时间(ProcessTime)和摄入时间(IngestionTime),并通过图示说明了它们的区别。然后详细讲解了Watermark的工作原理,包括其定义、作用以及处理迟到数据的三种方法。

2025-12-04 23:28:56 1328

原创 Flink学习笔记:整体架构

开一个新坑,系统性的学习下 Flink,计划从整体架构到核心概念再到调优方法,最后是相关源码的阅读。

2025-07-13 13:46:48 1284

原创 遇见ZooKeeper:初识

0. 什么是ZooKeeperZooKeeper 是一个开源的分布式,它的设计目标是将那些复杂且容易出错的分布式协同服务封装起来,抽象出一个高效可靠的原语集,并以一系列简单的接口提供个用户使用。ZooKeeper 有几大特征:易用ZooKeeper 的理解和使用成本都很低,它提供的是一种层级式的命名空间,这一点和标准的文件系统类似。可靠ZooKeeper 服务可以支持集群模式,并且能够轻松扩展,客户端可以连接到任意一个服务器,都能够获得服务。有序ZooKeeper 的节点是可以保证有序的。每

2021-02-22 23:29:57 387

原创 哲少荐书:鞋狗

很久没来荐书了,主要原因是最近读到的值得推荐的书比较少(其实是偷懒了,读书少了)。还好春节假期来临,也趁着难得的假期时间读完了一本书——《鞋狗》。这是一本读完就想要推荐给大家的书(没错,我就是刚刚读完就来推荐了)。提到《鞋狗》相信还有些朋友不太熟悉,但是提到耐克,相信大家一定都知道。即使没有买过耐克的东西,也一定在商场看到过耐克的线下门店。而《鞋狗》这本书就是耐克的创始人菲尔·奈特的亲笔自传。这本书讲述了耐克“从0到1”的过程,书中讲述了菲尔·奈特在面对合作伙伴背叛,开户行翻脸,权利的压迫等问题时是如

2021-02-18 23:04:59 593

原创 Elasticsearch从入门到放弃:浅谈算分

今天来聊一个 Elasticsearch 的另一个关键概念——相关性算分。在查询 API 的结果中,我们经常会看到 _score 这个字段,它就是用来表示相关性算分的字段,而相关性就是描述一个文档和查询语句的匹配程度。打分的本质其实就是排序,Elasticsearch 会把最符合用户需求的文档排在最前面。在 Elasticsearch 5.0 之前,相关性算分算法采用的是 TF-IDF 算法,而在5.0之后采用的是 BM 25 算法。听到这也许你会比较疑惑,想知道这两个算法到底是怎么样的。别急,下面我们

2021-01-27 00:18:44 430

翻译 【译】代码中如何写出更有意义的命名

作为一名开发人员,在编码过程中,你总会花很多时间来思考如何正确命名。因为名称无处不在,你需要考虑文件名、类名、方法名和变量名。虽然我们需要花费很多时间,但是为了更好的命名还是值得的。本文我将向你介绍几个能够帮助你编写优质命名的简单规则。命名这件事本身也是一门艺术。使用显示意图的名称名称直接显示意图这件事说起来容易做起来难。你是否经常遇到一些难以判断其用途的名称?一个好的经验法则是:如果一个名称需要注释,那么它本身就是不能说明意图的。这个代码片段就演示了一个不能显示意图的变量命名。<?php

2020-08-06 20:15:12 418

原创 Elasticsearch从入门到放弃:瞎说Mapping

前面我们聊了 Elasticsearch 的索引、搜索和分词器,今天再来聊另一个基础内容—— Mapping。Mapping 在 Elasticsearch 中的地位相当于关系型数据库中的 schema,它可以用来定义索引中字段的名字、定义字段的数据类型,还可以用来做一些字段的配置。从 Elasticsearch 7.0开始,Mapping 中不在乎需要定义 type 信息了,具体原因可以看官方的解释。字段的数据类型我们刚刚提到 Mapping 中可以定义字段的数据类型,这可能是 Mapping 最常

2020-08-04 22:56:37 2592

翻译 【译】求你不要再写没用的提交信息了

开始尝试优化你的 Git 提交信息吧我们都看到过的你在一个项目中使用 Git 作为版本控制。当你做完了一次修改之后,你想要尽快更新你的分支。所以你打开了终端,输入了下面这些命令,完成了一次远端分支的更新。git add .git commit -m "added new feature"git push然后你做了一些自测,发现了一个新鲜的 bug。问题不大,你很轻松的就解决掉了这个 bug,现在你需要把新的代码再次提交到远程分支,于是你很熟练的使用起 Git 命令。git add ..

2020-07-22 23:35:28 339

原创 Elasticsearch源码解析:环境搭建

在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码。我发现两种方法可以相辅相成,互相补充。阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想。因此,在学习 Elasticsearch 的时候我也准备采用这样的模式。所以,从今天开始,我会定期更新学习 Elasticsearch 源码的收获。在开始学习之前,需要先把环境准备好。所以今天就先分享一下准备环境的过程。软件环境Intellij Idea:2020.1版本JDK 12Gradle 5

2020-07-20 22:12:26 937

原创 Elasticsearch从入门到放弃:再聊搜索

在前文中我们曾经聊过搜索文档的方法,Elasticsearch 一般适用于读多写少的场景,因此我们需要更多的关注读操作。Elasticsearch 提供的 Search API 可以分为 URI Search 和 Request Body Search 两大类。从名称上可以直观的看出,URI Search 是使用URI的参数传递参数给 Elasticsearch,Request Body Search 则是将参数放到 Body 中进行传递,下面我们具体来看一下。URI Search首先我们来看 URI

2020-07-13 23:56:45 610

原创 Elasticsearch从入门到放弃:分词器初印象

Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来继续更新。之前我们聊过了 Elasticsearch 的索引和文档,不太熟悉的话可以先翻阅一下前文。今天再一起聊一下 Elasticsearch 的分词器。关于分词如果你是讲 Elasticsearch 作为搜索引擎,那么你应该需要对分词进行了解,Elasticsearch 的分词是将全文本转换为一系列单

2020-06-29 22:24:49 1204

原创 Rust入坑指南:万物初始

有没有同学记得我们一起挖了多少个坑?嗯…其实我自己也不记得了,今天我们再来挖一个特殊的坑,这个坑可以说是挖到根源了——元编程。

2020-04-09 22:12:39 2323

原创 Rust入坑指南:居安思危

任何事情都是相对的,就像Rust给我们的印象一直是安全、快速,但实际上,完全的安全是不可能实现的。因此,Rust中也是会有不安全的代码的。严格来讲,Rust语言可以分为Safe Rust和Unsafe Rust。Unsafe Rust是Safe Rust的超集。在Unsafe Rust中并不会禁用任何的安全检查,Unsafe Rust出现的原因是为了让开发者可以做一些更加底层的操作。这些事情本身...

2020-04-02 22:50:09 1148 1

原创 走近源码:Redis如何清除过期key

“叮……”,美好的周六就这么被一阵钉钉消息吵醒了。业务组的同学告诉我说很多用户的帐号今天被强制下线。我们的帐号系统正常的逻辑是用户登录一次后,token的有效期可以维持一天的时间。现在的问题是用户大概每10分钟左右就需要重新登录一次。这种情况一般有两种原因:1、token生成时出问题。2、验证token时出现问题。通过检查日志,我发现是验证token时,Redis中已经没有对应的token了。...

2020-04-01 22:51:18 1377

原创 Rust入坑指南:齐头并进(下)

前文中我们聊了Rust如何管理线程以及如何利用Rust中的锁进行编程。今天我们继续学习并发编程,原子类型许多编程语言都会提供原子类型,Rust也不例外,在前文中我们聊了Rust中锁的使用,有了锁,就要小心死锁的问题,Rust虽然声称是安全并发,但是仍然无法帮助我们解决死锁的问题。原子类型就是编程语言为我们提供的无锁并发编程的最佳手段。熟悉Java的同学应该知道,Java的编译器并不能保证代码的...

2020-03-24 23:24:32 1038

原创 Rust入坑指南:齐头并进(上)

我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级。为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外。聊到并发,就离不开多进程和多线程这两个概念。其中,进程是资源分配的最小单位,而线程是程序运行的最小单位。线程必须依托于进程,多个线程之间是共享进程的内存空间的。进程间的切换复杂,CPU利用率低等缺点让我们在做并发编程时更加倾向于使用多线程的方式...

2020-03-16 23:25:53 1047 1

翻译 【译】推荐你使用Vim的三个半理由

在很久以前,软件行业就有一种争论:究竟要不要使用Vim。这种争论有点像音乐界关于模拟信号与数字信号的争论。在大多数工程师眼中,Vim是一种老旧的,已经过时了的文本编辑器。它缺乏很多优秀的功能,用起来也没有现代的IDE舒服。但实际上,Vim绝对不是一种老旧的文本编辑器。Vim就像是手动挡的汽车一样。你必须要学会如何去驾驭它,如何手动换挡。而一旦你习惯了以后,就会获得成倍的收获与乐趣。它可以带着...

2020-03-12 23:13:49 772 1

原创 Rust入坑指南:智能指针

在了解了Rust中的所有权、所有权借用、生命周期这些概念后,相信各位坑友对Rust已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟。

2020-03-10 22:42:03 1252

原创 Rust入坑指南:朝生暮死

今天想和大家一起把我们之前挖的坑再刨深一些。在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚。

2020-03-03 22:07:32 637

全是经典|分布式论文

非常经典的分布式论文,包括分布式基础知识、分布式一致性、分布式数据结构、分布式实战4部分。总量超过40篇!

2019-11-15

opengl画五角星

用opengl画出随时间变大的五角星,还有100个颜色大小不同的

2015-04-24

列主元消去

列主元消去法的源代码,可应用于计算方法课程学习

2014-07-20

机器学习技能图谱.jpg

机器学习技能图谱!

2019-08-29

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

TA关注的人

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