您的位置:首页 > 运维架构 > 网站架构

【Hadoop入门学习系列之六】HBase基本架构、编程模型和应用案例

2016-10-26 15:40 781 查看

一.HBase概述

HBase是一个构建在HDFS上的分布式列存储系统

HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储

从逻辑上讲, HBase将数据按照进行存储。

Hbase是Hadoop生态系统的一个组成部分



Hbase与HDFS对比

共同点:

两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点;

不同点:

HDFS:

适合批处理场景

不支持数据随机查找

不适合增量数据处理

不支持数据更新

HBase:

大:一个表可以有数十亿行,上百万列;

无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;

面向列:面向列(族)的存储和权限控制,列(族)独立检

索;

稀疏:对于空( null)的列,并不占用存储空间,表可以设计

的非常稀疏;

数据多版本:每个单元中的数据可以有多个版本,默认情况

下版本号自动分配,是单元格插入时的时间戳;

数据类型单一: Hbase中的数据都是字符串,没有类型

行存储与列存储



二.HBase模型和基本架构

2.1 HBase数据模型

HBase是基于Google BigTable模型开发的,典型的key/value系统;



Hbase逻辑视图



Rowkey与Column Family



Hbase支持的操作

所有操作均是基于rowkey的;

支持CRUD( Create、 Read、 Update和Delete)和Scan;

单行操作

 Put

 Get

 Scan

多行操作

 Scan

 MultiPut

没有内置join操作,可使用MapReduce解决。

2.2 HBase物理模型

每个column family存储在HDFS上的一个单独文件中;

Key 和 Version number在每个 column family中均由一份;

空值不会被保存。

Table中的所有行都按照row key的字典序排列;Table 在行的方向上分割为多个Region;



Region按大小分割的,每个表开始只有一个region,随着数据增多, region不断增大,当增大到一个阀值的时候,region就会等分会两个新的region,之后会有越来越多的region;



Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上;



Region虽然是分布式存储的最小单元,但并不是存储的最小单元。Region由一个或者多个Store组成,每个store保存一个columns family;每个Strore又由一个memStore和0至多个StoreFile组成;memStore存储在内存中, StoreFile存储在HDFS上。



2.3 基本架构



2.3.1Hbase基本组件

Client

包含访问HBase的接口,并维护cache来加快对HBase的访问

Zookeeper

保证任何时候,集群中只有一个master

存贮所有Region的寻址入口

实时监控Region server的上线和下线信息。并实时通知给Master

存储HBase的schema和table元数据

Master

为Region server分配region

负责Region server的负载均衡

发现失效的Region server并重新分配其上的region

管理用户对table的增删改查操作

Region Server

Region server维护region,处理对这些region的IO请求

Region server负责切分在运行过程中变得过大的region

2.3.2 Zookeeper作用

HBase 依赖ZooKeeper

默认情况下,HBase管理ZooKeeper实例,比如, 启动或者停止ZooKeeper

Master与RegionServers 启动时会向ZooKeeper注 册

Zookeeper的引入使得 Master不再是单点故障



2.4HBase容错性

Master容错: Zookeeper重新选择一个新的Master

无Master过程中,数据读取仍照常进行;

无master过程中, region切分、负载均衡等无法进行;

RegionServer容错:定时向Zookeeper汇报心跳,如果一旦时 间内未出现心跳

Master将该RegionServer上的Region重新分配到其他RegionServer上;

失效服务器上“预写”日志由主服务器进行分割并派送给新的

RegionServer

Zookeeper容错: Zookeeper是一个可靠地服务

一般配置3或5个Zookeeper实例。

三.HBase应用举例

3.1何时使用HBase?

需对数据进行随机读操作或者随机写操作;

大数据上高并发操作,比如每秒对PB级数据进行上千次操作;

读写访问均是非常简单的操作。

3.2 HBase应用企业





四.HBase编程实战

4.1 Hbase 访问方式

Native Java API

 最常规和高效的访问方式;

HBase Shell

 HBase的命令行工具,最简单的接口,适合HBase管理使用;

Thrift Gateway

 利用Thrift序列化技术,支持C++,PHP,Python等多种语言,适合其他异构系统在线访问HBase表数据;

REST Gateway

 支持REST 风格的Http API访问HBase, 解除了语言限制;

MapReduce

 直接使用MapReduce作业处理Hbase数据;

 使用Pig/hive处理Hbase数据

4.2 Hbase Java编程

4.2.1 Hbase Java API概述

Hbase是用Java语言编写的,支持Java编程是自然而然的事情;

支持CRUD操作;

Create, Read, Update, Delete

 Java API包含Hbase shell支持的所有功能,甚至更多;

Java API是访问Hbase最快的方式。

4.2.2 Java API程序设计步骤

步骤1:创建一个Configuration对象,包含各种配置信息

Configuration conf = HbaseConfiguration.create();


步骤2:构建一个HTable句柄

 提供Configuration对象

 提供待访问Table的名称

HTable table = new HTable(conf, tableName);


步骤3:执行相应的操作

 执行put、 get、 delete、 scan等操作

table.getTableName();


步骤4:关闭HTable句柄

 将内存数据刷新到磁盘上

 释放各种资源

table.close();


实例:



4.2.3 向HBase写入数据

步骤1:创建一个Put对象;

Put put = new Put(Bytes.toBytes("rowkey"));


步骤2:设置cell值;

Put.add(family, column, value)
Put.add(family, column, timestamp, value)
Put.add(KeyValue kv)


步骤3:调用HTable中的put方法,写入数据;

步骤4:关闭HTable句柄。



4.2.4 从Hbase中读取数据

支持的API类型

 通过rowkey获取一行数据

 通过一个rowkey集合获取多条记录

 扫描整个表或者表的一部分

扫描表

 可指定扫描的范围[startkey endkey)

 表中数据是按照rowkey排序的

API 特点

 数目有限、使用简单

读取数据时注意事项:

 只读取需要的数据

 尽可能增加数据约束条件

 可增加family, column(s), time range 和 max versions等约束条件

接口实例

 get.setTimeRange(minStamp, maxStamp)

 get.setMaxVersions(maxVersions)

 get.addFamily(family)

 get.addColumn(family, column)

4.2.5 从Hbase中删除数据



4.2.6 从Hbase中scan数据



五.总结

本博客是记录了HBase的基础内容,核心掌握HBase的设计思想和java编程,搞清楚HBase在什么时候使用!三种情况:需要随机访问,批量大数据高并发操作,操作为简单读写访问!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐