Hbase之认识、搭建集群

1.What Hbase

结论

​ 1.分布式列式数据库
​ 2.基于键值对的数据库
​ 3.基于四维表格的数据库
​ 4.NoSql的数据库
​ 5.对非结构化和结构化数据友好的数据库
​ 6.BigTable 十亿行*百万列 表被分割成不同的Region

由来

​ Hadoop database > Hadoop的数据库
​ 1.数据库-------存储数据
​ 2.HDFS分布式文件系统存储数据与Hbase存储数据的有什么区别?
​ 1.文件系统读取数据是顺序读写的,效率比较低。
​ 2.数据库支持随机实时读写操作,提高检索效率。
​ 3.Hbase采用列式数据库与关系型数据库有什么区别?
​ 列式数据库==NoSql数据库
​ 1.非关系型数据库
​ 2.不需要遵守约束
​ 3.不需要遵守范式规范
​ 4.不支持行间事务
​ 4.为什么Hbase要设计为列式数据库呢?
​ 1.在海量数据中,只有极少数数据是有结构化的数据,绝大部分数据仍然是非结构化数据。关系型数据只能存储结构化数据。但是列式数据库对于非结构化和结构化数据非常友好,存储非结构化数据也比较简单。
​ 2.数据量非常大,普通关系型数据库没有办法存储。
​ 因此在存储海量数据时设计的是列式数据库Hbase。
​ 5.Hbase表存储结构
​ 基于键值对的数据库,可以看成是Map<RowKey,Map<ColumnFamilly,Map<Quailer,Map<Versions,Value>>>>

2.Hbase使用

1.Hbase部署模式

​ 1.解压

​ 2.创建软连接

​ 3.配置环境变量

​ 4.分别修改两个配置文件

​ 1.hbase-env.sh

export JAVA_HOME=/opt/jdk
#单机模式 
#export HBASE_MANAGES_ZK=true
#分布式模式
export HBASE_MANAGES_ZK=false
#指定存储日志文件的目录
export HBASE_LOG_DIR=/opt/bigdata/data/hbase/logs
#指定PID的目录
export HBASE_PID_DIR=/opt/bigdata/data/hbase/pids

​ 2.hbase-site.xml

<configuration>
	 <property>
    <!--hbase数据目录(存放映射文件,hbase表与HDFS块之间的映射关系,HDFS/file:///)-->
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/data/hbase/hbase_data</value>
  </property>
   <property>
    <!--设置为true,则为分布式存储-->
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <!--指定zk集群的地址-->
  <property>
     <name>hbase.zookeeper.quorum</name>
     <value>Master1:2181,Master2:2181,Master3:2181</value>
	</property>
  <property>
    <!--指定zk数据目录-->
    <name>hbase.zookeeper.property.dataDir</name>
    <value>hdfs://localhost:9000/data/hbase/zookeeper</value>
  </property>
  <property>
    <!--安全模式,分布式情况下, 一定设置为false-->
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
  </property>
</configuration>

1.单机模式

​ 启动hbase服务器
start-hbase.sh
​ 启动hbase服务器之后只会有一个HMaster进程

2.伪分布式模式

​ 启动hbase服务器之后最少会有三个进程,分别为
​ HRegionServer
​ HMaster
​ HQuorumPeer或QuorumPeerMain

3.集群模式

​ 将从节点的主机名写到该文件中regionservers 。

​ 启动hbase服务器之后最少会有一个HMaster进程和多个HRegionServer进程和HQuorumPeer或者是QuorumPeerMain进程。

​ 可以访问http://hbase集群主节点IP地址:16010查看Hbase集群。

2.集群架构组成

1、协调服务组件Zookeeper

Zookeeper的作用如下:
1. 保证任何时候,集群中只有一个HMaster;
2. 存储所有的HRegion的寻址入口;
3. 实时监控HRegionServer的上线和下线信息,并实时通知给HMaster;
4. 存储HBase的schema和table元数据;
5. Zookeeper Quorum存储-ROOT-表地址、HMaster地址。

2、主节点HMaster

HMaster的主要功能如下:

1. HMaster没有单节点问题,HBase中可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master在运行,主要负责Table和Region的管理工作。
2. 管理用户对表的增删改查操作;DML
3. 管理HRegionServer的负载均衡,调整Region分布(在命令行里面有一个tools,tools这个分组命令其实全部都是Master做的事情);
4. Region Split后,负责新Region的分布;
5. 在HRegionServer停机后,负责失效HRegionServer上Region迁移工作。

3、Region节点HRegionServer

HRegionServer的功能如下:

1. 维护HRegion,处理HRegion的IO请求,向HDFS文件系统中读写数据;
2. 负责切分运行过程中变得过大的HRegion;
3. Client访问HBase上数据的过程并不需要Master参与(寻址访问zookeeper和HRegionServer,
数据读写访问HRegionServer)	

在这里插入图片描述

​ 可视化数据结构算法演示网站https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

​ Store(存储数据的方式是用了一种LSM 树的结构!LSM树是由B+树改进。
​ B+树这样的数据结构在内存中效率是很高的,但是 Hbase中数据是存储在文件中的,如果按照这样的结构来存储,意味着我们每一次插入数据都要由一级索引找到文件再在文件中间作操作来保证数据的有序性,这无疑是效率低下的。

​ 所以Hbase采用的是LSM树的结构,这种结构的关键是,每一次的插入操作都会先进入MemStore(内存缓冲区),当MemStore达到上限的时候,Hbase会将内存中的数据输出为有序的StoreFile文件数据(根据Rowkey、版本、列名排序,这里已经和列 簇无关了因为Store里都属于同一个列簇)。
​ 这样会在Store中形成很多个小的StoreFile,当这些小的File数量达到一个阀值的时 候,Hbase会用一个线程来把这些小File合并成一个大的File。
​ 这样,Hbase就把效率低下的文件中的插入、移动操作转变成了单纯的文件输出、 合并操作。

​ 由上可知,在Hbase底层的Store数据结构中,每个StoreFile内的数据是有序的,但是StoreFile之间不一定是有序的,Store只需要管理StoreFile的索引就可以了。
​ 这里也可以看出为什么指定版本和Rowkey可以加强查询的效率,因为指定版本和Rowkey的查询可以利用 StoreFile的索引跳过一些肯定不包含目标数据的数据。

4.Zookeeper协调服务
1.存储HMaster和HRegionServer的寻址信息
2.实现HMaster的高可用
3.监控HRegionServer的上下线,并通知给HMaster,以便进行Region的分布和迁移。
4.负载均衡Region的分布
5.Client
1.所有的请求都是发送给Zookeeper服务器的,根据请求寻找到HMaster或者是对应的HRegionServer信息,向HMaster或者是HRegionServer所在服务器发送真实请求。
2.DDL操作请求是是交由HMaster处理的。
3.DML操作请求是交由HRegionServer处理的。

3.基本命令 hbase shell

​ 在终端输入hbase shell命令进入hbase命令行。

hbase shell

在这里插入图片描述

1.输入help命令,查看帮助文档

hbase(main):000:0> help
hbase(main):000:0> help '分组名称'

练习:
help 'ddl'
help 'dml'
help 'namespace'

2.输入list命令,查看表列表

hbase(main):000:0> list

#案例:
#查看有哪些命名空间
list_namespace

#hbase:用来存放系统相关的一些元数据等,相当于mysql中的mysql数据库:
#查看namespace hbase下都有哪些表:
list_namespace_tables "hbase"

#hbase:namespace 命名空间,逻辑抽象分组,类似于关系型数据库里面的database。
#hbase:meta META表,存储自定义表的Region分布。

#新建一个命名空间test1 
create_namespace "test1"
#新建一个命名空间test2 
create_namespace "test2", {"author"=>"CC11001100", "create_time"=>"2018-11-4 17:51:53"}
#查看命名空间test2的详细信息
describe_namespace "test2""
#添加或修改属性:
alter_namespace 'test2', {METHOD => 'set', 'create_time' => '2020-10-19'}
#删除属性:
alter_namespace 'test2', {METHOD => 'unset', NAME=>'create_time'}
#注意要删除的namespace必须是空的,其下没有表,否则会删除失败:
drop_namespace "test1"

3.创建表

create ‘namespace:table’, {NAME => ‘’, VERSIONS => }, {NAME => ‘’, VERSIONS => }

​ namespace:命名空间

​ table:表名

​ familyN:列族名

​ VERSIONS:版本(数字),该列族记录的历史值的个数

4.查看表的描述信息

​ hbase(main):000:0> describe ‘命名空间:表名’

​ hbase(main):000:0> desc ‘命名空间:表名’

5.删表

​ disable ‘命名空间:表名’(禁用该表,未删除)

​ drop ‘命名空间:表名’ (必须先禁用)

6.修改表

​ alter ‘命名空间:表名’,{NAME => ‘infos2’}

#案例:
#新建表
create 'test2:emp',{NAME => 'infos', VERSIONS => 2}
#查看表的描述信息
desc 'test2:emp'

#修改表
alter 'test2:emp',{NAME => 'infos',VERSIONS=>3}
#这里要注意,修改已存有数据的列族属性时,HBase 需要对列族里所有的数据进行修改,如果数据量很大,则修改可能要占很长时间。

#增加列族
#如果需要在 emp 表中新增一个列族department,以下两条命令均可完成:
alter 'test2:emp', {NAME=>'department',VERSIONS=>1}
alter 'test2:emp', 'department'

#删除列族
#如果要移除或者删除已有的列族,以下两条命令均可完成:
alter 'test2:emp', { NAME => 'department', METHOD => 'delete' }
alter 'test2:emp', 'delete' => 'department'
#另外,HBase 表至少要包含一个列族,因此当表中只有一个列族时,无法将其删除。

#删除表
drop 'test2:emp'
disable 'test2:emp'

7.写数据

#格式:
put 'namespace:table','<rowkey>','<family:column>','<value>'

#案例:
#写数据
put 'test2:emp','1','infos:name','张无忌'
put 'test2:emp','1','infos:age','23'
put 'test2:emp','1','department:name','倚天屠龙记'

8.读数据

#格式:
get 'namespace:table','rowkey','[<family:column>,….]'

#案例:
#读数据 默认只读取最新一次的数据 如果有中文数据,存储为byte字节
get 'test2:emp','1'
get 'test2:emp','1', 'infos:age'
#如果想要读取历史数据,请使用VERSIONS
put 'test2:emp','1','infos:age','24'
get 'test2:emp','1',{VERSIONS => 3}

9.查询全表数据

#格式:
scan 'namespace:table', {COLUMNS => ['family:column1','family:column2',...], LIMIT => num}
#案例:
scan 'test2:emp'
scan 'test2:emp',{COLUMNS=>'infos'}
scan 'test2:emp',{COLUMNS=>['infos','department']}
scan 'test2:emp',{LIMIT=>5}
scan 'test2:emp',{RAW => true, VERSIONS => 10}
  • RAW——指示查询返回所有单元格(包括删除标记和未收集的已删除单元格)。此选项不能与请求特定列结合使用。默认禁用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值