转载:https://blog.csdn.net/shengmingqijiquan/article/details/52922009
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();
1
步骤2:构建一个HTable句柄
提供Configuration对象
提供待访问Table的名称
HTable table = new HTable(conf, tableName);
1
步骤3:执行相应的操作
执行put、 get、 delete、 scan等操作
table.getTableName();
1
步骤4:关闭HTable句柄
将内存数据刷新到磁盘上
释放各种资源
table.close();
1
实例:
4.2.3 向HBase写入数据
步骤1:创建一个Put对象;
Put put = new Put(Bytes.toBytes("rowkey"));
1
步骤2:设置cell值;
Put.add(family, column, value)
Put.add(family, column, timestamp, value)
Put.add(KeyValue kv)
1
2
3
步骤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在什么时候使用!三种情况:需要随机访问,批量大数据高并发操作,操作为简单读写访问!
————————————————
版权声明:本文为CSDN博主「数据圈」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/shengmingqijiquan/article/details/52922009