大数据
文章平均质量分 92
ligen1112
这个作者很懒,什么都没留下…
展开
-
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 · 899 阅读 · 0 评论 -
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 · 2401 阅读 · 0 评论 -
Mit6.824 lab1全解析(推导历程+代码)
0.前言mit 6.824分布式系统课程主页lab1是第一次作业,本菜鸡用了好几天独立完成,经过一次改版优化了数据结构和解决任务元数据并发环境下的data race问题,建议大家做之前有自己独立的思考,有很多可行方案都能完成任务。比如看到有的小伙伴采用master(coordinator)轮询slave(worker)进行交互,我是用slave定时发送请求触发master懒执行大部分任务(后面会聊到原因)。也有的小伙伴用队列增删加锁实现并发安全,本人用的golang自带的channel作为任务队列。不原创 2021-10-24 11:50:43 · 19576 阅读 · 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 · 182 阅读 · 0 评论 -
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 · 2593 阅读 · 0 评论 -
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 · 471 阅读 · 0 评论 -
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 · 449 阅读 · 0 评论 -
kafka源码解析(6)kafka网络设计如何用nio建立连接发送数据
kafka网络设计发送流程,较为复杂,画了一个全局图后才算明了,下面解读下sendProducerData流程send的发送数据方法sendProducerData中,首先会调用recordAccumulator的ready(红色)方法检查哪个消息分区可以发送数据得到ReadyCheckResult(包含可以发送的tp对应的node),顺便看下有没有没见过的新topicPartition,有后面就去更新元数据,然后调用networkClient的ready方法,这就是要检查node的连接状态了,没联通原创 2021-09-26 12:35:26 · 278 阅读 · 0 评论 -
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 · 265 阅读 · 0 评论 -
kafka源码解析(4)生产者解析之内存池
众所周知,jvm的GC会有不小的时间损耗,stop the world会严重影响kafka 生产者的消息发送。如果我们每次消息发送后,对中间生成的实例不做任何处理留给JVM,可能会造成严重的后果。因此Kafka生产者用内存池这种东西来循环利用中间生成的消息缓存bytebuffer。依据我的理解,就是:标准大小消息的bytebuffer,用过一次后接着用装下一条消息。对于非标准大小的消息,用另外手段分配。对于大消息手动使用赋值null对于GC有无帮助?看到下面的说明java对象不再使用时,为什么要赋值为原创 2021-09-18 16:44:05 · 306 阅读 · 0 评论 -
kafka源码解析(2)生产者解析之元数据初始化和拉取全流程
生产者数据准备好了,还需要知道kafka集群元数据才能发送出去,这里我们看下元数据是怎么过来的生产者的doSend方法中,有一个ClusterAndWaitTime类,包含了Cluster类(真正的元数据)和等待时间private static class ClusterAndWaitTime { final Cluster cluster; final long waitedOnMetadataMs; ClusterAndWaitTime(Cluster原创 2021-09-09 17:27:06 · 490 阅读 · 0 评论 -
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 · 294 阅读 · 0 评论 -
flume基础总结
Flume概述Flume是一种基于流式架构的日志采集,聚合和传输系统。可以用来把Java EE平台的日志数据(比如实时推荐)传输给HDFS主要目的:实时读取服务器日志,写到HDFS中架构Agent:JVM进程。以事件(event)的形式把数据传送到目的地,主要由三部分组成:source,channel,sink???? source: 负责生产事件(接收数据)。Source组件可以处理各种...原创 2019-12-24 20:22:06 · 294 阅读 · 0 评论