自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 mit 6.824 lab1A解析

1.前言想不想自己实现一下分布式的主从选举算法?reids,tidb,kafka主从协调都用到了raft一致性算法。mit6.824分布式系统的第二次作业lab2A就是用golang实现一个简易版的主从选举,本篇讲这个作业的实现,挺有趣的。可以做到在规定时间内选出leader,leader挂掉后选出新的leader,挂掉的leader,follower重新加入集群后不影响现在的leader。听着简单,真要自己实现就复杂了。所有规则在raft论文里面都说了,一板一眼的复现就能通过作业,但是只有在自己踩坑一

2022-03-06 16:54:45 834

原创 HBase的regionServer

RegionServer核心模块RegionServer后面简称rs,是比较核心的模块,数据写入读取的基础组件。rs包含HLog,MemStore,HFile和BlockCache。1. RS内部结构HLog用来保证数据写入的可靠性,BlockCache读缓存,一个strore是一个列族,memstore是写缓存,数据达到阈值直接落盘HFile, HFile按照rowkey排序,文件之间异步会进行多路归并(LSM结构)。1.1 HLog所有写操作先追加写入HLog再写入memstore。rs挂了

2022-02-23 11:44:13 2324

原创 图床备用文件

2022-02-20 13:21:31 203

原创 Mit6.824 lab1全解析(推导历程+代码)

0.前言mit 6.824分布式系统课程主页lab1是第一次作业,本菜鸡用了好几天独立完成,经过一次改版优化了数据结构和解决任务元数据并发环境下的data race问题,建议大家做之前有自己独立的思考,有很多可行方案都能完成任务。比如看到有的小伙伴采用master(coordinator)轮询slave(worker)进行交互,我是用slave定时发送请求触发master懒执行大部分任务(后面会聊到原因)。也有的小伙伴用队列增删加锁实现并发安全,本人用的golang自带的channel作为任务队列。不

2021-10-24 11:50:43 18485 4

翻译 《In Search of an Understandable Consensus Algorithm》论文阅读

前言一致性算法Raft,久闻大名,今天拜读一下论文。一致性算法支撑了大规模可靠软件系统,Paxos是主导算法,但是它太难理解。raft是简化版的Paxos。raft有几个主要部分:领导选举/日志复制/安全性。raft的特性有强领导者(Strong Leader):Raft 使用一种比其他算法更强的领导形式。例如,日志条目只从领导者发送向其他服务器。这样就简化了对日志复制的管理,使得 Raft 更易于理解。领导选取(Leader Selection):Raft 使用随机定时器来选取领导者。这

2021-10-23 20:35:40 147

原创 HDFS读写流程分析+源码解读

HDFS读写流程分析结合《Hadoop权威指南》 + Hadoop源码 + 《Hadoop 2.X HDFS源码剖析》,对HDFS读写流程和源代码以及常见面试题做了总结内容提要HDFS读写流程源代码分析和真实生产环境debug案例高频面试题总结1. HDFS读流程《Hadoop权威指南》:HDFS读操作,一般是客户端通过RPC 调用namenode以确定问价按块起始位置,对于每一个块,namenode返回保存该块副本的datanode地址(返回结果具有优先顺序),客户端通过Distri

2021-10-21 14:01:23 2332

原创 HDFS的 rpc接口

分布式文件系统的操作涉及 master(namenode),slave(datanode),client之间的各种调用连接,HDFS将这些rpc通信抽象成不同接口Hadoop RPC:ClientProtocal :client和namenodeClientDatanodeProtocal: client和datanodeDatanodeProtocal: datanode和namenodeInterDatanodeProtocal:datanode和datanode1.ClientProt

2021-10-17 22:36:09 430

原创 kafka源码解析(7)生产者处理响应数据(粘包拆包/处理暂存状态的响应/回调函数)

tcp粘包拆包问题解决pollSelectionKeys.attemptRead中channel.read方法,receive.complete()是对接受的消息进行判断是否完整public NetworkReceive read() throws IOException { NetworkReceive result = null; //初始化对象NetworkReceive if (receive == null) { receive

2021-09-27 17:57:43 421

原创 kafka源码解析(6)kafka网络设计如何用nio建立连接发送数据

kafka网络设计发送流程,较为复杂,画了一个全局图后才算明了,下面解读下sendProducerData流程send的发送数据方法sendProducerData中,首先会调用recordAccumulator的ready(红色)方法检查哪个消息分区可以发送数据得到ReadyCheckResult(包含可以发送的tp对应的node),顺便看下有没有没见过的新topicPartition,有后面就去更新元数据,然后调用networkClient的ready方法,这就是要检查node的连接状态了,没联通

2021-09-26 12:35:26 239

原创 Java nio基本知识2:selector/FileLock

selector是选择器,用来检查channel的状态,可以实现单线程管理多个channel。通道和选择器之间的关系,是通过注册完成的,注册的时候需要指定监控通道的哪些操作。监控状态可读: SelectionKey.OP_READ可写: SelectionKey.OP_WRITE连接: SelectionKey.OP_CONNECT接受: SelectionKey.OP_ACCEPT多个操作都感兴趣,可以用int key = SelectionKey.OP_WRITE | SelectionK

2021-09-22 22:02:27 131

原创 Java nio基本知识1:channel和buffer

阻塞IO读写时候阻塞,每个请求是一个线程非阻塞IO基于Reactor工作模式,IO不会阻塞,注册特定IO事件,发生特定事件时候系统会通知。核心对象是Selector,读、写、注册发生时候selector可以找到发生事件的Selector Channel,获取客户端数据。非阻塞IO事件本身不阻塞,但是获取事件的select()方法是阻塞的,本质是发生io时候,而不是以前只要IO流打开就一直等待。NIO核心组件:Channels Buffers Selectorsfilechannel写入文件

2021-09-21 22:38:41 386

原创 kafka源码解析(5)消息发送

Kafka的sender线程核心发送方法就是sendProducerDatasendProducerData读源数据缓存发送前需要获取消息的目的地broker节点和RecordAccumulator中要发送的消息,分为两步step1 先拉取本地缓存的元信息step2 accumulator.ready查看哪个队列可以发送 Cluster cluster = metadata.fetch(); // get the list of partitions with data read

2021-09-19 22:57:56 236

原创 kafka源码解析(4)生产者解析之内存池

众所周知,jvm的GC会有不小的时间损耗,stop the world会严重影响kafka 生产者的消息发送。如果我们每次消息发送后,对中间生成的实例不做任何处理留给JVM,可能会造成严重的后果。因此Kafka生产者用内存池这种东西来循环利用中间生成的消息缓存bytebuffer。依据我的理解,就是:标准大小消息的bytebuffer,用过一次后接着用装下一条消息。对于非标准大小的消息,用另外手段分配。对于大消息手动使用赋值null对于GC有无帮助?看到下面的说明java对象不再使用时,为什么要赋值为

2021-09-18 16:44:05 259

原创 kafka源码解析(3)生产者解析之RecordAccumulator

RecordAccumulator这是生产者的缓冲组件可以在生产者的send方法中看到RecordAccumulator.RecordAppendResult result = accumulator.append(tp, timestamp, serializedKey,serializedValue, headers, interceptCallback, remainingWaitMs);示意图经过分区器后向RecordAccumulator里面的batches缓存,一开始要判断该top

2021-09-16 16:12:26 670

原创 java线程知识初级

线程1.基本概念多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。线程是比进程更小的执行单位,线程是进程的基础之上进行进一步的划分。所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程,这些线程可以同时存在,同时运行,一个进程可能包含多个同时执行的线程。2.Java中的线程方法1继承了Thread类就可以当线程使用class Cat extends Thread{ int times = 0; @Override

2021-09-14 13:47:34 86

原创 kafka源码解析(2)生产者解析之元数据初始化和拉取全流程

生产者数据准备好了,还需要知道kafka集群元数据才能发送出去,这里我们看下元数据是怎么过来的生产者的doSend方法中,有一个ClusterAndWaitTime类,包含了Cluster类(真正的元数据)和等待时间private static class ClusterAndWaitTime { final Cluster cluster; final long waitedOnMetadataMs; ClusterAndWaitTime(Cluster

2021-09-09 17:27:06 436

原创 Kafka源码解析(1)生产者解析之初始化

kafka生产者构造器如下,可以传入properties,KV序列化器等等从传入properties这个构造器入手解析下,其实KV序列化器也可以在properties里面指定,就是下面这种创建kafka生产者的常规操作,指定broker的信息等等 public static KafkaProducer<String, String> createKafkaProducer() { Properties properties = new Properties();

2021-09-05 21:57:49 269

原创 Canal监听阿里云RDS Mysql踩坑

Canal监听阿里云RDS Mysql中间的坑canal下载安装,mysql binlog开启常规操作,照着github上的指导就完事了1)需要保证账号有如下权限,让管理员大大开一下,否则报权限错误grant select, replication slave,replication client on . to ‘你的账号’@’%’;2)canal停了一段时间重启需要删掉instance.properties文件所在目录中的meta.dat文件,因为阿里云的bin_log很快就会被清理掉,cana

2021-09-02 17:36:40 1620 2

原创 python疫情爬虫/可视化01

疫情可视化01原本的想法是找到各大发热门诊的患者数量,批量产生GPS整合到全国地图,后来发现没有统一数据的网站,只有腾讯,丁香医生等有每个地级市的数据数据爬取数据来自丁香医生分析网页,发现返回的数据是静态的,大喜,省事不少。直接request.get首先分析返回的信息,发现具体城市的数据都在 def get_all_city(): # 爬取 url = "https:/...

2020-02-07 19:00:00 3329 1

原创 【graphviz】failed to execute [‘dot’, ‘-Tsvg’], make sure the Graphviz executables are on your systems

在jupyter lab中进行数据可视化时候报错:failed to execute [‘dot’, ‘-Tsvg’], make sure the Graphviz executables are on your systems之前用pip install 命令装过这个安装包,查证后是因为没有添加环境变量先用 pip show graphviz找到安装路径然后添加环境变量,还是无效con...

2020-01-30 19:36:30 1001

原创 Maven打包错误[FATAL] Non-parseable settings

maven工程打包报错[ERROR] Error executing Maven.[ERROR] 1 problem was encountered while building the effective settings[FATAL] Non-parseable settings C:\Users\Kevin\.m2\settings.xml: expected start tag n...

2019-12-26 18:53:04 2450

原创 flume基础总结

Flume概述Flume是一种基于流式架构的日志采集,聚合和传输系统。可以用来把Java EE平台的日志数据(比如实时推荐)传输给HDFS主要目的:实时读取服务器日志,写到HDFS中架构Agent:JVM进程。以事件(event)的形式把数据传送到目的地,主要由三部分组成:source,channel,sink???? source: 负责生产事件(接收数据)。Source组件可以处理各种...

2019-12-24 20:22:06 260

原创 【hive】记一个小坑:mysql-connector-java版本

做Hive分区的时候,报异常Failed with exception MetaException(message:For direct MetaStore DB connections, we don't support retries at the client level.)org.apache.hadoop.hive.ql.metadata.HiveException: MetaExc...

2019-12-23 18:42:59 1364

原创 JVM探索笔记之二 栈与堆

方法区1供各线程共享的运行时内存区域,储存了每个类的构造信息,例如常量池,字段和方法数据,构造函数和普通方法的字节码内容。小class在硬盘,大Class在方法区中2方法区是规范,不同虚拟机不一样(实例变量在堆内存中,和方法区无关)栈栈负责运行,堆负责存储。栈也叫栈内存,主管java程序运行,是在线程创建时候创建,声明周期跟随于线程周期,线程结束内存释放。栈不存在垃圾回收。8中基本类型变...

2019-12-08 21:02:11 155

原创 数据结构【栈】栈的基本概述以及综合计算器的实现

1 栈的概述以及基本代码实现栈(Stack)是一种先入后出的有序列表,先进入的元素总是存在于栈底。删除和加入新元素都是在栈顶进行操作的简单的代码实现如下,主要就是一个固定大小的数组stack(这里假设是专门放整数的数组),一个栈顶指针topclass ArrayStack{ private int maxSize; private int[] stack; private int t...

2019-12-05 15:51:18 327

原创 JVM探索笔记之一 ClassLoader

JVM1 什么是类加载器2 类加载器有几种3 双亲委派4 沙箱安全5JVM结构图JVM是运行在操作系统之上的,和硬件没有直接交互类装载器ClassLoader:负责加载class文件,class文件在文件开头有特定的文件标识,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构。ClassLoader只负责class文件的加载,是否能运行是Execu...

2019-12-05 14:11:02 113

原创 JUC探索笔记之二 synchronized

在多线程环境下,共享数据会存在安全问题,sychronized可以保证同一时只有一个线程能进入代码块或者是这个方法。因此synchronized可以有三种用法:修饰代码块,修饰类中的普通方法(锁实例对象),修饰静态方法(锁类对象)。下面来看下作用于普通方法的例子手机类有两个功能:发短信和发邮件class Phone{ public synchronized void sendEmail()...

2019-12-04 14:00:17 79

原创 JUC探索笔记之一

什么是进程/线程?进程是资源分配的最小单位,线程是程序运行的最小单位。进程是程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文 (上下文是除了cpu之外的运行环境)。 线程是共享了进程的上下文环境,的更为细小的CPU时间段,正是因为线程共享进程的数据,使用相同的地址空间,CPU切换线程远远快于切换进程。例子 进程:word.exe 线程:纠错功能,断电恢复并发的小例子简...

2019-11-29 21:22:35 95

原创 Java hashMap 思维导图辅助理解

HashMap概述链表(LinkedList)短板是查询慢,动态数组(ArrayList)短板是增删慢,HashMap克服了这两个缺点,在录入数据时候花费额外的算力结构化每个数据,做到了可以快速查找,增删。存储数据时候输入<key, value>键值对, 在后面的查询时候直接给出key就可以快速得到value1.源码分析HashMap的创建, 扩容, 数据存储结构2.让我们从...

2019-11-14 16:00:29 214

原创 LeetCode 67二进制求和【简单】

LeetCode 67二进制求和【简单】解题思路几点细节注意1 不要化成十进制求和再返回二进制,因为二进制String位数有可能非常多,没法进行计算,因此一位一位进行运算才行2 String是无法用索引得到里面的字符的,要用charAt(index)方法3 想要得到字符转int,用 (int)字符 - '0’即可, int可以不写, 字符遇到运算符自动变成int思路二进制运算,需要考虑...

2019-11-05 22:35:57 159

原创 LeetCode 498对角线【中等】详细图解

LeetCode 498对角线【中】详细图解给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示第一步:观察到数字遍历轨迹分为两种,一种是斜向上,一种是斜向下。对应方法:在复制到新数组中进行计数,偶数向上,奇数向下,用%2控制int k = 0;if(k % 2 == 0){ 斜向上代码 ...

2019-11-02 15:38:12 620

原创 Java Array.sort详解

Java Array.sort详解基本用法基本用法sort是Arrays类中一个静态方法,此处用针对整数数组的方法,具体用法是将一个整数数组按照从小到大的顺序排列。方法里面直接指向DualPivotQuicksort方法。public static void sort(int[] a) { DualPivotQuicksort.sort(a, 0, a.length - 1,...

2019-10-25 18:16:08 1250

空空如也

空空如也

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

TA关注的人

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