简介:
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文件系统上。
HDFS | HDFS |
HDFS是适于存储大容量文件的分布式文件系统 | HBase是建立在HDFS之上的数据库 |
HDFS不支持快速单独记录查找 | HBase提供在较大的表快速查找 |
它提供了高延迟批量处理,没有批处理概念 | 它提供了数十亿条记录低延迟访问单个行记录(随机存取) |
它提供的数据只能顺序访问 | HBase内部使用哈希表和提供随机接入,并且其存储索引,可将在HDFS文件中的数据进行快速查找 |
1.1.3 存储机制
HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。总之,在一个HBase:
- 表是行的集合;每一行有一个“行键rowkey”,而行键在表中不能重复
- 行是列族的集合;如Personal data为列族,不同列族的数据会存储在不同文件中
- 列族是列的集合;如name为列
- 列是键值对的集合;每一对kv数据称作一个cell
- 对插入的数据按顺序存储,首先会按行键排序,同一行里面的kv会按列族排序,再按k排序
Row key | Personal data | Professional data | ||
empid | name | city | designation | salary |
1 | ab | Beijing | Manager | 10000 |
2 | ac | Tianjin | Engineer | 20000 |
3 | ad | shagnhai | engineer | 30000 |
1.1.4 和RDBMS关系
HBase | RDBMS |
HBase无模式,它不具有固定列模式的概念;仅定义列族 | RDBMS有它的模式,描述表的整体结构的约束 |
它专门创建为宽表。 HBase是横向扩展 | 这些都是细而专为小表。很难形成规模 |
没有任何事务存在于HBas | RDBMS是事务性的 |
它反规范化的数据 | 它具有规范化的数据 |
它用于半结构以及结构化数据是非常好的 | 用于结构化数据非常好 |
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