我记得我刚工作那年19年的春天,对hbase还是比较恐惧的,因为里面存储的是字节,后来我专门去当讲师,去学习,克服了恐惧,了解了原理,再后来在安全公司专门用hbase对他企业级的有了更多的理解。所以作为我最喜欢的库之一,写了很多文档,但是没有一个汇总,这篇就是我对hbase的汇总吧。
作为一个组内分享使用,目的是,让同事们,看完之后能知道Hbase的前因后果,以及使用场景,选型时的瓶颈,以及能够使用。
根据实际业务场景来,来了问题,先调研(选型组件),瓶颈,熟悉组件原理,安装与使用组件。
目录
大数据的常用数据库,hbase,hive,kudu,clickhouse关系数据库我就不对比了,因为查询速度不是一量级的。
hive是基于mapreduce的,数据存储在hdfs上,能和hbase关联做映射,但是查询基于mr和spark速度最慢,和presto连接后,查询速度变快。但是本质上这个库是不快的,并且不支持随机读写,比如我要改数据就不行,3.0后移除了。最稳定,批处理能力强。
kudu支持随机读写,能读数据也能改数据,批处理能力不及hive,和impala一起查询,经常把内存搞崩,查询速度比较快。支持更新操作,和impala一起查询,很方便。适合经常更新的数据库,对实时性要求也高的。
hbase,查询速度非常快,2亿条数据取1条只要1秒,支持随机读写,查询只能根据rowkey查询,集成phoenix后,支持sql查询,但是影响速度,数据可选择hdfs或者本地磁盘。适合单一业务的存储,不适合复杂业务。尤其不适合各种关联的。
clickhouse,查询速度非常快,由于单条查询,利用整机的cpu,对于多条查询,资源吃紧,不太适合当作接口提供。单表查询非常快。适合作为宽表。操作方便,自带查询。其他的3个组件不关联其他的组件,简直是难用。
--------------------
名称 读 写 资源消耗 资源维护 缺点
hive 慢 慢 非常低(稳定) 中 速度慢
hbase 快 快(300w/s) 中 中 不适合复杂查询
kudu 快 快 很高 中 资源消耗大
clickhouse 快 快 高 低 不适合多表查询
优点及使用场景
hive:数据仓库的构建,因为稳定,适合晚上跑全量离线业务
hbase:适合实时场景比较高,读写量比较大,查询结构不是很复杂的数据,存ods或根据key的简单业务,如我想立马获得某个id的数据,或者某个时间点的数据,可以把他想象成一个超级大的hashMap使用。
kudu:可作为mysql的升级替代品,查询消耗内存较高,不是很稳定
clickhouse:作为宽表的查询使用,适合实时sql分析,比如我要每几个小时,更新一次全量的分析数据,那可以先用clickhouse先sql做探测,sql写好了,用hive去写定时任务去跑。如果用clickhouse去跑,那可能当时clickhouse跑的时候,其他的服务没有资源,会被影响。也适合只要一次的数据,比如需要测试这个方案可不可行,先统计下某次的数据。
对比:
Hbase、Kudu和ClickHouse横向对比V2.0_陈舟的舟的博客-CSDN博客_clickhouse kudu
写入瓶颈
之前多线程开了2000个线程跑,发现他的一台hbase机器的瓶颈是300w左右,4台机器在跑,每台机器500个线程。每个线程处理1w*20w的数据。超过300w后的数据就会出现连接问题,然后重试。
读取瓶颈
目前没有发现读取速度的问题,单个读取和scan(rowstart-rowend)获取非常快。全表的扫描速度,计数测试,并不快。
多线程hbase插入(千亿级)_我要用代码向我喜欢的女孩表白的博客-CSDN博客_java多线程hbase
首先先说最重要的,hbase的rowkey。
hbase是基于key查询的,那么他是怎么进行key查询的,首先他用了ascii编码,将key进行了排序,所以你看到的是这样的。
并且字段内容中文的,被16进制编码

key是唯一的,设计的原则,hbase会把连续性的数据存在一起,key的设计尽量分散,否则可能将某年的数据全部存到了一个节点中。如果查询某年的数据,如果使用scan,速度会更快,如果使用filter则会变慢。如果开头不是时间,那么只能用filter,但是能解决分散问题,但是get何时都不会慢。关于批量扫描,权衡业务设计rowkey
key是64字节,不能过长。
value,存储值,value是一个列簇,为什么叫列簇,因为一个value能存多个列,比如上图的value就是info。info中的列名创建了一个name。

cs相当于列簇,一个列簇里面可以有很多内容,我们通常把一块独立的业务数据,存储在某个列簇中,这样想获得某块业务的数据就直接可以获取,但是获取多表关联类似的业务,不是hbase的使用范围,如果需要这样做,请结合其他数据库,建立映射关系,在进入hbase中查询。


以上就是hbase的主要内容
HBASE快的原因是,可以在查询的适合将数据定位到指定的regionServer中,在到指定的region中
更多内容请参考:
Hbase史上最详细原理总结_二十同学的博客-CSDN博客_hbase原理
Hbase版本2.10(cdh6.3.2保持一致)
还没下好,暂时用的国内资源2.18,下的快,安装如出一辙
绿色部分改成自己对应的内容
hbase的各台机器,时间必须保持一致,当超出一定范围,hbase会宕机
下载地址:
hbase数据存储,存储在hdfs,hbase集群管理依赖于zookeeper
注:hbase存储当然也可以磁盘,并且内部有zookeeper,为了方便备份,我们使用hdfs,为了方便管理和容错,我们使用zookeeper,zookeeper外部集群可靠性强
一般大数据,如spark这些都依赖zookeeper,大数据的很多组件集群都依赖zookeeper,很多(hive,hbase)计算的存储也都依赖于hadoop
Zookeeper集群搭建比较简单(3.4.x)
zookeeper搭建_我要用代码向我喜欢的女孩表白的博客-CSDN博客
hadoop搭建(3.x)
【上传】到服务端某个目录,并且【解压】
这里上传的目录是/software
- tar -zxvf hbase-2.1.8-bin.tar.gz
-
- mv hbase-2.1.8 hbase2
配置环境变量
vi /etc/profile
修改内容如下
============
export HBASE_HOME=/software/hbase2
export PATH=$PATH:$HBASE_HOME/bin
============
更新环境变量
source /etc/profile
这个时候,就可以用单节点的hbase了,输入hbase shell即可进入hbase客户端
- cd /software/hbase2/conf
-
- vi hbase-env.sh
============
#指定java环境的位置
export JAVA_HOME=/usr/java/jdk1.8.0_181-cloudera
#关闭自带的zk
export HBASE_MANAGES_ZK=false
============
vi hbase-site.xml
指定,hdfs的存储目录,外部zk位置
备份个数,集群节点
==============
=====================
vi regionservers
=============
localhost
hadoop2
hadoop3
=============
我写的分发脚本,你也可以scp
- sh /ssync /software/hbase2/
-
- sh /ssync /etc/profile
每个节点都启动zk(集群),然后每个节点都启动hbase,那么当一个hmaster宕机后,则会自动替换
- cd /software/hbase2/bin
-
- ./start-hbase.sh
结果查看:
输入jps,查看hadoop1结果

hadoop2和hadoop3

shell基本命令
Hbase基本(常用)命令-------长文(适合学习全局)_我要用代码向我喜欢的女孩表白的博客-CSDN博客
hbase shell Hbase模糊查询id不根据时间_我要用代码向我喜欢的女孩表白的博客-CSDN博客
java
Hbase JavaApi 批量获取数据(scan)和插入代码(put) 代码_我要用代码向我喜欢的女孩表白的博客-CSDN博客_hbase 批量scan
hbase java Api Scan Limit ----小短文(含分页实现思路)_我要用代码向我喜欢的女孩表白的博客-CSDN博客_hbase limit
多线程hbase插入(千亿级)_我要用代码向我喜欢的女孩表白的博客-CSDN博客_java多线程hbase
python使用happybase
python操作Hbase导入导出_我要用代码向我喜欢的女孩表白的博客-CSDN博客
Python连接Hbase并且查循数据(自用)_我要用代码向我喜欢的女孩表白的博客-CSDN博客_python连接hbase查询