AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

HBase

Zookeeper

是什么

zk是Hadoop生态中的集群协调服务

  • 主要应用场景
    1. 高可用集群的主备切换
    2. 统一资源配置管理
    3. 分布式锁

单节点安装和集群搭建

  1. 下载解压
  2. 修改配置文件
    • 将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
  1. 分发安装包

    • 编写自动分发脚本
#!/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
  1. 配置环境变量
echo 'export ZOOKEEPER_HOME=/opt/zookeeper-3.4.14' >> /etc/profile
echo 'export PATH=$ZOOKEEPER_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
  1. 启动
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数据模型

file

zk选举机制

  • 首次启动 半数以上选id最大
    集群启动的节点数量超过半数后,id号最大的节点当选为leader,其他节点作为follower

  • 主从切换 leader宕机后,随机选举一个节点作为新leader

HBase

是什么

  • HBase是hadoop生态中的一个列式存储的数据库

  • 传统关系型数据库使用行式存储,没行数据的长度一致,方便数据进行增删改查和复杂查询,但是 如果需要存储多列的稀疏表,行式存储会浪费大量的存储空间

  • 列式存储指的是,将数据使用行键和列限定符标识数据,将关系表中稀疏结构中有值的内容按行保存,节省空间并提高查询效率

file

集群角色

HMaster

  1. 监控 RegionServer
  2. 处理 RegionServer 故障转移
  3. 处理元数据的变更
  4. 处理region 的分配或移除
  5. 在空闲时间进行数据的负载均衡
  6. 通过 Zookeeper 发布自己的位置给客户端

HRegionServer

  1. 负责管理 HBase 的实际数据
  2. 处理分配给它的 Region
  3. 刷新缓存到 HDFS
  4. 维护Hlog Write-Ahead Log WAL 预写入日志
  5. 执行压缩
  6. 负责处理 Region 分片

集群搭建

  • 前提:
    正常安装并启动HDFS和Zookeeper
  1. 解压
  2. 修改配置文件

    • 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
  1. 分发安装包

  2. 配置环境变量

echo 'export HBASE_HOME=/opt/hbase-1.3.5' >> /etc/profile
echo 'export PATH=$HBASE_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
  1. 启动服务
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'}

HBase的JavaApi