Hbase源码系列之源码前奏hbase:meta表相关详细介绍

一,基本功能介绍

-root-表在HBase 0.9.6以后的版本被移除了。

Hbase 0.9.6以前,三个重要信息:

1,-root-表的位置存储在Zookeeper上(只会存在一个regionserver上),内容是.meta表的存储信息

2,.meta表存储在一个regionserver上,存储的是用户的表的region信息,用户表越大,这个表的region会越多,进而会分布到不同的regionserver。

3,用户的表信息,用户表示存储在各个regionserver上。

Hbase 0.9.6以后,移除了-root-表,用hbase:meta表代替了.meta表,hbase:meta表存的位置直接存储于Zookeeper上。

二,表内容介绍

1,-root-表结构

Key:

Key的格式为:.META.,,1

Values:

info:regioninfo: 序列化的hbase:meta表的HRegionInfo实例。

info:server:存储hbase:meta表的regionserver的server:port

info:serverstartcode:该Regionserver拥用hbase:meta表的起始时间

2,hbase:meta(.meta.)表结构

Key:

Region key的格式是:[table],[region start key],[region id]

Values:

info:regioninfo: 序列化的当前region的HRegionInfo实例。

info:server:存储这个region的regionserver的server:port

info:serverstartcode:该Regionserver拥用该region的起始时间

3,Zookeeper的存储位置

hbase:meta的存储节点为,直接获取其值(protocolbuffer序列化的):

/hbase/meta-region-server

4,数据访问流程

A),0.9.6以前的版本

Client--------->zookeeper--------->-ROOT-(单region)----->.META.------------->用户表region

比下面多了一个定位-ROOT-表的过程。

B),0.9.6及以后的版本

Client--------->zookeeper-------->hbase:meta--------->用户表region

Client的会从Zookeeper找到hbase:meta的位置,然后扫描该表找到我们需要请求的region信息,直接跟存储该region的regionserver建立连接,请求数据,而不是经由master。这些信息会被客户端缓存,避免多次请求,但是在master进行balance或者regionserver挂掉的话回去重新获取该信息。

三,总结

这样减少我们与master的交互,master只负责管理类的操作,数据的读写完全与其无关,减少了很多中间环节。只需要两次查找(找到hbase:meta位置和定位region),就可以定位到region,然后直接进行读写数据。数据的读写很类似kafka的,后面详细给大家对比。

那么,既然hbase:meta表这么重要,我们肯定会对其安全性及跟用户数据对比的一致性有很高的要求。那么下面提几点,大家都会关心:

1,hbase:meta所在的regionserver宕机了怎么办。

采用hdfs副本和wal技术。Hbase:meta所在的regionserver宕机后会重新分配给其它的regionserver。每次修改都会更新RS的wal的。

2,hbase:meta和用户region信息不一致怎么处理。

A),hbase提供的有修复指令。

B),可以根据源码去实现自己的修补指令。

元数据和用户实际的表信息不一致是很常见的现象,所以这两点后面会详细介绍。

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2017-07-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

32680
来自专栏Linux驱动

13.Linux键盘按键驱动 (详解)

在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标:        实现键盘驱动,让开发板的...

48150
来自专栏机器学习算法与Python学习

一文了解十大 Linux 命令行工具!

作为一名程序员,Linux命令行是每天必用的工具。我整理了一些能够提高日常生产力的小工具。一些工具可以作为系统自带命令的替代品,另一些则提供操作系统没有的功能。...

28110
来自专栏祥子的故事

python | os包常用命令介绍

41750
来自专栏积累沉淀

Java程序员面试题集(86-115)

Java程序员面试题集(86-115) 摘要:下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏...

32070
来自专栏玄魂工作室

如何学python 第十九课 文件操作

今天我们来说说文件操作。文件操作在程序编写里有着举足轻重的作用。文件操作,主要包含文件的输入和输出。学会了文件操作,就可以写出更符合实际需求的脚本。 我会先介绍...

392110
来自专栏java一日一条

Java Web应用中调优线程池的重要性

不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求。线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的。本文主要介绍...

11710
来自专栏有趣的django

Django用户登录与注册系统

一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py sta...

2.4K70
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

53080
来自专栏淡定的博客

php之laravel学习常见错误1(连载中)

下面是我们整理的php的laravel学习的常见的错误以及解决的办法,我还会持续更新,请关注

29130

扫码关注云+社区

领取腾讯云代金券