HBase学习提纲:助你一臂之力

HBase

简介HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。可在廉价PC Server上搭建起大规模结构化存储集群。

HBase利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协调工具。 HBase与传统数据库(RDBMS)的最大区别面向列操作数据库,如果是索引访问用HBase+Hadoop

当前市场上有很多类似的序列化系统,如Avro、Google 的 Protocol Buffers、Facebook 的 Thrift。

Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。

HBase是Hadoop生态系统的一个组成部分。如图:

在这里插入图片描述

HBase与HDFS对比

两者都具有良好的容错性和扩展性,都可以扩展到成百上千个节点; HDFS适合批处理场景但不支持数据随机查找,不适合增量数据处理,不支持数据更新。

HBase表的特点

  1. :一个表可以有数十亿行,上百万列;
  2. 无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列;
  3. 面向列:面向列(族)的存储和权限控制,列(族)独立检索;
  4. 稀疏:对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏;
  5. 数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳;
  6. 数据类型单一:HBase中的数据都是字符串,没有类型

为什么要使用hbase?

  1. 传统关系型数据库系统已无法适应大型分布式数据存储的需要
  2. 改良的关系数据库(副本、分区等)难于安装与维护
  3. 关系模型对数据的操作使数据的存贮变得复杂
  4. HBase从设计理念上就为可扩展做好了充分准备。
  5. 空间的扩展只需要加入存储结点,使用表的概念,但不同于关系数据库,实质上是一张极大的、非常稀疏的,存储在分布式文件系统上的表

HBase数据模型

表:Tables 由 rows 和 columns 组成。数据存放在带标签的表中。HBase中的每一张表,就是所谓的BigTable。稀疏表。

单元格:Table cells单元格有版本(Timestamp是HBase插入单元格时候的时间戳)。

时间戳( Timestamp ):时间戳,每次数据操作对应的时间戳,可以看作是数据的version number。是一个 64 位整数

列:列组成“列族”

列族:所有的列族成员有相同的前缀。物理上,所有的列族成员都一起存放在文件系统中。HBase实际上就是一个面向列族的存储器。Table在水平方向有一个或者多个列簇组成,一个列簇中可以有任意多个列组成

RowKey:二进制值byte[],按字典顺序排序。行键,Table的主键,Table中的记录按照Row Key排序

ColumnKey:二进制值byte[],按字典顺序排序。是表中每条记录的“主键”,方便快速查找

value:一个未解释的字节数组byte[]。

注意:表中的不同行可以拥有不同数量的成员。即支持“动态模式”模型

HBase数据模型中 行 的特点:

  1. 字符串、整数、二进制串甚至串行化的结构都可以作为行键
  2. 表按照行键的“逐字节排序”顺序对行进行有序化处理
  3. 表内数据非常‘稀疏’,不同的行的列的数完全目可以大不相同
  4. 可以只对一行上“锁”
  5. 对行的写操作是始终是“原子”的

HBase数据模型中 列 的特点

  1. 列必须用‘族’(family)来定义
  2. 任意一列有如下形式:“族:标签”。其中,族和标签都可为任意形式的串
  3. 物理上将同“族”数据存储在一起
  4. 数据可通过时间戳区分版本

HBase架构体系

  • Client:包含访问HBase的接口,client维护着一些cache 来加快对HBase的访问,比如region的位置信息

  • Zookeeper:

    1. 保证任何时候,集群中只有一个running master
    2. 存贮所有Region的寻址入口
    3. 实时监控Region Server 的状态,将Region server 的上线和下线信息,实时通知给Master
    4. 存储HBase的schema,包括有哪些table,每个table有哪些column family
  • Master:可以启动多个HMaster,通过Zookeeper的Master Election机制保证总有一个Master运行

    1. 为Region server 分配region
    2. 负责region server 的负载均衡
    3. 发现失效的region server 并重新分配其上的region
  • Region Server:

    1. 维护Master 分配给它的region,处理对这些 region 的 IO 请求
    2. 负责切分在运行过程中变得过大的region

注意:

HBase中有两张特殊的Table:-ROOT-.META.

  • .META.:记录了用户表的Region信息,.META.可以有多个regoin

  • -ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region

Zookeeper中记录了-ROOT-表的location

Client访问用户数据之前需要首先访问zookeeper,然后访问-ROOT-表,接着访问.META.表,最后才能找到用户数

据的位置去访问

HBase的shell操作

启动HBase:

start-hbase.sh

启动HBase shell:

hbase shell

退出HBase shell:

quit

帮助命令:

help

查看集群状态

status

创建表:create '表名称', '列族名称1','列族名称2','列族名 称N'

create 'users','user_id','address','info'

添加记录:put '表名称', '行名称', '列名称:', '值'

put 'users','xiaoming','info:age','24';

查看记录:get '表名称', '行名称'

get 'users','xiaoming'			   #取得一个id的所有数据 
get 'users','xiaoming','info'	   #获取一个id,一个列族的所有数据 
get 'users','xiaoming','info:age'  #获取一个id,一个列族中一个列的所有数据

查看表中的记录总数:count '表名称'

count 'users'

删除记录:delete '表名' ,'行名称' , '列名称'

delete 'users','xiaoming','info:age' 

删除整行:deleteall '表名' , '行名称'

deleteall 'users','xiaoming' 

删除一张表:先要屏蔽该表,才能对该表进行删除。1、disable '表名称' 。2、drop '表名称'

disable 'users'
drop 'users' 

注意:修改表结构或者删除表,需要先disable

查看所有记录:scan "表名称"

scan 'test' #查看test表中的所有数据

查看某个表某个列中所有数据:scan "表名称" ,'列族名称:列名称'

scan 'test','info:age'

清空表:truncate '表名'

truncate 'users'

获取单元格数据的版本数据:

get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>1} 

列出全部表:

list

得到表的描述:describe '表名'

describe 'users'

查看表的状态 :exists '表名'

exists 'users' 
is_enabled 'users' 
is_disabled 'users

使表有效或无:enable/disable '表名'

enable 'users'
disable 'users'

HBase的组件:

  • HMaster
    1. 管理用户对Table的增、删、改、查操作

    2. 管理RegionServer的负载均衡、调整Region的分布

    3. 在Region Split后,将新Region分布到不同的RegionServer。

    4. 在RegionServer宕机后,该RegionServer上所管理的Region 由HMaster进行重新分配。

  • HRegionServer
    1. RegionServer是HBase集群运行在每个工作节点上的服务组件
    2. RegionServer维护Master分配给它的region,处理对这些region的IO请求
    3. Region server负责切分在运行过程中变得过大的region
  • Region
    1. Region可理解为关系型数据库中的“分区”
    2. 处理RegionServer分配给它的任务

HBase的组件单元:

  • 表空间:在关系数据库系统中,命名空间 namespace 指的是一个表的逻辑分组,同一组中的表有类似的用途。有两个默认表空间:

    • hbase:系统命名空间,用于包含hbase的内部表
    • default:所有未指定命名空间的表都自动进入该命名空间
  • 表:HBase以表的形式存储数据,表在 hdfs 上以文件夹形式存(HBase表组成模型在上面)

在这里插入图片描述

HBase vs Oracle

  1. 索引不同造成行为的差异
  2. HBase适合大量插入同时又有读的情况
  3. HBase的瓶颈是硬盘传输速度,Oracle的瓶颈是硬盘寻道时间
  4. HBase很适合寻找按照时间排序top n的场景

HBase写入数据流程

  1. Client通过Zookeeper调度获取表的元数据信息;

  2. Cilent通过rpc协议与RegionServer交互,通过-ROOT-表与.META.表找到对应的对应的Region;

  3. 将数据写入HLog日志中,如出现意外可以同通过HLog恢复信息;

  4. 将数据写入Region的MemStore中,当MemStore达到阈值开始溢写,将其中的数据Flush成一个StoreFile;

  5. MemStore不断生成新的StoreFile,当StoreFile的数量到达阈值后会出发Compact合并操作,将多个StoreFile合并成一个StoreFile;

  6. StoreFile文件会不断增大,当达到阈值后会出发Split操作,把当前的Region且分为两个新的Region。父Region会下线,两个子Region会被HMaster分配到相应的RegionServer。

HBase查询数据流程

  1. Client访问Zookeeper,从ZK获取-ROOT-表的位置信息,通过访问-ROOT-表获取.META.表的位置,然后确定数据所在的HRegion位置;

  2. Client访问HRegion所在的HRegionServer,通过HRegionServer获取需要查找的数据;

  3. Client到HRegion的中去查找数据,首先到MemStore中查找,查到直接返回;查不到就去ClockCache中查找,查到直接返回;再查不到就去StoreFile中读数据,把读到的数据存入BlockCache中再返回Client。

表设计和调优

内存优化

HBase 操作过程中需要大量的内存开销,毕竟 Table 是可以缓存在内存中的,一般会分配整个可用内存的 70%给 HBase 的 Java 堆。但是不建议分配非常大的堆内存,因为 GC 过 程持续太久会导致 RegionServer 处于长期不可用状态,一般 16~48G 内存就可以了,如果因 为框架占用内存过高导致系统内存不足,框架一样会被系统服务拖死。

rowkey优化的主要方式

一条数据的唯一标识就是 RowKey,那么这条数据存储于哪个分区,取决于 RowKey 处 于哪个一个预分区的区间内,设计 RowKey 的主要目的 ,就是让数据均匀的分布于所有的 region 中,在一定程度上防止数据倾斜。

  1. 生成随机数、hash、散列值
  2. 字符串反转
  3. 字符串拼接

基础优化

1、允许在 HDFS 的文件中追加内容

  • 文件:hdfs-site.xml、hbase-site.xml

  • 属性:dfs.support.append

  • 解释:开启 HDFS 追加同步,可以优秀的配合 HBase 的数据同步和持久化。默认值为 true。

2、优化 DataNode 允许的最大文件打开数

  • 文件:hdfs-site.xml

  • 属性:dfs.datanode.max.transfer.threads

  • 解释:HBase 一般都会同一时间操作大量的文件,根据集群的数量和规模以及数据动作, 设置为 4096 或者更高。默认值:4096

3、优化延迟高的数据操作的等待时间

  • 文件:hdfs-site.xml

  • 属性:dfs.image.transfer.timeout

  • 解释:如果对于某一次数据操作来讲,延迟非常高,socket 需要等待更长的时间,建议把 该值设置为更大的值(默认 60000 毫秒),以确保 socket 不会被 timeout 掉。

4、优化数据的写入效率

  • 文件:mapred-site.xml

  • 属性:mapreduce.map.output.compress 、mapreduce.map.output.compress.codec

  • 解释:开启这两个数据可以大大提高文件的写入效率,减少写入时间。第一个属性值修改为
    true,第二个属性值修改为:org.apache.hadoop.io.compress.GzipCodec 或者其 他压缩方式。

5、设置 RPC 监听数量

  • 文件:hbase-site.xml

  • 属性:Hbase.regionserver.handler.count

  • 解释:默认值为 30,用于指定 RPC 监听的数量,可以根据客户端的请求数进行调整,读写 请求较多时,增加此值。

6、优化 HStore 文件大小

  • 文件:hbase-site.xml

  • 属性:hbase.hregion.max.filesize

  • 解释:默认值 10737418240(10GB),如果需要运行 HBase 的 MR 任务,可以减小此值, 因为一个 region 对应一个 map 任务,如果单个 region 过大,会导致 map 任务执行时间 过长。该值的意思就是,如果 HFile 的大小达到这个数值,则这个 region 会被切分为两个Hfile。

7、优化 HBase 客户端缓存

  • 文件:hbase-site.xml

  • 属性:hbase.client.write.buffer

  • 解释:用于指定 Hbase 客户端缓存,增大该值可以减少 RPC 调用次数,但是会消耗更多内 存,反之则反之。一般我们需要设定一定的缓存大小,以达到减少 RPC 次数的目的。

8、指定 scan.next 扫描 HBase 所获取的行数

  • 文件:hbase-site.xml

  • 属性:hbase.client.scanner.caching

  • 解释:用于指定 scan.next 方法获取的默认行数,值越大,消耗内存越大。

9、flush、compact、split 机制

当 MemStore 达到阈值,将 Memstore 中的数据 Flush 进 Storefile;compact 机制则是把 flush 出来的小文件合并成大的 Storefile 文件。split 则是当 Region 达到阈值,会把过大的 Region 一分为二。

有关安装:

安装HBase:

  1. 添加用户:
#adduser hadoop  //useradd   #开头表示root操作
#cat /etc/passwd
#ls /home/
#su hadoop
  1. 修改opt权限:chmod -R 777 /opt
  2. 上传WinSCP:jdk、hadoop、hbase
  3. 解压缩:tar zxvf /tmp/jdk-8u241-linux-x64.tar.gz(tar zxvf filename可以解压缩.tar.gz文件)
  4. 创建env.sh:
#!/bin/bash
export JAVA_HOME=/opt/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
  1. 导入:#root身份,文件末尾,加入 source /opt/env.sh 或者 . /opt/env.sh
  2. 关闭防火墙
    • 查询防火墙状态:systemctl status firewalld
    • 临时关闭:systemctl stop firewalld
    • 永久关闭:systemctl disable firewalld
  3. 关闭SELinux
    • 查询:sestatus -v 或者 getenforce
    • 临时关闭:setenforce 0。0设置 SELinux 成为 permissive 模式,1设置为 enforcing 模式
    • 永久关闭:vim /etc/selinux/config, 将SELINUX=enforcing改为SELINUX=disabled
  4. SSH免密码登录:
    • 查看状态:systemctl status sshd
    • 生成密钥:ssh-keygen -t rsa,生成文件在:~/ .ssh/
    • 将密钥copy到授权文件:cp id_rsa.pub authorized_keys。授权文件:authorized_ keys
    • 连接测试:ssh localhostssh远程登录服务使用的端口号是22
  5. 修改hostname和hosts
  6. 往/opt/env.sh中添加hadoop和HBase的环境变量
  7. 修改hadoop的配置文件
  8. 启动hadoop:start-dfs.sh start-yarn.sh。登录网络界面检查:http://192.168.100.11:50070
  9. 修改Hbase配置文件:hbase-env.sh、hbase-site.xml、regionservers
  10. 启动hbase:start-hbase.sh hbase shell。检查hbase:http://192.168.100.11:16010
  11. 停止HBase:stop-hbase.sh

使用python操作(CentOS7):

  1. 连接外网
  2. 确认Python3安装:python3 显示 Python 3.6.8 (default, Aug 7 2019, 17:28:10)
  3. 安装 Thriftpip3 install thrift
  4. 安装Python-devel开发包:yum install python3-develCentos 7中安装软件包提示"python.h: 没有那个文件或目录", 可以安装python3-devel解决此问题
  5. 安装Happybasepip3 install happybase
  6. 回到普通用户:pip3 list
  7. 启动集群 hadoop+hbase:
  8. 启动 thrift: hbase-daemon.sh start thrift
  9. 验证:ps aux|grep thriftjps
  10. 运行示例,查询API:https://happybase.readthedocs.io/en/latest/

使用java操作:

  1. 下载安装Eclipse,Eclipse IDE for Java Developers
    https://www.eclipse.org/downloads/packages/

  2. 下载安装jdk(Windows)
    https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

  3. 下载安装Maven
    https://maven.apache.org/download.cgi

  4. 设置jdk、maven环境变量:JAVA_HOME、CLASSPATH、PATH、MAVEN_HOME

  5. 验证jdk、maven安装:java -version、javac -version、mvn -version

  6. 修改maven配置:apache-maven-3.6.3\conf\settings.xml

<localRepository>本地路径</localRepository> <!-- 配置maven路径 -->
  1. 下载Maven依赖库:mvn help:system 成功提示:BUILD SUCESS
  2. 修改windows解析:hosts 文件
  3. 查询修改windows防火墙
  4. 添加HBase jar包
  5. 消除WARN,添加log4j.properties文件
  6. 消除hadoop error,windows环境变量添加HADOOP_HOME,添加winutils.exe文件

补充:

HBase高可用配置,涉及的配置文件名称backup-masters

H、PATH、MAVEN_HOME5. 验证jdk、maven安装:java -version、javac -version、mvn -version 6. **修改maven配置:**apache-maven-3.6.3\conf\settings.xml`

<localRepository>本地路径</localRepository> <!-- 配置maven路径 -->
  1. 下载Maven依赖库:mvn help:system 成功提示:BUILD SUCESS
  2. 修改windows解析:hosts 文件
  3. 查询修改windows防火墙
  4. 添加HBase jar包
  5. 消除WARN,添加log4j.properties文件
  6. 消除hadoop error,windows环境变量添加HADOOP_HOME,添加winutils.exe文件

补充:

HBase高可用配置,涉及的配置文件名称backup-masters

HBase分布式安装时需要将配置文件中的HBase.cluster.distributed值修改为true

猜你喜欢

转载自blog.csdn.net/Newbie___/article/details/106958585