《HBase 不睡觉》第二章 - 让 HBase 跑起来

《HBase 不睡觉书》是一本让人看了不会睡着的 HBase 技术书籍,写的很是不错,为了加深记忆,决定把书中重要的部分整理成读书笔记,便于后期查阅,同时但愿为初学 HBase 的同窗带来一些帮助。java

目录

本文不会详细介绍 HBase 的按照过程,主要介绍一些安装的注意事项。node

1、小技巧

一、添加 hadoop 用户并分配 sudo 权限

(1)切换到root用户,而后创建hadoop用户。算法

# useradd hadoop
# passwd hadoop
复制代码

(2)添加 hadoop 到sudoers 列表。shell

# chmod u+w /etc/sudoers
# vi u+w /etc/sudoers
-- 添加下面的代码 --
hadoop ALL=NOPASSWD:ALL
复制代码

二、Hadoop 环境变量设置

切换到 hadoop 用户,并编辑 ~/.bashrc 文件,添加如下环境变量:apache

export HADOOP_HOME=/usr/local/hadoop
export HADOOP_PREFIX=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
expOrt HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDES_HOME=$HADOOP_HOME
eXpOrt YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_INSTALL=$HADOOP_HOME
复制代码

有的教程提到配置 HADOOP_HOME,而官方教程说是配置 HADOOP_PREFIX,那么究竟 Hadoop 是用哪一个环境变量来标定 Hadoop 的程序文件夹位置?实际上,早期 Hadoop 主要用 HADOOP_HOME 来标定程序文件夹位置,后来改为了 HADOOP_PREFIX,因此为了兼容性,干脆都设置上,而且保持同样的值吧。编程

三、配置 hadoop-env.sh

编辑 hadoop 的 $HADOOP_PREFIX/etc/hadoop/hadoop-env.sh 文件,在文件开头添加如下变量:bash

export HADOOP_NAMENODE_OPTS="-Xms1024m -Xmx1024m -XX:+UseParallelGC"
export HADOOP_DATANODE_OPTS="-Xms1024m-Xmx1024m"
export HADOOP_LOG_DIR=/data/1ogs/hadoop
复制代码
  • JVM 运行的内存若是不设定占用大小的话,要么不够,要么就把机器的内存都占满了。只要用到 JVM 的地方都加入内存参数,至少内存多少本身内心有数,让状况可控。
  • 日志文件路径若是不设定的话,多半后期会遇到放日志的分区满了,各类奇怪故障层出不穷。

四、把 hbase 添加到 supergroup 组

因为在伪分布式和彻底分布式的状况下 HBase 会直接在 HDFS 的根目录下创建 /hbase 文件夹,在根目录下要创建文件夹须要超级用户组权限。超级用户组权限由 hdfs-site.xml 中的 dfs.permissions.supergroup 来定义,若是你不设定这个参数,默认的超级用户组组名是 supergroup。假定你们都没有设定 dfs.permissions.supergroup 属性,如今须要把 hbase 添加到 Linux 的 supergroup 组去。CentOS 系统可执行下面的语句:架构

# groupadd supergroup
# groupmems -g supergroup -a hbase
复制代码

五、特别注意

HBase 自带了一个 ZooKeeper,并且会默认启动本身的 ZooKeeper,若是 HBase 用的是本身的 ZooKeeper,那你在 jps 中看到的 ZooKeeper 名字是 HQuorumPeer。若是你使用的是外部的 ZooKeeper 集群,那么它的名字叫 QuorumPeer 或者 QuorumPeerMain。app

是否开启自带的 ZooKeeper 由 conf/hbase-env.sh 中定义的 HBASE_MANAGES_ZK 变量定义。这个变量默认为 true,若是不想使用自带的 ZK 你能够将值改成 false。分布式

# Tell HBase whether it should manage it's own instance of Zookeeper or not.
export HBASE_MANAGES_ZK=false
复制代码

六、HBase 读取到 HDFS 的配置有三种方式

  • HADOOP_CONF_DIR 添加到 HBASE_CLASSPATH 中(推荐);
  • 把 HDFS 的配置文件复制一份到 HBase 的 conf 文件夹下,或者直接建一个 hdfs-site.xml 的软连接到 hbase/conf下;
  • 把 HDFS 的几个配置项直接写到 hbase-site.xml 文件里面去。

2、HBase 的基本架构

  • HBase 中有一个 Master 用来管理元数据,它就像 Hadoop 中的 namenode;
  • RegionServer 是用来存储数据的,至关于 Hadoop 中的 datanode;
  • ZooKeeper 负责维护 HBase 的全部节点,若是 ZooKeeper 宕掉了,你一个节点都连不上;
  • 生产环境下的彻底部署模式是基于 HDFS 的,使用 HDFS 来存储数据,可是在单机模式下 HBase 能够直接使用普通文件系统来存储数据;
  • 在使用中就算把 Master 关掉了,依旧能够从 HBase 中读取数据和写入数据,只是不能建表或者修改表。这是由于客户端读取数据的时候只是跟 ZooKeeper 和 RegionServer 交互,因此,ZooKeeper 甚至比 Master 还重要。

HBase 的基本架构

3、启用数据块编码

一、数据块编码

数据块编码主要是针对 Key/Value 中的 Key 进行编码,减小 Key 存储所占用的空间,由于不少 Key 的前缀都是重复的。

假设有这样一个表,它的行键(Rowkey)、列族(Column Family)、列(Column)的定义规则是:行键以 myrow 前缀打头,后面跟上数字来组成行键,好比 myrow00一、myrow00二、myrow003 等,拥有一个列族叫 mycf,mycf 列族中有 5 个列,分别名叫 col一、col二、col三、col四、col5,它们的存储结构以下所示。

原始编码下的数据存储格式

能够看到这么多行的 Key 其实有很大一部分的字符是重复的,若是咱们只存储递进值,就能够避免存储重复的前缀,这就是前缀编码(Prefix)。

二、前缀编码(Prefix)

若是使用前缀编码做为数据块编码方式,那么它只会存储第一个 Key 的完整字符串,后面的 key 只存储跟第一个 key 的差别字符,从新编码过的数据以下所示。

前缀编码后的数据存储格式

能够看到 Key 的存储空间极大地缩小了,编码后的 Key 总存储空间只用了 37 个字符,而未编码前是 180 个字符,空间占用减小了 79%。

三、差别编码(Diff)

差别编码(Diff)比前缀编码更进一步,差别编码甚至把如下字段也一块儿进行了差别化的编码。

  • 键长度(KeyLen);
  • 值长度(ValueLen);
  • 时间戳(Timestamp),也便是Version;
  • 类型(Type),也便是键类型。

采用了差别编码后的 KeyValue 结构为:

  • 1 byte:标志位;
  • 1-5 bytes:Key 长度(KeyLen);
  • 1-5 bytes:Value 长度(ValLen);
  • 1-5 bytes:前缀长度(Prefix Len);
  • ... bytes:剩余的部分;
  • ... bytes:真正的 Key 或者只是有差别的 key 后缀部分;
  • 1-8 bytes:时间戳(timestamp)或者时间戳的差别部分;
  • 1 byte:Key 类型(type);
  • ... bytes:值(value)。

前缀长度(Prefix Len)字段表示当前的 Key 跟与之相比的 Key 的相同前缀的长度。

差别编码后的数据存储格式

标志位(Flag)

它是一个二进制数。好比,5=11,7=111。它的做用就是记录当前这个 KeyValue 跟上一个 KeyValue 之间有哪几个字段有差别,如下是产生标志位的部分规则:

  • 若是当前 KeyValue 中的 KeyLen(Key的长度)跟上一个 KeyValue相等,则标志码为 1。
  • 若是当前 KeyValue 中的 ValLen(Value长度)跟上一个 ValLen 相等,则标志码为10。
  • 若是当前 KeyValue 中的 Type 跟上一个 Type 相等,则标志码为100。

只须要把 flag 跟标志码作一个与(&)计算就能够快速地知道这个字段跟上一个字段的差别在哪里,即相同的位置标记为 1

这样编码几乎是最大程度地对数据进行了编码压缩,可是这个编码方式默认是不启用的。为何?由于太慢了,每条数据都要这样计算一下,获取数据的速度很慢。除非你要追求极致的压缩比,可是不考虑读取性能的时候可使用它,好比你想要把这部分数据看成归档数据的时候,能够考虑使用差别编码。

四、快速差别编码(Fast Diff)

快速差别编码(Fast Diff)借鉴了 Diff 编码的思路,也考虑到了差别编码速度慢的致命缺陷。快速差别编码的 KeyValue 结构跟差别编码如出一辙,只有 Flag 的存储规则不同,而且优化了 Timestamp 的计算。Fast Diff 的实现比 Diff 更快,也是比较推荐的算法。

若是你想用差别算法来压缩你的数据,那么最好用快速差别编码,不过这个“快速”只是相对原本的差别算法而言的,因为仍是有不少计算过程存在,因此快速差别算法的速度依然属于比较慢的

五、前缀树编码(Prefix Tree)

前缀树编码(Prefix Tree)是前缀算法的变体,它是 0.96 版本以后才加入的特性。前缀树编码最大的做用就是提升了随机读的能力,可是其复杂的算法相对地下降了写入的速度,消耗了更多的 CPU 资源,使用时须要在资源的消耗和随机读的性能之间进行取舍。

综上,前缀编码与快速差别编码(Kylin 默认使用该方式)应该算是比较经常使用的两种数据块编码方式了。

4、启用压缩器

一、压缩器

压缩器的做用是能够把 HBase 的数据按压缩的格式存储,这样能够更节省磁盘空间。固然这彻底是可选的,不过推荐你们仍是安装 Snappy 压缩器,这是 HBase 官方目前排名比较高的压缩器。

能够经过修改列族描述启用压缩器:

hbase> alter 'mytable',{NAME =>'mycf',COMPRESSION=>'snappy'}
复制代码

二、共享 Hadoop 内置的压缩器

因为 Hadoop 的共享库(shared Library)拥有不少资源,包括压缩器,因此能够直接将它们用在 HBase中。能够经过如下命令检查 Hadoop 目前有用的压缩器:

$ hbase --config $HBASE_HOME/conf org.apache.hadoop.util.NativeLibraryChecker
复制代码

若是遇到下面的报错信息,则表示 NativeLibraryChecker 没法读取到 Hadoop 的 native 库。

util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
using builtin-java classes where applicable
    Native library checking:
    hadoop: false
    zlib: false
    snappy: false
    1z4: false
    bzip2: false
复制代码

常规的解决方法是在 hbase-env.sh 加入下面的语句:

export HBASE_LIBRARY_PATH=Hadoop的Native包所在路径
复制代码

三、Snappy 压缩器

Snappy 是 Google 开发的压缩器,有如下特色:

  • 快速:压缩速度达到 250MB/s;
  • 稳定:已经用于 Google 多个产品长达数年;
  • 健壮:Snappy 的解压器能够保证在数据被损坏的时候也不会太糟;
  • 免费开源。

安装完成后,须要在 hbase-env.sh 加入下面的语句:

export HBASE_LIBRARY_PATH=编码器so文件所在路径:$HBASE_LIBRARY_PATH
复制代码

四、GZ 压缩器

通常状况下若是不是对速度要求很低的归档文件,通常不建议使用GZ压缩器,GZ 压缩器的特色:

  • GZ 压缩器拥有最高的压缩比;
  • 速度较慢,占用较多CPU;
  • 安装简单。

Java 已经自带了一个 GZ 压缩器,因此 GZ 压缩器虽然不是性能最好的,可是倒是最容易使用的,你什么都不须要设置,只须要直接修改列族的 COMPRESSION 属性为 GZ 便可。

alter test1',{NAME=>'mycf',COMPRESSION=>'GZ'} 复制代码

五、LZO 压缩器

在 Snappy 推出以前,LZO 是 HBase 官方推荐的压缩算法。主要缘由是 GZ 压缩的速度太慢了,而 LZO 正好就是专一于速度,因此相比起来使用 LZO 会比 GZ 更好,不过自从 Snappy 出了以后,LZO 就没有什么优点了。

六、LZ4 压缩器

LZ4 的特色:

  • 拥有低丢失率;
  • 速度很快,能够达到400M/s每核。

LZ4 比 Snappy 更快,LZ4 压缩器已经集成在 libhadoop.so 中,因此只须要让 HBase 加载Hadoop 自带的原生库便可。

5、总结

使用数据块编码仍是压缩器取决于你存储的数据中是限定符占的空间较大仍是值占的空间较大。

  • 若是是限定符占的空间较大,建议使用数据块编码。
  • 若是是值占的空间较大,建议使用编码器。

最开始学习 HBase 的时候,大多都是直接使用 Java API 去进行表操做,不多去关注 HBase 安装相关的内容;经过上述的介绍,至少数据块编码和压缩器在之后建表时候仍是能够考虑的,官方推荐的 Snappy 压缩器以及前缀编码都是即简单又有效的调优方法。


Any Code,Code Any!

扫码关注『AnyCode』,编程路上,一块儿前行。

相关文章
相关标签/搜索