个人学习源码的 HBase误区的总结 与 架构图

HDFS 的备份功能不是给 基于 HBase 等 基于HDFS 的项目做备份的。   如果 HBase 需要备份,那么久需要设置 备份(快照 )功能。

HMaster 、 kafka 等无主结构并不是自我实现的选举, 而是基于 ZooKeeper 的选举策略决策出新的 master

HBase 创建表的 Region 极大的影响插入等性能

HFile写入的时候,是分一个块一个块的写入的,每个Block块64KB左右,这样有利于数据的随机访问,不利于连续访问,连续访问需求大的,可以把Block块的大小设置得大一点。

hbase在写入数据之前会先写入MemStore,成功了再写入HLog,

每当 MemStore 写入数据的时候就会 lock() 写成功后 finally{ unlock() } 那么此时数据就无法被访问了吗?  NONONO  事实上是是 会将数据 copy 到快照  中 snapshot。这个时间很短,复制完就可以访问这个 KVset, 实际 flush 时候,是吧 快照中的 KVset 给Flush 掉了。

Put、Delete在服务端是如何处理?

过程写得比较凌乱了,把之前的总结一下吧:

1、做准备工作,实例化变量

2、检查Put和Delete里面的列族是否和Region持有的列族的定义相同。

3、给Row加锁,先计算hash值做key,如果该key没上过锁,就上一把锁,然后计算出来要写的action有多少个,记录到numReadyToWrite。

4、更新时间戳,把该action里面的所有的kv的时间戳更新为最新的时间戳,它这里也会把之前的没运行的也一起更新。

5、给该region加锁,这个时间点之后,就不允许读了,等待时间需要根据numReadyToWrite的数量来计算。

6、上锁之后,下面就是重头戏了,也就是Put、Delete等的重点。给这些写入memstore的数据创建一个批次号。

7、把kv们写入到memstore当中,然后计算出来一个添加数据之后的新的MemStore的大小addedSize。

8、把kv添加到日志当中,标志状态为成功,如果是用户设置了不写入日志的,它就不写入日志了。

9、先异步添加日志。

10、释放之前创建的锁。

11、同步日志。

12、结束该批次的操作。

Final、同步日志没成功的,最后根据批次回滚MemStore中的操作。

Put和Delete操作就没区别吗,那它怎么删除数据的?

返回在第4步更新时间戳的时候,发现了一些猫腻,Delete的情况执行了prepareDeleteTimestamps方法,看看吧。先判断是否是最新的时间戳,只传了rowkey进去的,它就是最新的,Delete的构造函数:凡是在这个时间点之前的所有版本的所有列,我们都要删除。这里干了一个Get操作,,把列族的多个版本的内容取出来,如果数量不符合预期也会有问题

只有在Compaction之后,hbase的文件才会变小,那在删除之前,我们进行Get或者Scan操作的时候,会不会读到这些没有被删除的数据呢?

来自为知笔记(Wiz)

时间: 2024-08-28 00:40:43

个人学习源码的 HBase误区的总结 与 架构图的相关文章

Duilib 学习源码系列1-创建控件

好了,昨天研究出了为什么加载xml结束以后我在自己新建一个控件位置不能调整,原来要先add才能调属性. 本来这个是昨天的任务,虽然这块内容是前天就看完的,权当边写边复习吧. 上一篇提到 <VerticalLayout name="window" bkcolor="#FFFFFFFF" bkcolor2="#FFAAAAA0" bkcolor3="#00000000"> 代表了一个控件字符串; 上次忘记说了 及时经过

MINA2 源码学习--源码结构梳理

一.mina的整体框架结构及案例: 1.整体结构图: 简述:以上是一张来自网上比较经典的图,整体上揭示了mina的结构,其中IoService包含客户端IoConnector和服务端IoAcceptor两部分.即无论是客户端还是服务端都是这个结构.IoService封装了网络传输层(TCP和UDP),而IoFilterChain中mina自带的filter做了一些基本的操作之外,支持扩展.经过FilterChain之后最终调用IoHandler,IoHandler是具体实现业务逻辑的处理接口,具

JAVAweb例程学习源码分享,超级全!

JAVAweb例程学习源码分享,超级全!我自己也从里面学习到了很多东西! 1.BBS论坛系统(jsp+sql)2.ERP管理系统(jsp+servlet)3.OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)4.博客系统(struts+hibernate+spring)5.车辆管理系统(struts+hibernate+spring+oracle)6.家庭理财系统(java+applet)7.教材订购系统(jsp+servlet+mysql)8.酒店管

跟大家聊聊我们为什么要学习源码?学习源码对我们有用吗?(源码感悟)

1 前言 由于现在微服务很流行,越来越多企业采用了SpringCloud微服务架构,而SpringBoot则是快速构建微服务项目的利器.于是源码笔记以此为切入点,将SpringBoot作为我们源码分析的第一个开源项目,之后还会对更多开源项目进行源码分析.要进行源码分析,笔者结合自身经历来跟大家聊聊我们为什么要学习源码这个话题,大家一起探讨学习. 我们程序员在开发代码时每天都在使用别人写好的框架,无论你是在使用Spring生态的Spring核心,SpringMVC,SpringBoot和Sprin

Java入门基础学习源码,有C或C++语言基础的可以快速掌握

以下为完整源码,需要1.8版本JDK,否则部分新特性可能出现兼容问题,去掉注释号即可运行 package hello; import java.util.Scanner; public class Hello { public static void main(String[] args) { // TODO 自动生成的方法存根 /* //这是第一个程序 System.out.println("这是一个减法计算器"); Scanner in = new Scanner(System.i

设计模式之迭代器模式解析学习源码(十八)

原文献上, 点击滴滴滴 迭代器模式(Iterator)定义: 提供一种方法顺序访问聚合对象的各个元素吗而又不暴露该对象的内部展示 不用Iterator的坏处 原文中编写了三个简单的集合 ArraryList HashSet LinkedList 原先是没有实现Iterable 内部没有具体实现iterator 问题1: 遍历的时候遍历了几次 使用数组遍历的时候实际是遍历了两次, 由于System.arrayCopy 和 set的 toArray 看不到源码, 但是LinkedList 可以看到链

Dubbo学习-源码学习

Dubbo概述 dubbo框架提供多协议远程调用,服务提供方可以是分布式部署.dubbo框架可以很简单的帮我们实现微服务. 此处援引官网上图片 dubbo分为客户端和服务提供方 服务方将服务注册到注册中心 客户端从注册中心获取已注册服务访问方式 客户端通过指定协议访问服务提供方 根据dubbo架构,源码分析我们主要切入点是: dubbo配置如何生效 客户端如何调用服务 注册的服务如何保证被调用到 dubbo远程调用的协议如何工作 针对以上我们来分析Dubbo源码: Dubbo源码是maven管理

【转】MaBatis学习---源码分析MyBatis缓存原理

[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然也在内部提供了相应的支持.通过在框架层面增加缓存功能,可减轻数据库的压力,同时又可以提升查询速度,可谓一举两得.MyBatis 缓存结构由一级缓存和二级缓存构成,这两级

学习源码第二天(渐入佳境)

(function(window,undefined) { window.$ = function() { console.log('我是$函数'); }; })(window); 抛出问题:1.自调用函数是可以访问外界的全局变量的,为什么还要把window当做一个参数?2.undefined作为参数是什么意思? 个人理解问题1:首先传实参window表名了形参window就是外界的全局变量window,那么为什么明明可以直接访问外界的window,却要当成一个局部变量去访问?有两点好处:1.如