- 博客(197)
- 资源 (5)
- 问答 (3)
- 收藏
- 关注
原创 Flink源码阅读:Checkpoint机制(下)
前面我们了解到在方法中会创建四个 Future,用来支持不同类型的状态写入。if (null!} else {我们主要关心 ManagedState,ManagedState 都是调用方法来写入数据的,下面具体看 KeyedState 和 OperatorState 的具体实现。本文我们重点梳理了 KeyedState 数据写入的代码。其主要步骤包括:同步拷贝状态数据的引用,创建 Checkpoint 输出流并完成 Checkpoint 持久化,最后返回元信息结果。
2025-12-21 22:24:19
569
原创 Flink源码阅读:Checkpoint机制(上)
本文深入分析了Flink的Checkpoint机制源码实现,从JobManager端触发流程、TaskManager端执行流程到非Source节点处理流程进行了详细梳理。重点解析了CheckpointCoordinator的触发逻辑、Barrier消息广播、状态异步写入及上报机制,并区分了EXACTLY_ONCE和AT_LEAST_ONCE两种模式的不同处理方式。通过源码分析揭示了Flink如何通过Checkpoint实现可靠的容错机制,为理解Flink的容错原理提供了深入的技术细节。
2025-12-20 21:54:54
612
原创 Flink源码阅读:状态管理
本文从源码层面分析了Flink状态管理的实现机制。首先介绍了State的分类和使用方式,包括Keyed State和Operator State的获取方法。接着详细讲解了State Backend的三种存储类型及其创建过程,重点剖析了StreamTask中keyedStateBackend的创建逻辑,包括KeyGroupRange计算和状态恢复流程。
2025-12-17 19:18:07
676
原创 Flink源码阅读:集群启动
摘要:本文介绍了Flink集群的启动流程,重点分析了JobManager的启动过程。通过分析启动脚本和核心代码,详细展示了StandaloneSessionClusterEntrypoint如何加载配置并启动集群,包括初始化RPC服务、HA服务、BlobServer等关键组件。
2025-12-16 20:50:13
931
原创 Flink源码阅读:如何生成ExecutionGraph
Flink ExecutionGraph 执行过程解析 本文详细介绍了Flink中ExecutionGraph的执行过程。
2025-12-15 22:46:14
944
原创 Flink源码阅读:如何生成JobGraph
Flink执行图转换:从StreamGraph到JobGraph的优化过程 摘要:本文详细分析了Flink中StreamGraph向JobGraph的转换机制。StreamGraph作为高层逻辑图,JobGraph则是优化后的执行图,主要区别包括:1)StreamGraph对应API逻辑,JobGraph侧重执行优化;2)JobGraph通过算子链优化提高性能。转换过程核心是StreamingJobGraphGenerator.createJobGraph方法,包括预验证、链化操作符、设置并行度等步骤。
2025-12-14 20:24:38
946
原创 Flink源码阅读:如何生成StreamGraph
Flink程序的执行流程通过四种图结构实现转换:StreamGraph、JobGraph、ExecutionGraph和Physical Graph。其中StreamGraph是根据用户代码生成的初始拓扑结构。代码分析从StreamExecutionEnvironment开始,重点研究了DataStream转换过程。
2025-12-14 20:22:07
1408
原创 Flink学习笔记:反压
本文介绍了Flink中的反压机制及其监控方法。反压是流式系统中下游对上游的数据处理反馈机制,当上游生产速度超过下游消费速度时触发。Flink数据传输分三种情况:同线程直接共享内存、本地跨线程通过Buffer交互、远程跨节点通过网络传输。反压监控通过Web UI显示状态(OK/LOW/HIGH),分别对应不同的反压程度。文章详细分析了本地和远程场景下反压的感知原理,为Flink运维提供了重要参考。
2025-12-12 22:38:55
657
原创 Flink学习笔记:状态后端
Flink状态存储机制解析:介绍了两种状态后端(HashMapStateBackend和EmbeddedRocksDBStateBackend)的存储方式、特点及适用场景,以及Checkpoint存储类型(JobManager和FileSystem)的配置方法。详细说明了三种组合配置方式(MemoryStateBackend、FsStateBackend、RocksDBStateBackend)及其实现代码,并解释了状态序列化/反序列化过程。帮助开发者根据应用需求选择合适的状态存储方案。
2025-12-11 21:57:21
1200
原创 Flink学习笔记:如何做容错
本文我们介绍了 Flink 是如何做容错的,分别介绍了 Checkpoint 和 Savepoint,以及它们之间的区别。本文多次提到了 Checkpoint 和 Savepoint 依赖的稳定存储,我会在下一篇文章进行详细的介绍。
2025-12-10 22:09:04
1037
原创 Flink学习笔记:状态类型和应用
Flink的容错机制和状态管理是其核心优势之一。文章首先区分了无状态和有状态计算,重点介绍了Flink的两种状态类型:Raw State(需开发者自行管理)和Managed State(由Flink Runtime管理)。Managed State又分为Keyed State(基于键值对)和Operator State(绑定到算子实例),详细说明了ValueState、ListState等具体状态类型的使用方法。
2025-12-09 22:42:23
632
原创 Flink学习笔记:多流 Join
本文介绍了 Flink 中实现流数据 Join 的两种主要方法:Window Join 和 Interval Join。Window Join 通过窗口机制对相同 key 的元素进行关联,分为滚动窗口、滑动窗口和会话窗口三种类型。Interval Join 则基于事件时间范围进行关联,支持设置上下偏移量。此外,文章还介绍了使用 CoGroup 实现 left join 的方法。
2025-12-08 22:08:47
698
原创 Flink学习笔记:窗口
Flink窗口机制是实时数据处理的核心概念,主要分为Keyed Window和Non-Keyed Window两类。根据数据划分依据可分为时间窗口和计数窗口,按规则又分为滚动窗口、滑动窗口、会话窗口和全局窗口四种类型。时间窗口最常用,其中滑动窗口以固定步长滑动,允许元素跨窗口计算;滚动窗口是滑动窗口的特例,窗口间无重叠;会话窗口根据数据间隔动态决定窗口大小;全局窗口则处理所有数据。每种窗口类型都提供了灵活的API配置选项,支持不同业务场景的实时计算需求。
2025-12-06 00:58:42
1086
原创 Flink学习笔记:时间与Watermark
本文摘要: 本文重点介绍了Flink流处理中的两个核心概念:时间属性和Watermark机制。首先阐述了Flink支持的三种时间属性:事件时间(EventTime)、处理时间(ProcessTime)和摄入时间(IngestionTime),并通过图示说明了它们的区别。然后详细讲解了Watermark的工作原理,包括其定义、作用以及处理迟到数据的三种方法。
2025-12-04 23:28:56
1297
原创 遇见ZooKeeper:初识
0. 什么是ZooKeeperZooKeeper 是一个开源的分布式,它的设计目标是将那些复杂且容易出错的分布式协同服务封装起来,抽象出一个高效可靠的原语集,并以一系列简单的接口提供个用户使用。ZooKeeper 有几大特征:易用ZooKeeper 的理解和使用成本都很低,它提供的是一种层级式的命名空间,这一点和标准的文件系统类似。可靠ZooKeeper 服务可以支持集群模式,并且能够轻松扩展,客户端可以连接到任意一个服务器,都能够获得服务。有序ZooKeeper 的节点是可以保证有序的。每
2021-02-22 23:29:57
382
原创 哲少荐书:鞋狗
很久没来荐书了,主要原因是最近读到的值得推荐的书比较少(其实是偷懒了,读书少了)。还好春节假期来临,也趁着难得的假期时间读完了一本书——《鞋狗》。这是一本读完就想要推荐给大家的书(没错,我就是刚刚读完就来推荐了)。提到《鞋狗》相信还有些朋友不太熟悉,但是提到耐克,相信大家一定都知道。即使没有买过耐克的东西,也一定在商场看到过耐克的线下门店。而《鞋狗》这本书就是耐克的创始人菲尔·奈特的亲笔自传。这本书讲述了耐克“从0到1”的过程,书中讲述了菲尔·奈特在面对合作伙伴背叛,开户行翻脸,权利的压迫等问题时是如
2021-02-18 23:04:59
581
原创 Elasticsearch从入门到放弃:浅谈算分
今天来聊一个 Elasticsearch 的另一个关键概念——相关性算分。在查询 API 的结果中,我们经常会看到 _score 这个字段,它就是用来表示相关性算分的字段,而相关性就是描述一个文档和查询语句的匹配程度。打分的本质其实就是排序,Elasticsearch 会把最符合用户需求的文档排在最前面。在 Elasticsearch 5.0 之前,相关性算分算法采用的是 TF-IDF 算法,而在5.0之后采用的是 BM 25 算法。听到这也许你会比较疑惑,想知道这两个算法到底是怎么样的。别急,下面我们
2021-01-27 00:18:44
427
翻译 【译】代码中如何写出更有意义的命名
作为一名开发人员,在编码过程中,你总会花很多时间来思考如何正确命名。因为名称无处不在,你需要考虑文件名、类名、方法名和变量名。虽然我们需要花费很多时间,但是为了更好的命名还是值得的。本文我将向你介绍几个能够帮助你编写优质命名的简单规则。命名这件事本身也是一门艺术。使用显示意图的名称名称直接显示意图这件事说起来容易做起来难。你是否经常遇到一些难以判断其用途的名称?一个好的经验法则是:如果一个名称需要注释,那么它本身就是不能说明意图的。这个代码片段就演示了一个不能显示意图的变量命名。<?php
2020-08-06 20:15:12
416
原创 Elasticsearch从入门到放弃:瞎说Mapping
前面我们聊了 Elasticsearch 的索引、搜索和分词器,今天再来聊另一个基础内容—— Mapping。Mapping 在 Elasticsearch 中的地位相当于关系型数据库中的 schema,它可以用来定义索引中字段的名字、定义字段的数据类型,还可以用来做一些字段的配置。从 Elasticsearch 7.0开始,Mapping 中不在乎需要定义 type 信息了,具体原因可以看官方的解释。字段的数据类型我们刚刚提到 Mapping 中可以定义字段的数据类型,这可能是 Mapping 最常
2020-08-04 22:56:37
2586
翻译 【译】求你不要再写没用的提交信息了
开始尝试优化你的 Git 提交信息吧我们都看到过的你在一个项目中使用 Git 作为版本控制。当你做完了一次修改之后,你想要尽快更新你的分支。所以你打开了终端,输入了下面这些命令,完成了一次远端分支的更新。git add .git commit -m "added new feature"git push然后你做了一些自测,发现了一个新鲜的 bug。问题不大,你很轻松的就解决掉了这个 bug,现在你需要把新的代码再次提交到远程分支,于是你很熟练的使用起 Git 命令。git add ..
2020-07-22 23:35:28
336
原创 Elasticsearch源码解析:环境搭建
在之前学习Redis的过程中,我就是一边通过文档/视频学习,一边阅读源码。我发现两种方法可以相辅相成,互相补充。阅读文档可以帮助我们快速了解某个功能,阅读源码有助于我们更深入的理解这一功能的实现及思想。因此,在学习 Elasticsearch 的时候我也准备采用这样的模式。所以,从今天开始,我会定期更新学习 Elasticsearch 源码的收获。在开始学习之前,需要先把环境准备好。所以今天就先分享一下准备环境的过程。软件环境Intellij Idea:2020.1版本JDK 12Gradle 5
2020-07-20 22:12:26
924
原创 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
607
原创 Elasticsearch从入门到放弃:分词器初印象
Elasticsearch 系列回来了,先给因为这个系列关注我的同学说声抱歉,拖了这么久才回来,这个系列虽然叫「Elasticsearch 从入门到放弃」,但只有三篇就放弃还是有点过分的,所以还是回来继续更新。之前我们聊过了 Elasticsearch 的索引和文档,不太熟悉的话可以先翻阅一下前文。今天再一起聊一下 Elasticsearch 的分词器。关于分词如果你是讲 Elasticsearch 作为搜索引擎,那么你应该需要对分词进行了解,Elasticsearch 的分词是将全文本转换为一系列单
2020-06-29 22:24:49
1201
原创 Rust入坑指南:万物初始
有没有同学记得我们一起挖了多少个坑?嗯…其实我自己也不记得了,今天我们再来挖一个特殊的坑,这个坑可以说是挖到根源了——元编程。
2020-04-09 22:12:39
2299
原创 Rust入坑指南:居安思危
任何事情都是相对的,就像Rust给我们的印象一直是安全、快速,但实际上,完全的安全是不可能实现的。因此,Rust中也是会有不安全的代码的。严格来讲,Rust语言可以分为Safe Rust和Unsafe Rust。Unsafe Rust是Safe Rust的超集。在Unsafe Rust中并不会禁用任何的安全检查,Unsafe Rust出现的原因是为了让开发者可以做一些更加底层的操作。这些事情本身...
2020-04-02 22:50:09
1126
1
原创 走近源码:Redis如何清除过期key
“叮……”,美好的周六就这么被一阵钉钉消息吵醒了。业务组的同学告诉我说很多用户的帐号今天被强制下线。我们的帐号系统正常的逻辑是用户登录一次后,token的有效期可以维持一天的时间。现在的问题是用户大概每10分钟左右就需要重新登录一次。这种情况一般有两种原因:1、token生成时出问题。2、验证token时出现问题。通过检查日志,我发现是验证token时,Redis中已经没有对应的token了。...
2020-04-01 22:51:18
1373
原创 Rust入坑指南:齐头并进(下)
前文中我们聊了Rust如何管理线程以及如何利用Rust中的锁进行编程。今天我们继续学习并发编程,原子类型许多编程语言都会提供原子类型,Rust也不例外,在前文中我们聊了Rust中锁的使用,有了锁,就要小心死锁的问题,Rust虽然声称是安全并发,但是仍然无法帮助我们解决死锁的问题。原子类型就是编程语言为我们提供的无锁并发编程的最佳手段。熟悉Java的同学应该知道,Java的编译器并不能保证代码的...
2020-03-24 23:24:32
1026
原创 Rust入坑指南:齐头并进(上)
我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级。为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外。聊到并发,就离不开多进程和多线程这两个概念。其中,进程是资源分配的最小单位,而线程是程序运行的最小单位。线程必须依托于进程,多个线程之间是共享进程的内存空间的。进程间的切换复杂,CPU利用率低等缺点让我们在做并发编程时更加倾向于使用多线程的方式...
2020-03-16 23:25:53
1033
1
翻译 【译】推荐你使用Vim的三个半理由
在很久以前,软件行业就有一种争论:究竟要不要使用Vim。这种争论有点像音乐界关于模拟信号与数字信号的争论。在大多数工程师眼中,Vim是一种老旧的,已经过时了的文本编辑器。它缺乏很多优秀的功能,用起来也没有现代的IDE舒服。但实际上,Vim绝对不是一种老旧的文本编辑器。Vim就像是手动挡的汽车一样。你必须要学会如何去驾驭它,如何手动换挡。而一旦你习惯了以后,就会获得成倍的收获与乐趣。它可以带着...
2020-03-12 23:13:49
761
1
原创 Rust入坑指南:智能指针
在了解了Rust中的所有权、所有权借用、生命周期这些概念后,相信各位坑友对Rust已经有了比较深刻的认识了,今天又是一个连环坑,我们一起来把智能指针刨出来,一探究竟。
2020-03-10 22:42:03
1243
原创 Rust入坑指南:朝生暮死
今天想和大家一起把我们之前挖的坑再刨深一些。在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚。
2020-03-03 22:07:32
629
翻译 【译】教你用16个小时从0构建一个Rust应用
我们在2019年的最后两天,参加了Prodigy Education举办的黑客马拉松,许多团队聚在一起努力将他们的想法变成现实。我们之中有的人只是单纯为了好玩,有的是想学一些新的知识,还有些人可能是想证明一些概念或想法。我在过去几周总是被动的获取Rust相关信息或使用Rust的代码,因此我认为hackathon是一次学习Rust的绝佳时机。hackathon的时间紧迫性使我更加快速的去学习,...
2020-02-24 22:58:38
1307
原创 吐血推荐珍藏的IDEA插件
之前给大家推荐了一些我自己常用的VS Code插件,很多同学表示很受用,并私信我说要再推荐一些IDEA插件。作为一名职业Java程序员/业余js开发者,我平时还是用IDEA比较多,所以也确实珍藏了一些IDEA插件。今天就一并分享给大家。在最开始,我还是想先介绍一下IDEA中如何安装插件,首先打开Preferences(菜单栏打开或者使用快捷键Command+,)在Windows版本中应该是Set...
2020-02-10 14:23:14
9854
16
原创 Rust入坑指南:海纳百川
今天来聊Rust中两个重要的概念:泛型和trait。很多编程语言都支持泛型,Rust也不例外,相信大家对泛型也都比较熟悉,它可以表示任意一种数据类型。trait同样不是Rust所特有的特性,它借鉴于Haskell中的Typeclass。简单来讲,Rust中的trait就是对类型行为的抽象,你可以把它理解为Java中的接口。
2020-01-15 02:46:28
1943
翻译 【译】教你用50种语言写Hello, World
当我们学习一门新的语言时,“Hello, World!“通常是我们所写的第一个程序。相信作为一名程序员的你,职业生涯中至少完成了一个“Hello, World!“程序。程序员一般也都会使用多门语言,甚至有多数人都会使用十几种语言。
2020-01-07 22:50:19
7377
30
原创 Rust入坑指南:亡羊补牢
如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大。它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃。所以今天我们就来聊一聊Rust中如何处理程序错误,也就是所谓的“亡羊补牢”。
2020-01-01 13:38:47
1787
翻译 antirez:Redis6真的来了
12月20号,Redis发布了Redis6-rc1版本,作者antirez也在自己的博客中宣布了这一消息,并对Redis6版本做了一些介绍,以下是译文。
2019-12-24 22:51:12
988
IntelliJ idea Web项目配置问题(JDBC驱动注册失败)
2017-07-07
Ubuntu安装Mysql启动出错
2016-11-20
为什么在VC中正常,用gcc编译生成文件运行就不正常
2015-04-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅