HBase集群安装及使用

简介:

CentOS7上安装Zookeeper+Hadoop3+Tez+Hive+Spark+Jupyter+Oozie

安装环境及版本:

虚拟机:VirtualBox6.0
操作系统:CentOS-7-x86_64-Everything-1804.iso
Zookeeper:zookeeper-3.4.10.tar.gz
Hadoop3:hadoop-3.1.2.tar.gz
Maven:apache-maven-3.6.0-bin.tar.gz
Tez:apache-tez-0.9.0-src.tar.gz
MySQL:mysql-5.7.18
Hive:apache-hive-3.1.1-bin.tar.gz
Spark:spark-2.4.0-bin-hadoop3.1.2.tgz
Anaconda3:Anaconda3-2018.12-Linux-x86_64.sh
Toree:toree-0.3.0.tar.gz
findspark:findspark-1.3.0-py2.py3-none-any.whl
Scala:scala-2.11.12.tgz
Oozie:oozie-5.0.0-distro.tar.gz、oozie-sharelib-5.0.0.tar.gz

目录:

1.1	介绍
    1.1.1	特点
    1.1.2	和HDFS关系
    1.1.3	存储机制
    1.1.4	和RDBMS关系
    1.1.5	HBase结构体系
1.2	HBase环境安装
    1.2.1	下载文件
    1.2.2	安装系统
    1.2.3	配置文件
    1.2.4	安装app-12
    1.2.5	安装app-13
    1.2.6	环境变量
    1.2.7	启停
1.3	操作
1.4	修改自动启停脚本

前提:由于HBase是建立在Hadoop集群上,搭建集群请参考《Spark平台(高级版)》前六章搭建集群环境。

一、HBase集群

1.1 介绍

HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。还是一个高可靠性、高性能、面向列、可伸缩的建立在Hadoop文件系统之上的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群,可以提供快速随机访问海量结构化数据,还利用了Hadoop的文件系统(HDFS)提供的容错能力。

1.1.1 特点

1.1.1.1 容量大

HBase单表可以有百亿级别的行和百万级别的列,而且数据矩阵横向和纵向两个指标所支持的数量级都非常具有弹性。在传统关系型数据库中,一般单表很少超过500万,超过的话,一般会做分表分库等操作,列也一样,一般很少超过30列,超过的话,就得考虑数据库本身的设计问题了。

1.1.1.2 面向列

HBase是面向列的存储和权限控制,并支持独立检索。面向列存储,其数据在表中是按照某列存储的,这样在查询时只需要少数几个字段的时候,能大大减少读取的数据量。

简单的说就是,说句在写入前,不需要设定数据有哪些列,这些列是可以动态增加的,可以根据数据的写入动态增加,具体有多少列,真是根据每一行数据来确定的。和传统关系型数据库表中行的数据量是可以动态增加一样,但是列需要提前定义好,才能在添加数据。

面向列,还可以对HBase表中每一行的列做数据操作,包括权限控制以及独立查询,独立数据操作等。

1.1.1.3 多版本

HBase每一列的数据存储可以有多个版本。

1.1.1.4 稀疏性

HBase为空的列并不占用存储空间,表的设计可以非常稀疏。因为在写入数据前,不需要设定由多少列,列数是根据数据的实际情况定的,有几列就占用几列。

传统关系型数据库中,如果某行的某列没有数据的话,需要填充0、NULL等数据,依旧会占用磁盘空间。

1.1.1.5 扩展性

HBase是基于HDFS之上的,也就是说HBase底层依赖于HDFS。当磁盘空间不足时,利用HDFS的特性,可以动态增加DataNode节点服务器来达到扩展磁盘空间的目的,无需启动和关闭集群。

1.1.2 和HDFS关系

HBase中的所有数据文件都存储在Hadoop HDFS文件系统上。

HDFSHDFS
HDFS是适于存储大容量文件的分布式文件系统HBase是建立在HDFS之上的数据库
HDFS不支持快速单独记录查找HBase提供在较大的表快速查找
它提供了高延迟批量处理,没有批处理概念它提供了数十亿条记录低延迟访问单个行记录(随机存取)
它提供的数据只能顺序访问HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找

1.1.3 存储机制

HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:

  • 表是行的集合;每一行有一个“行键rowkey”,而行键在表中不能重复
  • 行是列族的集合;如Personal data为列族,不同列族的数据会存储在不同文件中
  • 列族是列的集合;如name为列
  • 列是键值对的集合;每一对kv数据称作一个cell
  • 对插入的数据按顺序存储,首先会按行键排序,同一行里面的kv会按列族排序,再按k排序
Row keyPersonal dataProfessional data
empidnamecitydesignationsalary
1abBeijingManager10000
2acTianjinEngineer20000
3adshagnhaiengineer30000

1.1.4 和RDBMS关系

HBaseRDBMS
HBase无模式,它不具有固定列模式的概念;仅定义列族RDBMS有它的模式,描述表的整体结构的约束
它专门创建为宽表。 HBase是横向扩展这些都是细而专为小表。很难形成规模
没有任何事务存在于HBasRDBMS是事务性的
它反规范化的数据它具有规范化的数据
它用于半结构以及结构化数据是非常好的用于结构化数据非常好

1.1.5 HBase结构体系

HBase有两个主要进程服务,一个是Master,一个是RegionServer。

HBase还依赖与两个外部服务,一个是ZooKeeper,做分布式协调框架;一个是HDFS,HBase的数据是基于HDFS存储。

RegionServer管理HBase表数据,需要实时向Master汇报状态信息、管理哪些Region。

Master则知道整个全局集群运行情况,当某个RegionServer异常后,可以将该RegionServer所管理的Rgeion数据切换到其他RegionServer上。

RegionServer汇报给Master同时,也会信息实时写到ZK节点服务器上,ZK能获取和Master一样的信息。

1.2 HBase环境安装

HBASE是一个分布式系统,一个管理角色 HMaster和多个数据节点角色HRegionServer。本次安装角色分配如下:

app-11:  hmaster(active)  regionserver 
app-12:  hamster(backup)  regionserver
app-13:  regionserver

1.2.1 下载文件

进入HBase下载页面:

https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/

选择stable release版本

选中hbase-1.4.10-bin.tar.gz,并点击下载

1.2.2 安装系统

使用ssh连接到app-11节点,切换到hadoop用户,进入/hadoop目录

新建HBase目录:mkdir HBase

上传安装文件到/Hadoop/HBase目录

解压缩:tar -xf hbase-1.4.10-bin.tar.gz

1.2.3 配置文件

1.2.3.1 Hdfs-site.xml和core-site.xml

因为HBase依赖Hadoop,把Hadoop中的hdfs-site.xml和core-site.xml放到hbase的conf目录中/hadoop/HBase/hbase-1.4.10/conf,这两个配置文件里记录着Hadoop的NameNode地址。

1.2.3.2 hbase-env.sh

编辑:vi hbase-env.sh

配置JDK

export JAVA_HOME=/hadoop/JDK/jdk1.8.0_131

不使用hbase自带的zookeeper,使用已经安装好的

export HBASE_MANAGES_ZK=false

1.2.3.3 hbase-site.xml

编辑:vi hbase-site.xml

配置路径和zookeeper

<configuration>
        <!-- 指定hbase在HDFS上存储的路径 -->
        <property>
                <name>hbase.rootdir</name>
                <value>hdfs://dmcluster/hbase</value>
        </property>
        <!-- 指定hbase是分布式的 -->
        <property>
                <name>hbase.cluster.distributed</name>
                <value>true</value>
        </property>
        <!-- 指定zk的地址,多个用“,”分割 -
        <property>
                <name>hbase.zookeeper.quorum</name>
                <value>app-11:2181,app-12:2181,app-13:2181</value>
        </property>
</configuration>
1.2.3.4 regionservers

配置数据节点角色HRegionServer:vi regionservers

app-11		
app-12
app-13
1.2.3.5 backup-masters

配置管理角色HMaster的备份节点:vi backup-masters

app-12

由于该文件本身不存在,vi会自动新建该文件

1.2.4 安装app-12

用ssh连接到app-12节点,切换到hadoop用户,进入/hadoop目录

新建HBase目录:mkdir HBase

拷贝安装文件:

scp -r /hadoop/HBase/* hadoop@app-12:/hadoop/HBase/

在app-11节点上操作

确认拷贝完成

1.2.5 安装app-13

用ssh连接到app-13节点,切换到hadoop用户,进入/hadoop目录

新建HBase目录:mkdir HBase

拷贝安装文件:

scp -r /hadoop/HBase/* hadoop@app-13:/hadoop/HBase/

在app-11节点上操作

确认拷贝完成

1.2.6 环境变量

配置环境变量:vi ~/.bashrc

export JAVA_HOME=/hadoop/JDK/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export PROTOBUF_HOME=/hadoop/tools/protobuf-2.5.0
export PATH=${PROTOBUF_HOME}/bin:$PATH
export ZOOKEEPER_HOME=/hadoop/ZooKeeper/zookeeper-3.4.10
export PATH=${ZOOKEEPER_HOME}/bin:$PATH
export HADOOP_HOME=/hadoop/Hadoop/hadoop-3.1.2
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${HADOOP_HOME}/lib:$PATH
export MVN_HOME=/hadoop/tools/apache-maven-3.6.0
export PATH=$PATH:${MVN_HOME}/bin
export HIVE_HOME=/hadoop/Hive/apache-hive-3.1.1-bin
export PATH=${HIVE_HOME}/bin:$PATH
export SCALA_HOME=/hadoop/Scala/scala-2.11.12
export PATH=${SCALA_HOME}/bin:$PATH
export SPARK_HOME=/hadoop/Spark/spark-2.4.0-bin-hadoop3.1.2
export PATH=${SPARK_HOME}/bin:$PATH
export ANACONDA_HOME=/hadoop/Anaconda/Anaconda3-2018.12-Linux-x86_64
export PATH=${ANACONDA_HOME}/bin:$PATH
export OOZIE_HOME=/hadoop/Oozie/oozie-5.0.0
export OOZIE_CONFIG=$OOZIE_HOME/conf
export PATH=$PATH:${OOZIE_HOME}/bin
export HBASE_HOME=/hadoop/HBase/hbase-1.4.10
export PATH=$PATH:${HBASE_HOME}/bin

拷贝环境变量:scp ~/.bashrc app-12:/home/hadoop/

在app-11节点上操作

拷贝环境变量:scp ~/.bashrc app-13:/home/hadoop/

在app-11节点上操作

环境变量生效:source ~/.bashrc

1.2.7 启停

1.2.7.1 config.conf

由于HBase基于Hadoop和Zookeeper,所以启动HBasez之前需要先启动Hadoop和Zookeeper,

为了减少资源消耗,此处只启动Hadoop和Zookeeper

export EXPECT2TCL_IS_INSTALL=True
export CONFIGHOSTS_IS_INSTALL=True
export CREATEHADOOPUSER_IS_INSTALL=True
export JDK_IS_INSTALL=True
export PROTOBUF_IS_INSTALL=True
export PACKAGES_IS_INSTALL=True
export SETUPHADOOPSSHENV_IS_INSTALL=True
export ZOOKEEPER_IS_INSTALL=True
export HADOOP_IS_INSTALL=True
#export TEZ_IS_INSTALL=True
#export MYSQL_IS_INSTALL=True
#export HIVE_IS_INSTALL=True
#export SCALA_IS_INSTALL=True
#export SPARK_IS_INSTALL=True
#export ANACONDA_IS_INSTALL=True
#export JUPYTER_IS_INSTALL=True
#export TOREE_IS_INSTALL=True
#export OOZIE_IS_INSTALL=True
1.2.7.2 启动Hadoop集群

启动:./startAll.sh

确认是否启动成功:jps

1.2.7.3 启动HBase

进入/hadoop/HBase/hbase-1.4.10/bin目录,执行:./start-hbase.sh

检查节点启动情况:jps

Web页面查看: http://app-11:16010

可以看出有三个Regin Servers和一个备份HMaster节点。

1.2.7.4 关闭HBase

停止HBase:./stop-hbase.sh

确认:jps

可以看出HMaster和HRegionServer进程都已经关闭。

1.2.7.5 关闭集群

在/hadoop目录:./stopAll.sh

1.3 操作

用ssh连接到app-11节点,切换到hadoop用户,启动集群

启动命令行客户端:./hbase shell

1.3.1 基本操作

查看集群状态:status

一个master active,一个master backup,三个regionserver

查看集群版本:version

1.3.2 表操作

建表:create ‘表名’, ‘列族名1′,’列族名2′,’列族名N’

列在设计的时候不需要指定列,只需要指定列族即可。

create 't_user_info','base','extra'

其中’t_user_info’为表名,’base’和’extra’为列族。

查看有哪些表:list

是否启用:is_enabled ‘表名’

is_enabled 't_user_info'

插入数据:put  ‘表名’, ‘rowKey’, ‘列族 : 列‘  ,  ‘值’

put 't_user_info','001','base:username','name001'
put 't_user_info','001','base:age','18'
put 't_user_info','001','base:sex','male'
put 't_user_info','001','extra:career','it'
put 't_user_info','002','extra:career','actoress'
put 't_user_info','002','base:username','liuyifei'
put 't_user_info','002','base:sex','female'

查询记录数:count  ‘表名’

count 't_user_info'

查询所有记录:scan “表名”  

scan 't_user_info'

清空表:truncate ‘表名’

在重新插入数据,接着试验。

查询单条记录:get  ‘表名’ , ‘rowKey’

get 't_user_info','001'

删除一个kv数据:delete  ‘表名’ ,‘行名’ , ‘列族:列’

delete 't_user_info','001','base:sex'

删除整行数据:deleteall ‘表名’,’rowkey’

deleteall 't_user_info','001'

删除整个表:

先要禁用该表:disable ‘表名’

才能删除该表:drop ‘表名’

1.3.3 Namespace操作

创建namespace:create_namespace ‘ns’

查看namespace:list_namespace

删除namespace:drop_namespace ‘ns’

重新创建namespace,接着试验

创建表,指定namespace:create ‘ns:t_user_info’,’base’,’extra’

后续操作和表操作一样,但是表名处需要加上namespace

1.3.4 HDFS

HBase数据都存储在HDFS中,创建表的位置和HDFS关系

未指定namespce的表存于/hbase/data/default中;

指定namespace的表存于/hbase/data/namespace中;

hdfs dfs -ls -R /hbase/data/default
hdfs dfs -ls -R /hbase/data/ns

1.3.5 Web页面

ttp://app-11:16010可以查看到新建的namespace,以及新建的表

1.4 修改自动启停脚本

1.4.1 config.conf

在config.conf中添加:export HBASE_IS_INSTALL=True

export EXPECT2TCL_IS_INSTALL=True
export CONFIGHOSTS_IS_INSTALL=True
export CREATEHADOOPUSER_IS_INSTALL=True
export JDK_IS_INSTALL=True
export PROTOBUF_IS_INSTALL=True
export PACKAGES_IS_INSTALL=True
export SETUPHADOOPSSHENV_IS_INSTALL=True
export ZOOKEEPER_IS_INSTALL=True
export HADOOP_IS_INSTALL=True
#export TEZ_IS_INSTALL=True
#export MYSQL_IS_INSTALL=True
#export HIVE_IS_INSTALL=True
#export SCALA_IS_INSTALL=True
#export SPARK_IS_INSTALL=True
#export ANACONDA_IS_INSTALL=True
#export JUPYTER_IS_INSTALL=True
#export TOREE_IS_INSTALL=True
#export OOZIE_IS_INSTALL=True
export HBASE_IS_INSTALL=True

1.4.2 startAll.sh

在startAll.sh中添加:

#start hbase
if [ "$HBASE_IS_INSTALL" = "True" ]; then
	cd cd /hadoop/HBase/hbase-1.4.10/bin && ./start-hbase.sh
fi
#!/bin/sh
	export LOCAL_DIR=$(pwd)
	source $LOCAL_DIR/config.conf
	
	if [ "hadoop" != `whoami` ]; then echo "run in hadoop user" && exit ; fi
	#start zookeeper
	if [ "$ZOOKEEPER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./startZookeeper.sh
	fi
	#start hadoop
	if [ "$HADOOP_IS_INSTALL" = "True" ]; then
		cd /hadoop/Hadoop/hadoop-3.1.2/sbin && ./start-all.sh
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSHNOTroot.exp hadoop Yhf_1018 app-12 "mapred --daemon start historyserver"
	fi
	#start mysql
	if [ "$MYSQL_IS_INSTALL" = "True" ]; then
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSH.exp root Yhf_1018 app-12 "systemctl start mysqld.service"
	fi
	#start hive
	if [ "$HIVE_IS_INSTALL" = "True" ]; then
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSHNOTroot.exp hadoop Yhf_1018 app-12 "cd /hadoop/Hive/apache-hive-3.1.1-bin/bin && nohup ./hive --service metastore > /hadoop/Hive/apache-hive-3.1.1-bin/log/metastore.log 2>&1 &"
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSHNOTroot.exp hadoop Yhf_1018 app-12 "cd /hadoop/Hive/apache-hive-3.1.1-bin/bin && nohup ./hive --service hiveserver2 > /hadoop/Hive/apache-hive-3.1.1-bin/log/hiveserver2.log 2>&1 &"
	fi
	#start spark
	if [ "$SPARK_IS_INSTALL" = "True" ]; then
		ssh app-11 "cd /hadoop/Spark/spark-2.4.0-bin-hadoop3.1.2/sbin && ./start-all.sh"
	fi
	#start oozie
	if [ "$OOZIE_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./startOozie.sh
	fi
	#start submarine docker
	if [ "$DOCKER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./startDockerDaemon.sh
	fi
	#start jupyter
	if [ "$JUPYTER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./startJupyter.sh
	fi
	#start hbase
	if [ "$HBASE_IS_INSTALL" = "True" ]; then
		cd /hadoop/HBase/hbase-1.4.10/bin && ./start-hbase.sh
	fi
	echo "startAll cluster finished"

1.4.3 stopAll.sh

在stopAll.sh中添加:

#stop hbase
if [ "$HBASE_IS_INSTALL" = "True" ]; then
	cd cd /hadoop/HBase/hbase-1.4.10/bin && ./stop-hbase.sh
fi
#!/bin/sh
	export LOCAL_DIR=$(pwd)
	source $LOCAL_DIR/config.conf
	
	if [ "hadoop" != `whoami` ]; then echo "run in hadoop user" && exit ; fi	
	#stop hbase
	if [ "$HBASE_IS_INSTALL" = "True" ]; then
		cd /hadoop/HBase/hbase-1.4.10/bin && ./stop-hbase.sh
	fi
	#stop jupyter
	if [ "$JUPYTER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./stopJupyter.sh
	fi
	#stop submarine docker
	if [ "$DOCKER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./stopDockerDaemon.sh
	fi
	#stop oozie
	if [ "$OOZIE_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./stopOozie.sh
	fi
	#stop spark
	if [ "$SPARK_IS_INSTALL" = "True" ]; then
		ssh app-11 "cd /hadoop/Spark/spark-2.4.0-bin-hadoop3.1.2/sbin && ./stop-all.sh"
	fi
	#stop hive
	if [ "$HIVE_IS_INSTALL" = "True" ]; then
		ssh app-12 "pid=\$(ps x|grep hive|awk '{print \$1}') && for i in \$pid; do kill -9 \$i; done"
	fi
	#stop mysql
	if [ "$MYSQL_IS_INSTALL" = "True" ]; then
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSH.exp root Yhf_1018 app-12 "systemctl stop mysqld.service"
	fi
	#stop hadoop
	if [ "$HADOOP_IS_INSTALL" = "True" ]; then
		cd /hadoop/Hadoop/hadoop-3.1.2/sbin && ./stop-all.sh
		/hadoop/tools/expect/bin/expect /hadoop/tools/remoteSSHNOTroot.exp hadoop Yhf_1018 app-12 "mapred --daemon stop historyserver"
	fi
	#stop zookeeper
	if [ "$ZOOKEEPER_IS_INSTALL" = "True" ]; then
		cd /hadoop/tools && ./stopZookeeper.sh
	fi
	
	echo "stopAll cluster finished"

1.4.4 启动

启动集群:./startAll.sh

确认:jps

1.4.5 关闭

关闭集群:./stopAll.sh

确认:jps

发表回复