小言_互联网的博客

六、Hbase的构架,安装和基本使用

357人阅读  评论(0)

@Author : By Runsen
@Date : 2020/6/21

作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件。导致翘课严重,专业排名中下。.在大学60%的时间,都在CSDN。

在一月到四月都没怎么写博客,因为决定写书,结果出书方说大学生就是一个菜鸟,看我确实还是一个菜鸟,就更新到博客算了。

我把第九章更新到博客上。

9.4 Hive和Hbase

9.4.3 Hbase基本构架和安装

(1)Hbase基本构架

Apache Hbase 是基于 Hadoop 构建的一个分布式的、可伸缩的海量数据存储系统。常被用来存放一些海量的(通常在TB级别以上)、结构比较简单的数据,如历史订单记录,日志数据,监控Metrics 数据等等,Hbase 提供了简单的基于 Key 值的快速查询能力。

Hbase与Hive的区别

  • Hbase是建立在Hadoop之上的NoSQL,是非关系型数据库
  • Hbase提供海量数据的随机定位和实时读写,毫秒级别内响应查询请求,Hive的查询并不能在短时间内响应。
    Hbase只提供数据的存储和查询功能,没有数据的处理能力,Hive提供类SQL的方式对数据进行处理,底层转变为MapReduce跑在YARN上。
  • Hive和Hbase是两种基于Hadoop的不同技术,Hive是一种类SQL的引擎,并且运行MapReduce任务,Hbase是一种在Hadoop之上的NoSQL 的Key/Value数据库。

Hbase架构图,如下图9-13所示。

在Hbase中,包括了HMaster、HRegionSever、HRegion、HLog、Store、MemStore、StoreFile、HFile等组件。

  • Hbase底层依赖HDFS,通过DFS Cilent进行HDFS操作。
  • HRegionServer是RegionServer的实现,服务和管理Regions,集群中RegionServer运行在DataNode。
  • HMaster负责把HRegion分配给HRegionServer,每一个HRegionServer可以包含多个HRegion,多个HRegion共享HLog,HLog用来做数据恢复。
  • 每一个HRegion由一个或多个Store组成,一个Store对应表的一个列,每个Store中包含与其对应的MemStore以及一个或多个StoreFile
  • MemStore是在内存中的,保存了修改的数据,MemStore中的数据写到文件中是StoreFile。

(2)安装Hbase

下面我们搭建Hbase分布式环境,为了兼容Hadoop3.2.1版本,我们下载Hbase2.2.3版本,官方下载链接:http://mirror.bit.edu.cn/apache/Hbase/2.2.3/Hbase-2.2.3-bin.tar.gz

[root@node01 ~]# mkdir -p opt/module/Hbase
[root@node01 ~]# cd opt/module/hadoop/Hbase
[root@node01 Hbase~]# wget http://mirror.bit.edu.cn/apache/Hbase/2.2.3/Hbase-2.2.3-bin.tar.gz
[root@node01 Hbase~]# tar -zxvf Hbase-2.2.3-bin.tar.gz
[root@node01 Hbase~]# vim conf/Hbase-env.sh
###########
export JAVA_HOME=/usr/local/java/jdk1.8.0_231
export Hbase_MANAGES_ZK=false
[root@node01 Hbase~]# vim conf/Hbase-site.xml
###########
<configuration>
	<!-- 设置为分布式 -->
	<property>
        <name>Hbase.cluster.distributed</name>
        <value>true</value>
	</property>
	<!-- 指定Hbase数据在hdfs上的存放路径 -->
	<property>
        <name>Hbase.rootdir</name>
        <value>hdfs://node01:9000/Hbase</value>
	</property>
	<!-- 配置zookeeper地址 -->
	<property>
        <name>Hbase.zookeeper.quorum</name>
        <value>node01:2181,node02:2181,node03:2181</value>
	</property>
	<!-- zookeeper的本地目录 -->
	<property>
        <name>Hbase.zookeeper.property.dataDir</name>
        <value>/root/opt/module/zookeeper/apache-zookeeper-3.5.6-bin
    /zkdata</value>
	</property>
	<!-- Hbase的webui端口 -->
    <property>
        <name>Hbase.master.info.port</name>
        <value>16010</value>
	</property>
	<property>
        <name>Hbase.unsafe.stream.capability.enforce</name>
        <value>false</value>
    </property>
</configuration>
[root@node01 Hbase~]# vim conf/regionservers 
###########
node01
node02
node03
[root@node01 Hbase~] vim /etc/profile
###########
export Hbase_HOME=/root/opt/module/Hbase/Hbase-2.2.3
export PATH=$PATH:$Hbase_HOME/bin

[root@node01 Hbase-2.2.3]# source /etc/profile
[root@node01 Hbase-2.2.3]# Hbase version
Hbase 2.2.3
[root@node01 Hbase]# cd ..
[root@node01 module]# scp -rp Hbase/ root@node02:/root/opt/module/Hbase/
[root@node01 module]# scp -rp Hbase/ root@node03:/root/opt/module/Hbase/

[root@node01 module]# scp -rp /etc/profile node02:/etc/profile
[root@node01 module]# scp -rp /etc/profile node03:/etc/profile

[root@node02 module]# source /etc/profile
[root@node03 module]# source /etc/profile

# 启动Hbase前,需要启动Hadoop和zookeeper
[root@node01]# start-hbase.sh
node02: running regionserver, logging to /root/opt/module/hbase/hbase-2.2.3/bin/../logs/hbase-root-regionserver-node02.out
node03: running regionserver, logging to /root/opt/module/hbase/hbase-2.2.3/bin/../logs/hbase-root-regionserver-node03.out
node01: running regionserver, logging to /root/opt/module/hbase/hbase-2.2.3/bin/../logs/hbase-root-regionserver-node01.out
[root@node01]# jps
9888 HMaster
2917 NameNode
4742 QuorumPeerMain
10135 Jps
3210 SecondaryNameNode
10059 HRegionServer
3471 ResourceManager
[root@node02 ~]# jps
5584 DataNode
6565 Jps
6409 HRegionServer
2986 QuorumPeerMain
5710 NodeManager

在启动Hbase,在Master端的node01添加HMaster和HRegionServer进程,在slaves端的node02和node03添加HRegionServer进程。

在浏览器上输入:http://192.168.92.90:16010,查看Hbase的WebUI界面,如下图9-14所示。

[root@node01 ]# hbase shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
hbase(main):001:0> 

如果我们想执行hbase,只需要执行stop-hbase.sh

[root@node01 logs]# stop-hbase.sh 

至此,Hbase搭建成功。

9.4.4 Hbase 基本使用

Hbase 提供了一个非常方便的命令行交互工具 Hbase Shell。

在 Hbase 中,有如下常规命令:status,version和whoami。

# status 命令展示 HBase 集群的系统状态的详细,例如服务器数量:
hbase(main):001:0> status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.2009 seconds  

# version 命令展示当前使用的 HBase 版本
hbase(main):002:0> version
2.2.3, r6a830d87542b766bd3dc4cfdee28655f62de3974, 2020年 01月 10日 星期五 18:27:51 CST
Took 0.0005 seconds                                                  
# 使用 whoami 命令展示当前 HBase 用户
hbase(main):003:0> whoami
root (auth:SIMPLE)
    groups: root
Took 0.0378 seconds  

DDL命令:数据定义语言(Data Definition Language, DDL),包括数据库表的创建、修改、删除等语句。

在 Hbase 中,有如下常用的数据定义命令:Create,Exists,Describe,List,Disable,Enable,Alter和Drop。

# Hbase通过字典方式创建数据表,NAME表示列族
hbase(main):004:0> create 'student', {NAME => 'name'}, {NAME => 'age'}, {NAME => 'sex'}
Created table student
Took 2.6240 seconds                                         
=> Hbase::Table - student

# exists命令判断表是否存在
hbase(main):005:0> exists 'student'
Table student does exist                               
Took 0.1901 seconds                                         
=> true

# 使用describe命令查看表信息,我们可以简写成desc
hbase(main):006:0> desc 'student'
Table student is ENABLED
student                                                     
COLUMN FAMILIES DESCRIPTION         
...
Took 0.2047 seconds  

# list命令查看Hbase中用户自定义的表
hbase(main):007:0> list 'student'
TABLE                                                                                     student                                                                                   1 row(s)
Took 0.0244 seconds                                                                       => ["student"]

# 使用disable命令禁用表:
hbase(main):008:0> disable 'student'
Took 0.8137 seconds     

# 使用enable命令启用表:
hbase(main):009:0> enable 'student'
Took 1.2772 seconds                                                                       

# 使用alter命令对student的表以及列族进行修改,如新增一个列族、修改表属性
# 下面我们使用alter删除sex列名:
hbase(main):010:0> alter 'student', {NAME => 'sex', METHOD => 'delete'}
Updating all regions with the new schema...
1/1 regions updated.
Done.
Took 2.6305 seconds  

# 使用drop命令删除表,但是表必须首先要禁用表
hbase(main):011:0> disable 'student'
Took 1.7241 seconds                                                                      
hbase(main):012:0> drop 'student'
Took 0.4959 seconds 

DML命令:数据操纵语言(Data Manipulation Language, DML),包括数据的修改、查询、删除等语句。

在 Hbase 中,有如下数据操纵命令:Put,Get,Scan,Count,Append,Delete,Deleteall和Truncate

# 我们可以不指定NAME,直接创建student表
hbase(main):013:0>create 'student', 'name', 'info'
Created table student
Took 2.3449 seconds                                                                       
=> Hbase::Table - student

# 可以使用put命令将一行数据插入到student表中:
hbase(main):014:0> put 'student', 'Runsen', 'info:age','20'
Took 0.0249 seconds   
hbase(main):015:0> put 'student', 'Runsen', 'info:sex','男'
Took 0.0088 seconds  
hbase(main):016:0> put 'student', 'Zhangsan', 'info:sex','男'
Took 0.0257 seconds  
hbase(main):017:0> put 'student', 'Zhangsan', 'info:age','21'
Took 0.0097 seconds                                                                        hbase(main):018:0> put 'student', 'Lisi', 'info:sex','女'
Took 0.0271 seconds  
hbase(main):019:0> put 'student', 'Lisi', 'info:age','22'
Took 0.0083 seconds             

# count命令查询表的记录数
hbase(main):020:0> count 'student'
3 row(s)
Took 0.0886 seconds                                                                       => 3

# scan查询表数据
hbase(main):021:0> scan 'student'
ROW                        COLUMN+CELL                                                   
Lisi                      column=info:age, timestamp=1582962835144, value=22             
Lisi                      column=info:sex, timestamp=1582962826580, value=\xE5\xA5\xB3   
Runsen                    column=info:age, timestamp=1582962587196, value=20             
Runsen                    column=info:sex, timestamp=1582962638611, value=\xE7\x94\xB7   
Zhangsan                  column=info:age, timestamp=1582962777034, value=21             
Zhangsan                  column=info:sex, timestamp=1582962770327, value=\xE7\x94\xB7   
3 row(s)
Took 0.0367 seconds   

# 当然也可以增加一些过滤器来指定查询条件。
hbase(main):022:0> scan 'student', {COLUMN => 'info:age'}
ROW                        COLUMN+CELL                                                   
Lisi                      column=info:age, timestamp=1582962835144, value=22             
Runsen                    column=info:age, timestamp=1582962587196, value=20             
Zhangsan                  column=info:age, timestamp=1582962777034, value=21             
3 row(s)
Took 0.0191 seconds 

# 同样也可以使用FILTER对值进行过滤,我们查找等于20的数值的数据
hbase(main):023:0> scan 'student', FILTER=>"ValueFilter(=,'binary:20')"
ROW                        COLUMN+CELL                                                   
Runsen                    column=info:age, timestamp=1582962587196, value=20             
1 row(s)
Took 0.0692 seconds  

# 我们可以模糊查询 比如我们查找模糊查询“R”字符的数据
hbase(main):024:0> scan 'student', {ROWPREFIXFILTER => 'R'}
ROW                        COLUMN+CELL                                                   
Runsen                    column=info:age, timestamp=1582962587196, value=20             
Runsen                    column=info:sex, timestamp=1582962638611, value=\xE7\x94\xB7   
1 row(s)
Took 0.1234 seconds

# 使用get命令获取 HBase 表的一行或者一个单元的内容
hbase(main):025:0> get 'student', 'Runsen'
COLUMN                     CELL                                                           
info:age                  timestamp=1582962587196, value=20                             
info:sex                  timestamp=1582962638611, value=\xE7\x94\xB7                     
1 row(s)
Took 0.0553 seconds    

# 我们同样可以使用增加一些过滤器
hbase(main):026:0> hbase> get 'student', 'Runsen', {COLUMN => 'info:age'}
COLUMN                     CELL                                                           
info:age                  timestamp=1582962587196, value=20                               
1 row(s)
Took 0.0189 seconds   

# append 命令向指定的单元上在原先值上追加新值:
hbase(main):027:0> append 'student', 'Runsen', 'info:address', 'Guangdong'
CURRENT VALUE = Guangdong
Took 0.1637 seconds   

# delete 命令删除某列数据
hbase(main):028:0> delete 'student', 'Runsen', 'info:address'
Took 0.0237 seconds  

# deleteall 命令删除整行数据
hbase(main):029:0> deleteall 'student', 'Runsen'
Took 0.0100 seconds 

# truncate 命令清空整个表的数据:
hbase(main):030:0> truncate  'student'
Truncating 'student' table (it may take a while):
Disabling table...
Truncating table...
Took 4.7608 seconds 

更多的Hive教程,如Java API编程和Python连接Hbase第三方库Happybase,参考官方入门手册https://Hbase.apache.org/book.html和happybase的文档:https://happybase.readthedocs.io/en/latest/


转载:https://blog.csdn.net/weixin_44510615/article/details/106888891
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场