- 博客(174)
- 资源 (11)
- 收藏
- 关注

原创 【源码篇】Kafka客户端发送消息
在上一篇文章中,已经介绍了初始化 KafkaProducer 基本流程。当客户端对 KafkaProducer 完成完成后,可以调用 send() 方法将数据发送至kafka broker集群。图中描述了当客户端调用#send方法后的一系列逻辑处理。本文将主要对客户端发送消息的主要流程进行梳理,核心区域(元数据获取、分区操作、Re cordAccumlator、Sender线程唤醒)等核心代码会在后续的文章中单独分析。获取集群元数据当向broker中发送数据时,极其重要的一步是获取到集群的元数据信息
2022-04-23 15:51:14
2920
转载 Redis主从复制原理
Master节点在平时提供服务,另外一个或多个Slave节点在平时不提供服务(或只提供数据读取服务)。当Master节点由于某些原因停止服务后,再人工/自动完成Slave节点到Master节点的切换工作,以便整个Redis集群继续向外提供服务。
2023-02-09 18:01:31
522
原创 JVM之方法区、永久代、元空间三者
方法区实在虚拟机规范里面被定义的,不同的虚拟机对这个定义的实现不同,在HotSpot 虚拟机中在 jdk1.7 版本之前的方法区实现叫永久代(PermGen space),jdk1.8 之后叫做元空间(Metaspace)。
2022-08-31 13:00:31
1892
1
原创 利用SparkLauncher 提交Job
调用SparkLanuncher实例的startApplication方法,但是这种方式在所有配置都正确的情况下使用运行都会失败的,原因是startApplication方法会调用LauncherServer启动一个进程与集群交互,这个操作貌似是异步的,所以可能结果是main主线程结束了这个进程都没有起起来,导致运行失败。...
2022-07-27 22:11:58
846
转载 红黑树(基于2-3树等价)
红黑树是一种常见的自平衡二叉查找树,经常使用于关联数组、字典,在各类语言的底层实现中被普遍应用,Java的TreeMap和TreeSet就是基于红黑树实现的。
2022-06-28 19:17:36
374
原创 2-3查找树
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的 两个键之间,右链接指向的2-3树中的键都大于该结点。...
2022-06-24 12:40:23
1227
3
原创 AVL平衡二叉搜索树
AVL树定义如下:是平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树:1. 每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”)2. 每个节点的左右子树高度差不超过 13. 因为每个结点的高度差不超过1,AVL树搜索、添加、删除的时间复杂度是 O(logn)......
2022-06-22 21:25:20
382
转载 为什么RedisCluster设计成16384个槽?
1.如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。2.redis的集群主节点数量基本不可能超过1000个。3.槽位越小,节点少的情况下,压缩率高
2022-06-21 13:37:09
927
原创 字典树(Tire)
字典树,又称单词查找树,Tire树,是一种树形结构,是一种的哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串)
2022-06-14 17:22:22
446
原创 线段树(SegmentTree)
线段树(segment tree)顾名思义, 是用来存放给定区间(segment or interval)内对应信息的一种数据结构。
2022-06-11 12:02:09
748
原创 最大索引堆(IndexMaxHeap)
索引堆是对堆这种数据结构的优化,是利用真正元素的索引值来组成一个堆,可以映射出一个最大堆或者最小堆,索引堆可分为最大索引堆 (IndexMaxHeap) 和最小索引堆 (IndexMinHeap)
2022-06-08 13:48:12
258
原创 【源码篇】Kafka生产者内存管理BufferPool
我们都知道kafka生产者Send一条记录并没有直接发送到kafka服务端,而是先将它保存到内存 (RecordAccumulator) 中,用于压缩之后批量发送,这里内存的创建和释放是比较消耗资源的,为了实现内存的高效利用,基本上每个成熟的框架或者工具都有一套内存管理机制,kafka的生产者使用 BufferPool 来实现内存 (ByteBuffer) 的复用。红色和绿色的总和代表 BufferPool 的总量,用totalMemory表示(由buffer.memory配置);绿色代表可使用的空间,
2022-03-28 14:02:16
3141
原创 【源码篇】KafkaProducer初始化
kafka源码对 java 和 gradle 版本有适配要求,否则导入源码会编译不通过,笔者引用各版本如下。Kafka源码3.0java版本11grade版本7.4.1图解KafkaProducer流程源代码分析上图对 kafka 生产者初始化的整体流程进行了简单的梳理,接下来我们从代码层面对整体流程进行一个复原。源码导入idea后都会看到一个example工程包,这个包里面有生产者和消费者的例子,可以作为源码学习的切入口。在初始化生产者之前会设置一些配.
2022-03-25 14:45:42
1980
转载 零拷贝技术
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。这次,我们就以「文件传输」作为切入点,来分析 I/O 工作方式,以及如何优化传输文件的性能。为什么要有 DMA 技术?在没有 DMA 技术前,I/O 的过程是这样的:CPU 发出对应的指令给磁盘控制器,然后返回;磁盘控制器收到指令后,于是.
2022-03-21 15:20:46
282
1
原创 Kafka术语:AR、OSR、ISR、HW和LEO以及之间的关系
kafka 多副本Kafka 为分区引入了多副本(Replica)机制,通过增加副本数量可以提升容灾能力。同一分区的不同副本中保存的是相同的消息(当然在同一时刻,副本之间可能并非完全一样),副本之间是“一主多从”的关系,其中leader副本负责处理读写请求,follower副本只负责与leader副本的消息同步。副本处于不同的broker中,当leader副本出现故障时,从follower副本中重新选举新的leader副本对外提供服务。Kafka通过多副本机制实现了故障的自动转移,当Kafka集群中某个b
2022-03-18 16:04:11
3199
2
原创 Kafka在Zookeeper存储结构
在Kafka2.8之前,Kafka强依赖zookeeper,2.8版本之后Kafka可以采用KRaft(Kafka Raft)模式,逐步去除对zookeeper的依赖(依然兼容)。在zookeeper中存储了很多kafka元数据信息, 例如 「Broker的注册信息」、「Topic的信息」 、 「运维操作临时信息 」、 「配置信息」等等其他信息。/brokers/topics/[topic]: 存储某个topic的partitions所有分配信息{ "version": "版本编号目前固定为数字.
2022-03-17 23:13:00
1746
转载 一文读懂Jvm垃圾回收机制
Java垃圾回收本文主要摘自《深入理解Java虚拟机》,内容较多,尽量全面概括了 Java 垃圾回收机制、垃圾回收器以及内存分配策略等内容。了解 Java 垃圾回收之前,需要先了解 Java内存区域Java 垃圾回收机制垃圾回收主要关注 Java 堆Java 内存运行时区域中的程序计数器、虚拟机栈、本地方法栈随线程而生灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由 JIT 编译器进行一些优化),因此这
2022-02-21 18:41:43
252
原创 责任链模式(参照netty)
1. 概念讲解责任链模式(Chain of Responsibility Pattern)为请求创建了一个处理对象的链(就好比于工厂的流水线作业一样,工人干完一个程序交由下一个工人进行操作,下一个工人干完后又交由下下一个工人进行操作)。发起请求和具体处理请求的过程解耦:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递。2. 如何实现责任链模式?处理器抽象类:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。具
2021-11-05 13:13:09
299
1
原创 TCP与UDP协议
1. OSI 网络七层模型为使不通计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。各层的主要功能低三层物理层:使原始的数据比特流能在物理介质上传输。数据链路层:通过校验、确认和反馈重发等手段,形成稳定的数据链路。(01010101)网络层:进行路由选择和流量控制。(IP 协议)承上启下传输层:提供可靠的端口到端口的数据传输服务(TCP/UDP 协议)高三层会话层:负责建立、管理和终止进程之间的会话和数据交
2021-08-25 14:42:54
672
3
转载 优先队列和堆
什么是优先队列?听这个名字就能知道,优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT(Abstract Data Type)来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素);这些操作等价于队列的enQueue和deQueue操作,区别在于,对于优先队列,元素进入队列的顺序可能与其被操作的顺序不同,作业调度是优先队列的一个应
2021-08-03 10:45:57
1139
1
原创 二叉树与二叉搜索树
本文将从二叉树、二叉搜索树的定义和性质入手,通过代码实现深度认识二分搜索树。什么是二叉树?在我们的现实场景中,比如图书馆我们可以根据分类快速找到我们想要找到的书籍。比如我们要找一本叫做《Java编程思想》这本书,我们只需要根据理工科 —> 计算机 —>Java语言分区就可以快速找到我们想要的这本书。这样我们就不需要像数组或者链表这种结构,我们需要遍历一遍才能找到我们想要的东西。再比如,我们所使用的电脑的文件夹目录本身也是一种树的结构。从上面的描述我们可知,树这种结构具备天然的高效性可以巧妙
2021-07-15 14:50:53
1825
转载 最基础的动态数据结构:链表
什么是链表?链表是一种线性结构,也是最基础的动态数据结构。我们在实现动态数组、栈以及队列时,底层都是依托的静态数组,靠resize来解决固定容量的问题,而链表是真正的动态数据结构。学习链表这种数据结构,能够更深入的理解引用(或者指针)以及递归。其中链表分为单链链表和双链链表,本文中所介绍的是单链链表。链表中的数据是存储在一个个的节点中,如下这是一个最基本的节点结构:class Node { E e; Node next; // 节点中持有下一个节点的引用}我们可以将链表想象成火车,每一节车
2021-07-13 13:15:59
855
转载 栈Stack和队列Queue
栈(Stack)栈是一种线性结构。相比数组,栈对应的操作是数组的子集,所以我们完全可以基于动态数组去实现它栈只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶栈是一种后进先出的数据结构(Last In First Out 简称为LIFO)栈最常见的应用场景:括号匹配-编译器无处不在的Undo操作(撤销),将我们每次的操作放入栈中,执行撤销操作时只需要把放入的元素出栈即可程序调用的系统栈,方法调用时所展现的调用层级,就是栈的结构,如下图:栈的基本结构我们将基于前面所实现的动
2021-07-01 22:46:14
240
1
转载 对Java静态数组的二次封装
数组的特点数组最大的优点是可以快速查询,因为数组直接通过索引查询很快:array[2],所以在随机访问时有一定的优势。其数据结构是简单的线性序列,这使得元素访问非常快速,并且按照索引遍历数组方便。数组最好应用于“索引有语意”的情况但并非所有有语意的索引都适用于数组,例如索引是身份证号这种长度的数字,就无法作为索引使用而数组也同样可以处理“索引没有语意”的情况数组的缺点:根据内容查找元素速度慢数组的大小一经确定不能改变数组只能存储一种类型的数据插入、指定删除元素效率低未封装任何方法,所
2021-07-01 13:06:01
247
1
转载 偏函数(Partial Function)
Scala中的Partial Function就是一个“残缺”的函数,就像一个严重偏科的学生,只对某些科目感兴趣,而对没有兴趣的内容弃若蔽履。Partial Function做不到以“偏”概全,因而需要将多个偏函数组合,最终才能达到全面覆盖的目的。所以这个Partial Function确实是一个“部分”的函数。对比Function和Partial Function,更学术味的解释如下:对给定的输入参数类型,函数可接受该类型的任何值。换句话说,一个(Int) => String 的函数可以接收任
2021-04-25 13:08:19
5726
1
原创 大数据开发、数仓、实时数仓
最近上传的精品课程,有需要的请收藏大数据开发架构课程: https://www.bilibili.com/video/BV1GX4y1g7yM/Flink实时数仓项目实践: https://www.bilibili.com/video/BV1jv41187iP/大数据体系数据仓库建设: https://www.bilibili.com/video/BV1gh411D7md/关注公众号 ,专注于java大数据领域离线、实时技术干货定期分享!个人网站 www.lllpan.top...
2021-04-20 11:46:54
360
1
转载 Java Future详解与使用
原文地址:https://dayarch.top/p/java-future-and-callable.html前言创建线程有几种方式?这个问题的答案应该是可以脱口而出的吧继承 Thread 类实现 Runnable 接口但这两种方式创建的线程是属于”三无产品“:没有参数没有返回值没办法抛出异常class MyThread implements Runnable{ @Override public void run() { log.info("my t.
2021-04-13 15:39:53
3435
4
翻译 锁升级过程(偏向锁/轻量级锁/重量级锁)
锁的前置知识如果想要透彻的理解java锁的来龙去脉,需要先了解锁的基础知识:锁的类型、java线程阻塞的代价、Markword。锁的类型锁从宏观上分类,分为悲观锁与乐观锁。乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低。每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是通过C
2021-04-09 13:01:36
13193
8
转载 Java中long和double的原子性
Java中long和double的原子性java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗?JVM中对long的操作是不是原子操作?首先,通过一段程序对long的原子性进行判断。测试程序如下:public class LongAtomTest implements Runnable { private static long field = 0; private vo
2021-04-01 12:51:33
628
原创 用户模式和内核模式(线程级)
用户模式和内核模式区分主要是因为,为了计算机系统的正常安全运行,有些硬件资源(如:中断装置)和特权指令是不可以对用户进程开放的,所以区分了两种模式。内核模式和用户模式内核空间存放的是操作系统内核代码和数据,是被所有程序共享的,在程序中修改内核空间中的数据不仅会影响操作系统本身的稳定性,还会影响其他程序,这是非常危险的行为,所以操作系统禁止用户程序直接访问内核空间。要想访问内核空间,必须借助操作系统提供的 API 函数,执行内核提供的代码,让内核自己来访问,这样才能保证内核空间的数据不会被随意修改,才能
2021-03-31 11:46:34
8287
6
原创 Flink算子间数据传递模式
算子之间传输数据的形式可以是one-to-one (forwarding)的模式也可以是redistributing的模式,具体是哪一种形式,取决于算子的种类。One-to-one: Stream(比如在 source 和 map operator 之间)维护着分区以及元素的顺序。那意味着 map 算子的子任务看到的元素的个数以及顺序跟 source 算子的子任务生产的元素的个数、顺序相同,map、fliter、flatMap 等算子都是 one-to-one 的对应关系(类似于 spark 中的窄依
2021-03-18 13:22:56
1984
8
原创 Flink运行时组件和基于Yarn的任务提交
运行时组件Flink 运行时架构主要包括以下四个不同的组件,它们会在运行流处理应用程序时协同工作:分发器(Dispatcher):**可以跨作业运行,它为应用提交提供了 REST 接口。当一个应用被提交执行时,分发器就会启动并将应用移交给一个 JobManager。**由于是 REST 接口,所以 Dispatcher 可以作为集群的一个 HTTP 接入点,这样就能够不受防火墙阻挡。Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作业执行的信息(Dispatcher 在架构中可能
2021-03-16 21:16:32
350
2
原创 Windows窗口函数(增量聚合)
案例可参考(切换到Flink1.12分支查看最新代码):https://github.com/perkinls/flink-local-train 定义窗口Window assigner,后,我们需要指定要在每个窗口上执行的计算。这是窗口函数的职责,一旦系统确定某个窗口已准备好进行处理,就可以使用该窗口函数来处理每个(按key分组)窗口的元素。ProcessWindowFunction可以与ReduceFunction或AggregateFunction组合在一起,在元素到达窗口时增量地聚合它们.
2021-03-09 14:02:55
1010
4
原创 Flink窗口起始时间计算
Flink中窗口的时间不是根据进入窗口的第一个元素计为窗口的开始时间和加Size计窗口结束时间,而是根据Flink内置计算公式timestamp - (timestamp - offset + windowSize) % windowSize计算。/** * Method to get the window start for a timestamp. * * @param timestamp epoch millisecond to get the window start. (记录时间戳)
2021-03-05 13:04:31
3854
原创 如何理解Flink中Window?
Window 概述Streaming 流式计算是一种被设计用于处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而 window 是一种切割无限数据 为有限块进行处理的手段。Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有限大 小的”buckets”桶,我们可以在这些桶上做计算操作。Window 类型Window 可以分成两类:CountWindow: 按照指定的数据条数生成一个 Window,与时间无关。TimeWi
2021-03-03 13:39:27
1483
转载 低级处理函数ProcessFunction
原文链接:https://zhuanlan.zhihu.com/p/1307082771. ProcessFunction定义ProcessFunction 函数是低阶流处理算子,可以访问流应用程序所有(非循环)基本构建块:事件 (数据流元素)状态 (容错和一致性,仅用于keyed stream)定时器 (事件时间和处理时间,仅用于keyed stream)ProcessFunction 可以被认为是一种提供了对 KeyedState 和定时器访问的 FlatMapFunction。每在.
2021-02-23 17:53:44
2575
转载 优雅的处理Exception
在Finally块中清理资源或者使用try-with-resource语句当使用类似InputStream这种需要使用后关闭的资源时,一个常见的错误就是在try块的最后关闭资源。public void doNotCloseResourceInTry() { FileInputStream inputStream = null; try { File file = new File("./tmp.txt"); inputStream = new FileIn
2021-02-19 12:37:20
1524
原创 Spark中任务报错java.io.IOException: Filesystem closed
问题来源Spark程序操作HDFS的工具类中,手动获取了FileSystem,执行完HDFS相关操作后对FileSystem进行close,在后续的代码中报Filesystem closed错误。ERROR LiveListenerBus: Listener EventLoggingListener threw an exceptionjava.io.IOException: Filesystem closed at org.apache.hadoop.hdfs.DFSClient.checkOpe
2021-02-03 19:27:56
3289
Oracle经典教程_入门(夯推).pdf
2020-11-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人