HBase
Zookeeper
是什么
zk是Hadoop生态中的集群协调服务
- 主要应用场景
- 高可用集群的主备切换
- 统一资源配置管理
- 分布式锁
单节点安装和集群搭建
- 下载解压
- 修改配置文件
- 将zoo_sample.cfg重命名为zoo.cfg
# 设置zk保存数据的路径
dataDir=/opt/zookeeper-3.4.14/data
# 设置集群的连接信息
#server.A=B:C:D
#A 每个zk服务 设置一个唯一的id号,整数
#B id对应的主机名或者ip
#C 集群内数据同步通信端口
#D 集群内选举使用的通信端口
server.51=host01:2888:3888
server.52=host02:2888:3888
server.53=host03:2888:3888
-
分发安装包
- 编写自动分发脚本
#!/bin/bash
MYHOSTNAME=`hostname`
HOSTS=`cat /etc/hosts | grep 192.168.30 | awk '{print $2}' | grep -v $MYHOSTNAME`
for HOST in $HOSTS
do
echo "正在将${1}发送到${HOST}的${2}"
scp -rq $1 $HOST:$2
done
- 修改个性化配置
在每台zk服务器的data目录中添加myid文件
创建名为myid的文件,文件中填入当前机器对应的id
- 配置环境变量
echo 'export ZOOKEEPER_HOME=/opt/zookeeper-3.4.14' >> /etc/profile
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
- 启动
zkServer.sh start
zk操作
- 命令行客户端操作
# 启动命令行客户端
zkCli.sh [-server host:port]
# 查看znode结构
# zk中必须使用从/开始的绝对路径访问znode
ls 路径
# 创建znode
# -s创建有序号的znode
# -e创建临时znode
create [-s] [-e] 路径 数据
# 查看数据
get 路径
# 修改数据
set 路径 数据
# 退出
quit
-
图形化界面工具操作
- ZooInspector
-
JavaAPI
核心原理
数据一致性
通过记录ZXID保证数据的一致性
ZXID (逻辑时钟) 在逻辑上像钟表一样始终单调递增的一个值
每次进行zk数据的增删改时,ZXID都会变化
如果出现数据不同步,只需要通过查看ZXID的大小就可以判断数据的先后顺序
zk数据模型
zk选举机制
-
首次启动 半数以上选id最大
集群启动的节点数量超过半数后,id号最大的节点当选为leader,其他节点作为follower -
主从切换 leader宕机后,随机选举一个节点作为新leader
HBase
是什么
-
HBase是hadoop生态中的一个列式存储的数据库
-
传统关系型数据库使用行式存储,没行数据的长度一致,方便数据进行增删改查和复杂查询,但是 如果需要存储多列的稀疏表,行式存储会浪费大量的存储空间
-
列式存储指的是,将数据使用行键和列限定符标识数据,将关系表中稀疏结构中有值的内容按行保存,节省空间并提高查询效率
集群角色
HMaster
- 监控 RegionServer
- 处理 RegionServer 故障转移
- 处理元数据的变更
- 处理region 的分配或移除
- 在空闲时间进行数据的负载均衡
- 通过 Zookeeper 发布自己的位置给客户端
HRegionServer
- 负责管理 HBase 的实际数据
- 处理分配给它的 Region
- 刷新缓存到 HDFS
- 维护Hlog Write-Ahead Log WAL 预写入日志
- 执行压缩
- 负责处理 Region 分片
集群搭建
- 前提:
正常安装并启动HDFS和Zookeeper
- 解压
-
修改配置文件
- hbase-env.sh
# 添加JAVA运行环境
export JAVA_HOME=/opt/jdk1.8
# 关闭HBase自带的zk服务,使用已经搭建好的ZK服务
export HBASE_MANAGES_ZK=false
# 将JDK8以上版本不需要的配置注释掉
# export HBASE_MASTER_OPTS ………
# export HBASE_REGIONSERVER_OPTS…………
- hbase-site.xml
<configuration>
<property>
<!-- hbase保存数据的hdfs根目录 -->
<name>hbase.rootdir</name>
<value>hdfs://host01:8020/hbase</value>
</property>
<property>
<!-- 开启habse的集群模式 -->
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<!-- 设置Hbase连接的zk集群 -->
<name>hbase.zookeeper.quorum</name>
<value>host01:2181,host02:2181,host03:2181</value>
</property>
<property>
<!-- 设置ZK保存数据的路径 -->
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/zookeeper-3.4.14/data</value>
</property>
</configuration>
- regionservers
设置所有需要启动regionserver的机器
host01
host02
host03
-
分发安装包
-
配置环境变量
echo 'export HBASE_HOME=/opt/hbase-1.3.5' >> /etc/profile
echo 'export PATH=$HBASE_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
- 启动服务
start-hbase.sh
# Hbase会默认在执行启动命令的机器上启动HMaster服务
# 其他机器也可以启动HMaster服务,作为高可用的主备节点
- 如果启动执行命令提示master未初始化
可以尝试删除hadoop的data目录 格式化namenode
删除zk的data目录 重启启动zk
HBase的使用
HBase的shell操作
# 开启HBase的命令行客户端
hbase shell
# 查看所有命令的帮助
help
# 查看具体单个命令的帮助
help 命令
直接敲命令
# 查看 命名空间(namespace,类似RDB中database)
list_namespace
# 查看 表
list
# 创建表
create '表名','列族'
# 插入数据
put '表名','行键','列族:列','值'
# 查询单行数据
get '表名','行键','列族:列'
# 扫描多行数据
scan '表名'
scan 't1',{STARTROW=>'12',STOPROW=>'13'}