《HBase 不睡觉书》是一本让人看了不会睡着的 HBase 技术书籍,写的很是不错,为了加深记忆,决定把书中重要的部分整理成读书笔记,便于后期查阅,同时但愿为初学 HBase 的同窗带来一些帮助。java
本文不会详细介绍 HBase 的按照过程,主要介绍一些安装的注意事项。node
(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 用户,并编辑 ~/.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 的 $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
复制代码
因为在伪分布式和彻底分布式的状况下 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
复制代码
HADOOP_CONF_DIR
添加到 HBASE_CLASSPATH
中(推荐);hdfs-site.xml
的软连接到 hbase/conf
下;数据块编码主要是针对 Key/Value 中的 Key 进行编码,减小 Key 存储所占用的空间,由于不少 Key 的前缀都是重复的。
假设有这样一个表,它的行键(Rowkey)、列族(Column Family)、列(Column)的定义规则是:行键以 myrow 前缀打头,后面跟上数字来组成行键,好比 myrow00一、myrow00二、myrow003 等,拥有一个列族叫 mycf,mycf 列族中有 5 个列,分别名叫 col一、col二、col三、col四、col5,它们的存储结构以下所示。
能够看到这么多行的 Key 其实有很大一部分的字符是重复的,若是咱们只存储递进值,就能够避免存储重复的前缀,这就是前缀编码(Prefix)。
若是使用前缀编码做为数据块编码方式,那么它只会存储第一个 Key 的完整字符串,后面的 key 只存储跟第一个 key 的差别字符,从新编码过的数据以下所示。
能够看到 Key 的存储空间极大地缩小了,编码后的 Key 总存储空间只用了 37 个字符,而未编码前是 180 个字符,空间占用减小了 79%。
差别编码(Diff)比前缀编码更进一步,差别编码甚至把如下字段也一块儿进行了差别化的编码。
采用了差别编码后的 KeyValue 结构为:
前缀长度(Prefix Len)字段表示当前的 Key 跟与之相比的 Key 的相同前缀的长度。
它是一个二进制数。好比,5=11,7=111。它的做用就是记录当前这个 KeyValue 跟上一个 KeyValue 之间有哪几个字段有差别,如下是产生标志位的部分规则:
只须要把 flag 跟标志码作一个与(&)计算就能够快速地知道这个字段跟上一个字段的差别在哪里,即相同的位置标记为 1。
这样编码几乎是最大程度地对数据进行了编码压缩,可是这个编码方式默认是不启用的。为何?由于太慢了,每条数据都要这样计算一下,获取数据的速度很慢。除非你要追求极致的压缩比,可是不考虑读取性能的时候可使用它,好比你想要把这部分数据看成归档数据的时候,能够考虑使用差别编码。
快速差别编码(Fast Diff)借鉴了 Diff 编码的思路,也考虑到了差别编码速度慢的致命缺陷。快速差别编码的 KeyValue 结构跟差别编码如出一辙,只有 Flag 的存储规则不同,而且优化了 Timestamp 的计算。Fast Diff 的实现比 Diff 更快,也是比较推荐的算法。
若是你想用差别算法来压缩你的数据,那么最好用快速差别编码,不过这个“快速”只是相对原本的差别算法而言的,因为仍是有不少计算过程存在,因此快速差别算法的速度依然属于比较慢的。
前缀树编码(Prefix Tree)是前缀算法的变体,它是 0.96 版本以后才加入的特性。前缀树编码最大的做用就是提升了随机读的能力,可是其复杂的算法相对地下降了写入的速度,消耗了更多的 CPU 资源,使用时须要在资源的消耗和随机读的性能之间进行取舍。
综上,前缀编码与快速差别编码(Kylin 默认使用该方式)应该算是比较经常使用的两种数据块编码方式了。
压缩器的做用是能够把 HBase 的数据按压缩的格式存储,这样能够更节省磁盘空间。固然这彻底是可选的,不过推荐你们仍是安装 Snappy 压缩器,这是 HBase 官方目前排名比较高的压缩器。
能够经过修改列族描述启用压缩器:
hbase> alter 'mytable',{NAME =>'mycf',COMPRESSION=>'snappy'}
复制代码
因为 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 是 Google 开发的压缩器,有如下特色:
安装完成后,须要在 hbase-env.sh
加入下面的语句:
export HBASE_LIBRARY_PATH=编码器so文件所在路径:$HBASE_LIBRARY_PATH
复制代码
通常状况下若是不是对速度要求很低的归档文件,通常不建议使用GZ压缩器,GZ 压缩器的特色:
Java 已经自带了一个 GZ 压缩器,因此 GZ 压缩器虽然不是性能最好的,可是倒是最容易使用的,你什么都不须要设置,只须要直接修改列族的 COMPRESSION 属性为 GZ 便可。
alter test1',{NAME=>'mycf',COMPRESSION=>'GZ'} 复制代码
在 Snappy 推出以前,LZO 是 HBase 官方推荐的压缩算法。主要缘由是 GZ 压缩的速度太慢了,而 LZO 正好就是专一于速度,因此相比起来使用 LZO 会比 GZ 更好,不过自从 Snappy 出了以后,LZO 就没有什么优点了。
LZ4 的特色:
LZ4 比 Snappy 更快,LZ4 压缩器已经集成在 libhadoop.so 中,因此只须要让 HBase 加载Hadoop 自带的原生库便可。
使用数据块编码仍是压缩器取决于你存储的数据中是限定符占的空间较大仍是值占的空间较大。
最开始学习 HBase 的时候,大多都是直接使用 Java API 去进行表操做,不多去关注 HBase 安装相关的内容;经过上述的介绍,至少数据块编码和压缩器在之后建表时候仍是能够考虑的,官方推荐的 Snappy 压缩器以及前缀编码都是即简单又有效的调优方法。
Any Code,Code Any!
扫码关注『AnyCode』,编程路上,一块儿前行。