转载地址:https://dxer.github.io/2016/03/18/hbase/

HBase一些基本概念

1、Row key 行主键,在对HBase进行查询时候只能依靠Row key,HBase不支持条件查询等类似于一些主流数据库的查询方式,读取记录只能依赖行主键以及进行全局扫面,可以将行主键想象成主流数据库查询过程中用到的主键(例如,id)。

2、Column Family 列族,可以将列族想象成日常主流数据库中的表结构的所有列的一个大管家,列族中存储了所有列的名称,整个表包括多少列,列族就包括多少(除去Row key和Timestamp列)。

3、Column 列,HBase的每个列都隶属于一个列族,以列族名称作为前缀,同一列族中的所有列会聚集在一个存储单元上,同时按照Column key进行排序。

4、Timestamp 在HBase中,通过row key 和 Colum Family确定一份数据,同一个row key和Colum Family可能有多份不同的数据,HBase通过时间戳来区分这些数据,同时按照时间戳对左右的数据进行排序,最新的数据排在最前面,时间戳默认为系统当前时间(精确到毫秒),同时也可以人为设置该值。

5、Value 我们在HBase表中精确查询数据时,通过TableName找到表,接着通过Row key找到对应的行,然后通过ColumnKey找到相应的列,最后根据时间戳找到最新的需要查询的值,这个值就是value。

6、存储类型 在HBase中,表名称是字符串,行键和列名称是二进制值(即就是Java中的Byte[]),时间戳是一个64为的整数(Java中的long类型),最后的查询结果Value是字节数组(Java中的byte[]类型)。

7、存储结构

在HBase中,整个数据表是按照行键进行排序,每行包括任意数量的列,列和列之间通过列键进行排序,每列包括若干的数据,整个HBase的存储结构可以理解如下:

1
2
3
4
5
6
7
8
9
Table(
Row key,List(
SortedMap(
Column,list(
Value,Timestamp
)
)
)
)

HBase数据模型

  1. 表(table):HBase用表组织数据。表名是字符串(String),由可以在文件系统路径里使用的字符组成。
  2. 行(row):在表里,数据按行存储。行由行健(rowkey)唯一标识。行健没有数据类型,视为字节数组byte[]。
  3. 列族(column family):行里的数据按照列族进行分组,列族也影响到HBase数据的物理存放。因此,他们必须事前定义并且不轻易修改。表中每行拥有相同列族,尽管行不需要在每个列族里存储数据,列族名字是字符串(String),由可以在文件系统路径里使用的字符组成。
  4. 列限定符(column qualifier):列族里的数据通过列限定符或列来定位。列限定符不必事前定义。列限定符不必在不同行之间保持一致。就像行健一样,类限定符没有数据类型,视为字节数据byte[]。
  5. 单元(cell):行健、列族和列限定符一起确定一个单元。存储在单元里的数据成为单元值(value)。值没有数据类型,视为字节数组byte[]。
  6. 时间版本(version):单元值有时间版本。时间版本用时间戳标识,是一个long型。没有指定时间版本时,当前时间戳作为操作的基础。HBase保留单元值时间版本的数量基于列族进行配置。默认3个版本。

数据坐标

行健、列族、列限定符和时间版本

执行写入的时候会写到两个文件:预写式日志(write-ahead log,也称HLog)和MemStore。HBase的默认方式是把写入动作记录在这两个地方,以保证数据持久化。只有当这两个地方的变化信息都写入并确认后,才认为写动作完成。

MemStore是内存里的写入缓冲区,HBase中数据在永久写入硬盘之前在这里积累。当MemStore填满后,其中的数据会刷写到硬盘,生成一个HFile文件。HFile是HBase使用底层存储格式。HFile对应列族,一个列族可以有多个HFile,但一个HFile不能存储多个列族的数据。在集群的每个节点上,每个列族都有一个MemStore。

注:不写入WAL会在RegionServer故障时增加丢失数据的风险。关闭WAL,出现故障时HBase可能无法恢复数据,没有刷写到硬盘的所有写入数据都会丢失。

HBase在读操作上使用了LRU(最近最少使用算法)缓存技术。也叫作BlockCache。BlockCache设计用来保存从HFile里读入内存的频繁访问的数据,避免硬盘读。每个列族都有自己的BlockCache。

BlockCache中的Block是HBase从硬盘完成一次读取的数据单位。HFile物理存放形式是一个Block的序列外加这些Block的索引。从HBase中读取一个Block需要先将索引上查找一次改Block然后从硬盘读出、Block是建立索引的最小数据单位,也是从硬盘读取的最小数据单位。Block大小按照列族设定,默认是64kb。如果主要用于随机查询,可能需要细粒度的Block索引,小一点儿的Block更好一些。Block变小会导致索引变大,进而消耗更多内存。如果经常执行顺序扫描,一次读取多个Block,大一点的Block更好一些。Block变大意味着索引项变少,索引编写,因此节省内存。

从HBase总读出一行,首先会检查MemStore等待修改的队列,然后检查BlockCache看包含改行的Blocj是否最近被访问过,最后访问硬盘上对应的HFile。

执行HBase删除命令的时候,实际上数据并不会立即删除,只是会在该数据上打上删除的记录。被标记的记录不能在Get和Scan命令中返回结果。因为HFile文件是不能改变的,直到执行一次大合并,含有这些标记的数据才会被处理,被删除的数据占用的空间才会释放。

大合并(major compaction):处理给定region的一个列族的所有HFile。大合并完成后,这个列族的所有HFile合并成一个文件,可以从Shell中收工出发整个表(或者特定region)的大合并。大合并是HBase清理被删除记录的唯一机会

小合并(minor compaction):把多个小HFile合并成一个大HFile。


HBase Shell命令

Command 描述
alter 修改列族模式
count 统计表中行的数量
create 创建表
describe 显示表相关的详细信息
delete 删除指定对象的值(可以为表,行,列对应的值,另外也可以指定时间戳的值)
deleteall 删除指定行的所有元素值
disable 使表无效
enable 使表有效
drop 删除表
exists 测试表是否存在
exit 退出HBase Shell的值
get 获取行或单元的值
incr 增加指定表、行或列的值
list 列出HBase中存在的所有表
put 向指定的表单元添加值
tools 列出HBase所支持的工具
scan 通过对表的扫描来获取对应的值
status 返回HBase集群的状态信息
shutdown 关闭HBase集群(与exit不同)
truncate 重新创建指定表
version 返回HBase版本信息

create

创建表

1
2
3
4
5
6
7
8
create 't1', {NAME => 'f1', VERSIONS => 5}

create 't1', {Name => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}

#等价于:

create 't1', 'cf', 'cf2', 'cf3'

list

列出HBase中包含的表名称

put

向指定表中添加值

1
2
put 't1', 'rowkey', 'cf:name', 'test', ts
#向t1表的rowkey,列cf:name添加值name,并指定时间戳为ts

scan

对表的扫描来获取对应的值

1
2
3
scan 't1'
scan 't1', {COLUMNS => 'cf'}
scan 't1', {COLUMNS => 'cf', LIMIT => 10}

get

获取行或者单元的值。

1
2
get 't1', 'rowkey'
get 't1', 'rowkey', {COLUMN => 'cf:name'}

注:COLUMN和COLUMNS是不同的,scan操作中的COLUMNS指定的是表的列族,get操作中的COLUMN指定的是特定的列,COLUMN的值是指上是”列族+列修饰符”

 
 

[转载] HBase入门的更多相关文章

  1. Hbase入门教程--单节点伪分布式模式的安装与使用

    Hbase入门简介 HBase是一个分布式的.面向列的开源数据库,该技术来源于 FayChang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像 ...

  2. HBase入门基础教程之单机模式与伪分布式模式安装(转)

    原文链接:HBase入门基础教程 在本篇文章中,我们将介绍Hbase的单机模式安装与伪分布式的安装方式,以及通过浏览器查看Hbase的用户界面.搭建HBase伪分布式环境的前提是我们已经搭建好了Had ...

  3. 一条数据的HBase之旅,简明HBase入门教程-Write全流程

    如果将上篇内容理解为一个冗长的"铺垫",那么,从本文开始,剧情才开始正式展开.本文基于提供的样例数据,介绍了写数据的接口,RowKey定义,数据在客户端的组装,数据路由,打包分发, ...

  4. 1.1-1.3 HBase入门

    一.HBASE入门 部分参考链接:https://www.cnblogs.com/steven-note/p/7209398.html 1.简介 HBase – Hadoop Database,是一个 ...

  5. 一条数据的HBase之旅,简明HBase入门教程-开篇

    常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...

  6. 一条数据的HBase之旅,简明HBase入门教程1:开篇

    [摘要] 这是HBase入门系列的第1篇文章,主要介绍HBase当前的项目活跃度以及搜索引擎热度信息,以及一些概况信息,内容基于HBase 2.0 beta2版本.本系列文章既适用于HBase新手,也 ...

  7. hbase入门-相关概念

    hbase入门-概念理解 参考文档: https://blog.csdn.net/luanpeng825485697/article/details/80319552 1.      hbase概念 ...

  8. [转载] HBase vs Cassandra:我们迁移系统的原因

    转载自http://www.csdn.net/article/2010-11-29/282698 我的团队近来正在忙于一个全新的产品——即将发布的网络游戏www.FightMyMonster.com. ...

  9. 【HBase】HBase Getting Started(HBase 入门指南)

    入门指南 1. 简介 Quickstart 会让你启动和运行一个单节点单机HBase. 2. 快速启动 – 单点HBase 这部分描述单节点单机HBase的配置.一个单例拥有所有的HBase守护线程- ...

随机推荐

  1. Curl实现ElasticSearch的增删改查

    一.添加数据(laravel必须安装Curl扩展) $data = [ 'username'=>"张三", 'sex'=>"女", 'age'=&g ...

  2. max of 直线划平面

    在一个无限延伸平面上有一个圆和n条直线,这些直线中每一条都在一个圆内,并且同其他所有的直线相交,假设没有3条直线相交于一点,试问这些直线最多将圆分成多少区域. Input 第一行包含一个整数T,(0& ...

  3. C#调用java包里的方法

    用IKVM,步骤: 下载ikvmbin-7.2.4630.5.zip,解压,把bin目录所在路径加到环境变量path里 2.电脑开始->CMD,输入ikvmc –out:”输出dll文件的路径” ...

  4. android项目导入eclipse变成java项目——修改.project文件——亲测有效

    解决办法:http://www.cnblogs.com/yunfang/p/6068599.html

  5. html布局(盒子)

    在body里面放置两个盒子,里面盒子设置margin-top,外层盒子生效?在里面盒子上面加一个块元素,设置高度 表单 form action="地址" method=" ...

  6. Mac上实现Python用HTMLTestRunner生成html测试报告

    一.导入HTMLTestRunnerNew文件 首先,我们要知道如果要利用HTMLTestRunnerNew生成测试报告的话,就需要对其进行导入: HTMLTestRunnerNew下载地址:链接:h ...

  7. centos6.5删除/boot后恢复

    删除/boot下的所有东西 更改为从光盘启动并进入紧急救援模式 语言选择英语 选择美式键盘布局 不配置网络 选择Continue 这里提示系统已经被挂载到了/mnt/sysimage 选择shell, ...

  8. Spring MVC学习step1——框架熟悉

    b站视频链接,整理的一些笔记,图是网上找到的黑马教案,侵权删,在此记录学习笔记 SpringMVC框架 步骤: 第一步:发起请求到前端控制器(Dispatcherservlet) 第二步:前端控制器请 ...

  9. OSI,TCP/IP,五层协议的体系结构,以及各层协议

    OSI分层 (7层):物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. TCP/IP分层(4层):网络接口层. 网际层.运输层. 应用层. 五层协议 (5层):物理层.数据链路层.网络层. ...

  10. Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】

    最近在做公司的项目的时候,开始把部分程序迁移到EF Core,然后有了一些感触,趁着还没忘却,还是先记录下来. EF Core还在成长中,我写这个的时候,版本是2.2.如果对着已有的EF 5/6来说, ...