Apache Hbase 系列文章
1、hbase-2.1.0介绍及分布式集群部署、HA集群部署、验证、硬件配置推荐
2、hbase-2.1.0 shell基本操作详解
3、HBase的java API基本操作(创建、删除表以及对数据的添加、删除、查询以及多条件查询)
4、HBase使用(namespace、数据分区、rowkey设计、原生api访问hbase)
5、Apache Phoenix(5.0.0-5.1.2) 介绍及部署、使用(基本使用、综合使用、二级索引示例)、数据分区示例
6、Base批量装载——Bulk load(示例一:基本使用示例)
7、Base批量装载-Bulk load(示例二:写千万级数据-mysql数据以ORCFile写入hdfs,然后导入hbase)
8、HBase批量装载-Bulk load(示例三:写千万级数据-mysql数据直接写成Hbase需要的数据,然后导入hbase)
本文主要介绍了hbase的功能、应用场景、分布式部署、HA部署验证以及一般的硬件推荐配置。
本文依赖hadoop、zookeeper内容,相关的内容请查看本作者关于hadoop和zookeeper专栏中的介绍。
本文分为三部分,即hbase介绍、集群部署和HA部署。
一、Hbase介绍
1、介绍
- HBase是BigTable的开源java版本,是建立在HDFS之上,提供高可靠性、高性能、列存储、可伸缩、实时读写NoSQL的数据库系统。
- HBase仅能通过主键(row key)和主键的range来检索数据,仅支持单行事务。
- 主要用来存储结构化和半结构化的松散数据。
- 不支持join等复杂操作,不支持复杂的事务(行级的事务),HBase缺少RDBMS中的许多特性,例如带类型的列、二级索引以及高级查询语言等
- Hbase中支持的数据类型:byte[]
- Hbase目标主要依靠横向扩展,通过不断增加廉价的商用服务器,来增加存储和处理能力
- HBase中的表一般有这样的特点
大:一个表可以有上十亿行,上百万列
面向列:面向列(族)的存储和权限控制,列(族)独立检索
稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏
2、HBase应用场景
- 对象存储
不少的头条类、新闻类的的新闻、网页、图片存储在HBase之中,一些病毒公司的病毒库也是存储在HBase之中 - 时序数据
HBase之上有OpenTSDB模块,可以满足时序类场景的需求 - 推荐画像
用户画像,是一个比较大的稀疏矩阵,蚂蚁金服的风控就是构建在HBase之上 - 时空数据
主要是轨迹、气象网格之类,滴滴打车的轨迹数据主要存在HBase之中,另外在技术所有大一点的数据量的车联网企业,数据都是存在HBase之中 - CubeDB OLAP
Kylin一个cube分析工具,底层的数据就是存储在HBase之中,不少客户自己基于离线计算构建cube存储在hbase之中,满足在线报表查询的需求 - 消息/订单
在电信领域、银行领域,不少的订单查询底层的存储,另外不少通信、消息同步的应用构建在HBase之上 - Feeds流
典型的应用就是xx朋友圈类似的应用,用户可以随时发布新内容,评论、点赞。 - NewSQL
之上有Phoenix的插件,可以满足二级索引、SQL的需求,对接传统数据需要SQL非事务的需求 - 其他
存储爬虫数据
海量数据备份
短网址
3、HBase特点
- 强一致性读/写
HBASE不是“最终一致的”数据存储,它非常适合于诸如高速计数器聚合等任务 - 自动分块
HBase表通过Region分布在集群上,随着数据的增长,区域被自动拆分和重新分布 - 自动RegionServer故障转移
- Hadoop/HDFS集成
HBase支持HDFS开箱即用作为其分布式文件系统 - MapReduce
HBase通过MapReduce支持大规模并行处理,将HBase用作源和接收器 - Java Client API
HBase支持易于使用的 Java API 进行编程访问 - Thrift/REST API
- 块缓存和布隆过滤器
HBase支持块Cache和Bloom过滤器进行大容量查询优化 - 运行管理
HBase为业务洞察和JMX度量提供内置网页。
二、集群部署(Hadoop HA Hbase非HA)
1、上传解压HBase安装包
#使用alanchan用户
#文件上传至/usr/local/bigdata
tar -xvzf hbase-2.1.0.tar.gz -C /usr/local/bigdata
[root@server1 bigdata]# ll
drwxr-xr-x 11 alanchan root 4096 9月 23 16:01 hadoop-3.1.4
drwxr-xr-x 7 root root 4096 9月 28 09:44 hbase-2.1.0
-rw-r--r-- 1 alanchan root 265818867 9月 28 09:42 hbase-2.1.0.tar.gz
2、修改HBase配置文件
1)、hbase-env.sh
cd /usr/local/bigdata/hbase-2.1.0/conf
vim hbase-env.sh
#增加以下配置
export JAVA_HOME=/usr/java/jdk1.8.0_144
export HBASE_MANAGES_ZK=false
2)、hbase-site.xml
vim hbase-site.xml
------------------------------
<configuration>
<!-- HBase数据在HDFS中的存放的路径,Hadoop是非HA环境部署或server1是非standy状态 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://server1:8020/hbase</value>
</property>
<!-- 下面关于hbase.rootdir的配置是基于Hadoop 是HA模式的,
如此配置的时候,还需要将hadoop的core-site.xml和hdfs-site.xml文件拷贝至Hbase的配置文件目录
/usr/local/bigdata/hbase-2.1.0/conf下
-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://HadoopHAcluster/hbase</value>
</property>
<!-- Hbase的运行模式。false是单机模式,true是分布式模式。若为false,Hbase和Zookeeper会运行在同一个JVM里面 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- ZooKeeper的地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>server1:2118,server2:2118,server3:2118</value>
</property>
<!-- ZooKeeper快照的存储位置 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/bigdata/apache-zookeeper-3.7.1/data</value>
</property>
<!-- V2.1版本,在分布式情况下, 设置为false -->
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<!-- 16000与hadoop中的kms端口冲突 否则HMaster服务不能正常启动,报Errors$NativeIoException: bind(..) failed: 地址已在使用异常-->
<property>
<name>hbase.master.port</name>
<value>16100</value>
</property>
</configuration>
3)、配置环境变量
# 配置Hbase环境变量
vim /etc/profile
export HBASE_HOME=/usr/local/bigdata/hbase-2.1.0
export PATH=$PATH:${HBASE_HOME}/bin:${HBASE_HOME}/sbin
#加载环境变量
source /etc/profile
4)、复制jar包到lib
cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/
[root@server1 data]# cd $HBASE_HOME/lib/client-facing-thirdparty
[root@server1 client-facing-thirdparty]# ll
总用量 3552
-rw-rw-r-- 1 1000 1000 20437 7月 6 2018 audience-annotations-0.5.0.jar
-rw-rw-r-- 1 1000 1000 61829 7月 6 2018 commons-logging-1.2.jar
-rw-rw-r-- 1 1000 1000 15322 7月 6 2018 findbugs-annotations-1.3.9-1.jar
-rw-rw-r-- 1 1000 1000 1475955 7月 6 2018 htrace-core-3.1.0-incubating.jar
-rw-rw-r-- 1 1000 1000 1506370 7月 6 2018 htrace-core4-4.2.0-incubating.jar
-rw-rw-r-- 1 1000 1000 489884 7月 6 2018 log4j-1.2.17.jar
-rw-rw-r-- 1 1000 1000 41203 7月 6 2018 slf4j-api-1.7.25.jar
-rw-rw-r-- 1 1000 1000 12244 7月 6 2018 slf4j-log4j12-1.7.25.jar
[root@server1 client-facing-thirdparty]# pwd
/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty
[root@server1 client-facing-thirdparty]# cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/
5)、修改regionservers文件
vim regionservers
server2
server3
server4
6)、分发安装包与配置文件
cd /usr/local/bigdata
scp -r hbase-2.1.0/ server2:$PWD
scp -r hbase-2.1.0/ server3:$PWD
scp -r hbase-2.1.0/ server4:$PWD
#有可能需要root权限
scp -r /etc/profile server2:/etc
scp -r /etc/profile server3:/etc
scp -r /etc/profile server4:/etc
在server2和server3、server4加载环境变量
source /etc/profile
7)、启动HBase
# 启动ZK
./start-zk.sh
# 启动hadoop
start-dfs.sh
# 启动hbase
start-hbase.sh
8)、 验证Hbase是否启动成功
# 启动hbase shell客户端
hbase shell
# 输入status
[alanchan@server1 conf]$ start-hbase.sh
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /usr/local/bigdata/hbase-2.1.0/logs/hbase-alanchan-master-server1.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
server4: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server4.out
server2: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server2.out
server3: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server3.out
[alanchan@server1 conf]$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
Took 0.0025 seconds
hbase(main):001:0> status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.4651 seconds
至此,集群搭建完毕
9)、单独启停服务命令
#单独 启动 或 停止 HMaster、HRegionServer 的进程
hbase-daemon.sh start/stop master/regionserver
3、参考硬件配置
针对大概800TB存储空间的集群中每个Java进程的典型内存配置:
推荐:
- Master机器要运行NameNode、ResourceManager、以及HBase HMaster,推荐24GB左右
- Slave机器需要运行DataNode、NodeManager和HBase RegionServer,推荐24GB(及以上)
- 根据CPU的核数来选择在某个节点上运行的进程数,例如:两个4核CPU=8核,每个Java进程都可以独立占有一个核(推荐:8核CPU)
- 内存不是越多越好,在使用过程中会产生较多碎片,Java堆内存越大, 会导致整理内存需要耗费的时间越大
三、HBase高可用
1、HBase高可用简介
HBase的高可用配置其实就是HMaster的高可用。要搭建HBase的高可用,只需要再选择一个节点作为HMaster,在HBase的conf目录下创建文件backup-masters,然后再backup-masters添加备份Master的记录。一条记录代表一个backup master,可以在文件配置多个记录。
2、部署HBase高可用
1)、在hbase的conf文件夹中创建 backup-masters 文件
cd /usr/local/bigdata/hbase-2.1.0/conf
touch backup-masters
[alanchan@server1 conf]$ touch backup-masters
[alanchan@server1 conf]$ ll
总用量 48
-rw-r--r-- 1 alanchan root 0 9月 28 14:55 backup-masters
-rw-r--r-- 1 alanchan root 2792 9月 28 13:36 core-site.xml
-rw-r--r-- 1 alanchan root 1811 7月 6 2018 hadoop-metrics2-hbase.properties
-rw-r--r-- 1 alanchan root 4271 7月 6 2018 hbase-env.cmd
-rw-r--r-- 1 alanchan root 198 9月 28 13:58 hbase-env.sh
-rw-r--r-- 1 alanchan root 2257 7月 6 2018 hbase-policy.xml
-rw-r--r-- 1 alanchan root 1934 9月 28 13:58 hbase-site.xml
-rw-r--r-- 1 alanchan root 4120 9月 28 13:36 hdfs-site.xml
-rw-r--r-- 1 alanchan root 4977 7月 6 2018 log4j.properties
-rw-r--r-- 1 alanchan root 23 9月 28 14:08 regionservers
[alanchan@server1 conf]$ vi backup-masters
2)、将server2添加到该文件backup-masters中
如果有几个备HMaster就写几个
vim backup-masters
server2
3)、将backup-masters文件分发到所有的服务器节点中
scp backup-masters server2:$PWD
scp backup-masters server3:$PWD
scp backup-masters server4:$PWD
[alanchan@server1 conf]$ scp backup-masters server2:$PWD
backup-masters 100% 8 0.0KB/s 00:00
[alanchan@server1 conf]$ scp backup-masters server3:$PWD
backup-masters 100% 8 0.0KB/s 00:00
[alanchan@server1 conf]$ scp backup-masters server4:$PWD
backup-masters
4)、重新启动hbase
stop-hbase.sh
start-hbase.sh
#启动hbase
[alanchan@server1 conf]$ start-hbase.sh
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /usr/local/bigdata/hbase-2.1.0/logs/hbase-alanchan-master-server1.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
server4: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server4.out
server3: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server3.out
server2: running regionserver, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-regionserver-server2.out
server2: running master, logging to /usr/local/bigdata/hbase-2.1.0/bin/../logs/hbase-alanchan-master-server2.out
#查看进程
[alanchan@server1 conf]$ jps
28048 ResourceManager
3953 NameNode
15154 QuorumPeerMain
8034 ApplicationHistoryServer
21331 HMaster
15687 KMSWebServer
22039 Jps
15368 JobHistoryServer
4590 DFSZKFailoverController
#验证hbase启动情况
[alanchan@server1 conf]$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
Took 0.0026 seconds
#验证主备机 ,也可登录server2上查看进程情况
hbase(main):001:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.4719 seconds
hbase(main):002:0>
5)、查看webui,检查Backup Masters中是否有server2
http://server1:16010/master-status
http://server2:16010/master-status
6)、尝试杀掉server1节点上的master,验证是否能访问
[alanchan@server1 conf]$ kill 21331
[alanchan@server1 conf]$ jps
28048 ResourceManager
3953 NameNode
15154 QuorumPeerMain
8034 ApplicationHistoryServer
15687 KMSWebServer
15368 JobHistoryServer
17274 Jps
4590 DFSZKFailoverController
#验证hbase是否能正常运行
[alanchan@server1 conf]$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
Took 0.0024 seconds
hbase(main):001:0> status
1 active master, 0 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.4764 seconds
7)、单独启停服务命令
#单独 启动 或 停止 HMaster、HRegionServer 的进程
hbase-daemon.sh start/stop master/regionserver
[alanchan@server1 conf]$ hbase-daemon.sh start master
running master, logging to /usr/local/bigdata/hbase-2.1.0/logs/hbase-alanchan-master-server1.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
[alanchan@server1 conf]$ jps
28048 ResourceManager
3953 NameNode
15154 QuorumPeerMain
8034 ApplicationHistoryServer
2470 HMaster
15687 KMSWebServer
15368 JobHistoryServer
2749 Jps
4590 DFSZKFailoverController
[alanchan@server1 conf]$ hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hadoop-3.1.4/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/bigdata/hbase-2.1.0/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell
Use "help" to get list of supported commands.
Use "exit" to quit this interactive shell.
Version 2.1.0, re1673bb0bbfea21d6e5dba73e013b09b8b49b89b, Tue Jul 10 17:26:48 CST 2018
Took 0.0025 seconds
hbase(main):001:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load
Took 0.4340 seconds
- Hbase 对时间比较敏感,每个节点的时间不能相差太大,相差太大的话是没有办法正常启动
以上,完成了hbase的介绍、hbase非高可用与高可用的部署及验证。