HBase基础
1HBase简介
1.1 HBase是什么
是 Apache Hadoop 的数据库,是建 立在 HDFS 之上,被设计用来提供高可靠性、高性能、列存储、可伸缩、多版本的 NoSQL 的分布式数据存储系统,实现对大型数据的实时、随机的读写访问。简而言之是针对海量数据,快速随机查询,面向列的NoSQL 分布式数据库。
1.2 HBase产生背景
随着数据规模越来越大,数据存储的水平扩展,而目前的关系型数据库更专注一台机器。海量数据量存储成为提升应用性能的瓶颈,单台机器无法负载海量的数据处理,随之而来的出现了很多的分布式存储解决方案,HBase就是其中之一。
Hadoop 使用分布式文件系统Hdfs存储大数据,并使用 MapReduce 来处理。Hadoop 擅长于存储各种格式的庞大的数据,任意的格式甚至非结构化的处理。Hadoop 只能执行批量处理,并且只以顺序方式访问数据,所以每个搜索必须搜索整个数据集。
2 HBase安装
(1)安装准备
jdk;hadoop;zookeeper
(2)安装节点
HBase是主从结构的。主:Hmaster,从:Hregionserver此处以3个节点为例
bigdata01 | bigdata02 | bigdata03 |
Hmaster | Hmaster | |
Hregionserver | Hregionserver | Hregionserver |
(3)版本选择
HBase版本选择不合适会和jdk或hadoop产生冲突,所以一定要慎重选择版本,此处以1.2.6为例
官网地址http://hbase.apache.org/book.html#basic.prerequisites
(4)开始安装
①上传安装包
②解压 tar -zxf hbase-1.2.6-bin.tar.gz -C /home/refuel/opt/module/
③修改环境变量 vim /home/refuel/.bash_profile
添加
export HBASE_HOME=/home/refuel/opt/module/hbase-1.2.6 PATH=$PATH:$HBASE_HOME/bin |
使配置文件生效:source /home/refuel/.bash_profile
④修改配置文件
vim hbase-env.sh
1修改jdk 2不使用内置的zookeeper |
vim hbase-site.xml
<property> <!-- 指定 hbase 在 HDFS 上存储的路径,高可用使用组名hdfs 的 nameservice --> <name>hbase.rootdir</name> <value>hdfs://bigdatagroup/user/hbase</value> </property> <property> <!-- 指定 hbase 是分布式的 --> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <!-- 指定 zk 的地址,多个用“,”分割 --> <name>hbase.zookeeper.quorum</name> <value>bigdata01:2181,bigdata02:2181,bigdata03:2181</value> </property> |
vim regionservers
添加从节点 |
vim backup-masters
创建一个配置文件,指定备份的master节点的位置(可以有多个) |
⑤将hadoop的hdfs-site.xml和core-sit.xml拷贝到conf目录下
cp /home/refuel/opt/module/hadoop-2.7.7/etc/hadoop/hdfs-site.xml /home/refuel/opt/module/hadoop-2.7.7/etc/hadoop/core-site.xml /home/refuel/opt/module/hbase-1.2.6/conf/ |
⑥将安装包远程拷贝到另外两台机器
scp -r /home/refuel/opt/module/hbase-1.2.6/ bigdata02:/home/refuel/opt/module/ scp -r /home/refuel/opt/module/hbase-1.2.6/ bigdata03:/home/refuel/opt/module/ |
⑦修改其他节点的环境变量
⑧启动start-hbase:注意在哪个节点启动,就会在哪一个节点启动hmaster,这个hmaster是active的,backup-masters配置的是standby的master
3 HBase设计思想
随机(近)实时查询,采用跳表结构,创建多层索引的,存储时按布隆过滤器(数组下标),不过hbase最大只到二层索引,最上层索引无论多大都不会切分的。
hbase对zk的依赖性极强,允许master宕机,但是zk不允许宕机。体现在下面两点:
(1)选主机制
(2)寻址机制(址:最上层索引表存储位置),所以如果zk宕机整个集群数据无法访问到
4 HBase特点
(1)HBase中数据库的特点
①仅能通过主键(rowkey)和主键的 range 来检索数据;
②不能支持join;
③不支持复杂的事务,只支持行级事务;
④底层所有数据的存储都是字节数组 byte[] ;
⑤主要用来存储结构化和半结构化的松散数据。
(2)HBase中表的特点
①大:一个表可以有上十亿行,上百万列
②面向列:严格意义上来说面向“列族|列簇”
③稀疏:hbase中null(空)不进行存储的
④无模式
数据库中的两种模式:读模式和写模式
读模式:数据读取的时候,进行数据校验的。如:hive,加载数据写入到hive的时候不会检验,如插入的数据5个 字段,表中只有3个字段是没问题的。读数据的时候会校验,只读取前3个字段。
写模式:数据写入的时候进行数据校验的,如mysql,在写入时就进行校验,校验不通过不让写入
5 HBase结构
(1)column family(列族|列簇):唯一的表结构部分,建表的时候只要指定列族就可,一个或多个列。
hbase中一个列族会存储一个物理文件,面向列簇存储。列族的设计依据:通常情况下将具有相同io属性(经常一起查询的字段)的列放在同一个列族下。
io属性与业务相关,列族不建议过多,最多不超过3个(不同的列族需要跨文件访问)
(2)rowkey(行键):表数据的一部分。
一行的标识,不同行的行键是不同的,相同行键的数据是属于同一行的hbase中表索引的时候默认会按照字典顺序进行升序排序,便于创建索引。
(3)colunn(列):表数据的一部。
每一行的列名和对应的值,在插入数据的时候指定的。每一个列都属于一个列族的,定位一个列,首先要指定列族
(4)version:数据版本|时间戳。
每一个列存储的数据,可以存储多个版本的,存储的每一个列数据的时候,默认添加一个时间戳信息,这个时间戳信息就是数据版本,默认每一列只存储一个版本的,最新版本。
(5)cell:单元格。
hbase表中,每一列的每一个值存储在一个单元格中的
定位一个单元格顺序:指定行键---》列族---》列----》时间戳
6 HBase的shell命令行操作
启动hbase的客户端命令:hbase shell
help 查看帮助文档 help command 查询某一个命令的详细使用
COMMAND GROUPS:
Group name: ddl
Group name: namespace
Group name: dml
Group name: tools Group name: replication Group name: snapshots Group name: configuration Group name: quotas Group name: security Group name: procedures Group name: visibility labels SHELL USAGE: {'key1' => 'value1', 'key2' => 'value2', ...} and are opened and closed with curley-braces. Key/values are delimited by the If you are using binary keys or values and need to enter them in the shell, use hbase> get 't1', "key\x03\x3f\xcd" The HBase shell is the (J)Ruby IRB with the above HBase-specific commands added. |