分享

HBase使用经验总结

问题导读

1.hbase表中的属性分别都是什么含义?
2.hbase中如何实现预分区?
3.hbase中本文采用了哪些优化方法?





一、hbase中的常见属性
       VERSIONS:指版本数
       MIN_VERSIONS=> '0':最小版本数
       TTL=> 'FOREVER':版本存活时间
              假设versions=10,mini_version=4
              到达TTL时间后,version-mini_version=6,最老的6个版本的值会被清空

              create't2', {NAME => 'f1', VERSIONS => 1000,MIN_VERSIONS => '1000',TTL =>'31536000'}

       BLOOMFILTER=> 'ROW':布隆过滤器
                     -》NONE:不使用布隆过滤器
                     -》ROW:行级布隆过滤器
                     -》ROWCOL:行列布隆过滤器
                     进行storefile文件检索的时候:
                     ROW:会对当前的storefile进行判断,判断是否有我需要的rowkey,
                                   如果有就读,没有就跳过
                     ROWCOL:会对当前的storefile进行判断,判断是否有我需要的rowkey+列标签的组合,
                                   如果有就读,没有就跳过
                                   这种消耗的资源较大
       BLOCKSIZE=> '65536':数据块的大小,如果你的数据块越小,索引就越大
                                                 占用的内存就越高,速度会更快
                     create't3', {NAME => 'f1', BLOCKSIZE => '65536'}
       BLOCKCACHE=> 'true':缓存,默认就是true
                            建议:在企业中,对于不常使用的列簇,关闭缓存
       IN_MEMORY=> 'false':缓存中的级别,设置成TRUE,将优先缓存该列簇
                            缓存清理的算法:LRU

二、hbase中实现预分区
       设计分区时按照rowkey的前缀
       -》第一种:创建了5个分区
              create'split1', 'f1', SPLITS => ['100', '200', '300', '400']
1.png

              put'split1','001000000_2016','f1:name','111'           会放到第一个分区中
              put'split1','501000000_2016','f1:name','222'           会放到第五个分区中
2.png

       -》第二种
              create'split2', 'f1', SPLITS_FILE => '/opt/datas/splits.txt'
3.png

       -》第三种(默认创建15个分区,一般不使用)
              create'split3', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
4.png

       -》第四种:Java client
              byte[][]splitKeys = {
                     Bytes.toBytes("100"),
                     Bytes.toBytes("200"),
                     Bytes.toBytes("300")
              };
三、hbase中的优化
       -》hbase中的压缩
              -》时间换取空间
              -》Hadoop是否支持需要压缩类型
                     snappy安装:将压缩包放到并解压/opt/modules/hadoop-2.5.0/lib/native
                     bin/hadoopchecknative
              -》检测hbase当前是否支持压缩
                     bin/hbaseorg.apache.hadoop.hbase.util.CompressionTest /home/beifeng/snappy.txt snappy
5.png

              -》修改配置支持压缩
                     拷贝hadoop/lib下的native下的所有so文件和hadoop-snappy-0.0.1-SNAPSHOT.jar到hbase/lib下面
                     cp../hadoop-2.5.0/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar lib/
                     cp../hadoop-2.5.0/lib/native/* lib/
6.png

                     如果有多台regionserver,要将文件拷贝到每一台regionserver上
                     重启集群,测试
                     如果继续报错:
7.png

                     cp../hadoop-2.5.0/lib/native/* ../jdk1.7.0_67/jre/lib/amd64/
                     重启测试
8.png

                     2016-12-1919:10:48,830 INFO  [main]compress.CodecPool: Got brand-new decompressor [.snappy]
SUCCESS
              -》创建表测试
                     create'snappytest',{NAME=>'F1',COMPRESSION => 'SNAPPY'},{NAME=>'F2'}
9.png

       -》垃圾回收参数调优
              -》JVM:
                     新生代:空间比较小,主要存储新生成的对象,生存周期比较短
                                   Eden、survivor
                     老年代:空间表较大、主要存储应用程序中生命周期较长的对象
                     永生代:永久保存的区域,存储meta和class的信息
                                   元空间(本地内存)
                            GC:
                            ParrallelNew Collector 垃圾回收策略
                            特点:速度比较快,但是不适用与大数据量,GC停顿
                            并行标记回收器(ConcurrentMark-Sweep Collector):
                            特点:速度相对较慢,适用于大数据量的回收,避免GC停顿

                     exportHBASE_REGIONSERVER_OPTS=”-Xmx8g -Xms8G -Xmn128m -XX:UseParNewGC-XX:UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc-XX:+PrintGCDetails -XX:+PrintGCTimeStamps-Xloggc:$HBASE_HOME/logs/gc-${hostname}-hbase.log”

                     调优:将上述配置放入conf/hbase-env.sh文件

       -》hbase中内存的调优
              -》memstore
                     阈值:128M
                       <property>
                            <name>hbase.hregion.memstore.flush.size</name>
                            <value>134217728</value>
                       </property>
                     正常情况:关闭自动溢写
                                     在业务量较低时,手动触发flush
              -》cache
                     在注重读响应时间的应用场景下,可以将 BlockCache设置大些,Memstore设置小些,以加大缓存的命中率。
                        <name>hbase.regionserver.global.memstore.upperLimit</name>
                            <value>0.4</value>
                            <name>hfile.block.cache.size</name>
                            <value>0.4</value>
                     按照以下百分比分配给Single、Multi、InMemory使用:0.25、0.50和0.25。

              -》本地memstore缓存
                     内存的孔洞过多,需要进行垃圾回收,造成业务停顿
                     <name>hbase.hregion.memstore.mslab.enabled</name>
                     <value>true</value>
                     缺点:容易造成资源的浪费
              -》compact:用于文件的合并和清除被删除的数据
                     -》minor compaction:小文件(满足一定的条件)的合并,轻量级,频繁执行
                                                        它不会删除被标记为“删除”的数据和以过期的数据
                     -》major compaction
                            把所有的storefile合并成一个单一的storefile文件,
                            在文件合并期间系统会删除标记为"删除"标记的数据和过期失效的数据,
                            同时会block所有客户端对该操作所属的region的请求直到合并完毕,
                            最后删除已合并的storefile文件。
                                <name>hbase.hregion.majorcompaction</name>
                                   <value>604800000</value>
                            改成0就是关闭

                            企业中手动触发:major_compact
              -》split
                     最好关闭自动拆分,采用手动拆分方式:split
                        <name>hbase.hregion.max.filesize</name>
                            <value>10737418240</value>
                            建议改成100G

四、hbase表的迁移
       -》hadoop数据迁移类似
       -》hdfs
       -》表的迁移
              -》将数据迁移-》hadoop distcp
                            bin/hdfsfsck /
                            bin/hbasehbck
              -》元数据的恢复

       实验步骤:
       -》第一步:将t5表迁移到另一个hdfs集群
              在迁移之前要进行flush操作 (原路径 目标路径)
              bin/Hadoopdistcp hftp://192.168.134.191:50070/hbase/data/default/t5 hdfs://192.168.134.140:8020/distcp/
       -》第二步:删除t5表
       -》第三步:t5表迁移回来
              bin/Hadoopdistcp hftp://192.168.134.140:50070/dist ... hbase/data/default/
       -》第四步:查询hbase表
              list可以查询,无法操作
              ERROR:Unknown table t5!
       -》第五步:元数据恢复
              bin/hbasehbck  -fixAssignments –fixMeta

五、索引的介绍

       rowkey:110_20161211
                 110_20161212
                 110_20161213
                 110_20170213

       需求1:查找某个用户某一时间段内的通话记录
       需求2:查询某一时间段内所有用户的通话记录

       索引表方式实现:
              源  表:110_20161211
              索引表:20161211_110      value:对应源表中的rowkey:110_20161211

       需求:通过某一列的值来查询另一列的值
              name,age:查询所有今年18岁的用户的姓名

              传统思路:1-查询所有18岁的用户的rowkey
                              2-根据rowkey查询name

       索引实现:rowkey:18
                       info:rowkey:18岁对应的rowkey

       索引表同步的问题:
              -》第一种(效率低):在客户端执行,对源表操作时,同时对索引表进行操作
              -》第二种:编写协处理器
                                   在server端运行在客户端同步的逻辑,但是中小型企业不会自己编写
              -》其他框架:第三方工具
                     -》Phoenix:底层就是协处理器
                     -》solr
                     -》elasticsearch
              协处理器类型:
                     observer:观察者类,类似于RDBMS中的触发器
                     endpoint:终端类,类似于存储过程


六、hbase与其他框架的集成
       -》hive
       -》sqoop
       -》flume
       -》hue

-》sqoop与hbase集成(使用的是cdh版本的)
       用于hdfs与RDBMS之间的导入导出
       -》配置conf/sqoop-env.sh
       原始
10.png
新配置
11.png

              exportHADOOP_COMMON_HOME=/opt/modules/hadoop-2.5.0

              #Setpath to where hadoop-*-core.jar is available
              exportHADOOP_MAPRED_HOME=/opt/modules/hadoop-2.5.0

              #setthe path to where bin/hbase is available
              exportHBASE_HOME=/opt/modules/hbase-0.98.6-hadoop2

              #Setthe path to where bin/hive is available
              #exportHIVE_HOME=/opt/cdh-5.3.6/hive-0.13.1-cdh5.3.6

              #Setthe path for where zookeper config dir is
              exportZOOCFGDIR=/opt/modules/zookeeper-3.4.5/conf
       导入:
              bin/sqoopimport \
              --connect\
              jdbc:MySQL://hadoop-senior01.ibeifeng.com:3306/test\
              --usernameroot \
              --password123456 \
              --tablemy_user \
              --hbase-create-table\
              --hbase-tabletest \
              --hbase-row-keyid \
              --column-familyinfo \
              -m1
在HBase中查询:
12.png

       导出:没有导出
       怎么实现用sqoop导出hbase的数据?
       搭桥:hive
              hive与hbase集成
                     |
                     将hbase表中的数据存储到另一张hive表中
                     |
                     通过hdfs导出

-》hue集成
       -》启动hbase的thrift
              bin/hbase-daemon.shstart thrift
       —》修改hue.ini配置文件(/opt/cdh-5.3.6/hue-3.7.0-cdh5.3.6/desktop/conf/)
         hbase_clusters=(Cluster|hadoop-senior01.ibeifeng.com:9090)
         # HBase configuration directory, wherehbase-site.xml is located.
        hbase_conf_dir=/opt/modules/hbase-0.98.6-hadoop2/conf
13.png

       -》启动hue
              hue:build/env/bin/supervisor
hadoop-senior01.ibeifeng.com:8888
14.png







已有(3)人评论

跳转到指定楼层
偶阵雨丿 发表于 2017-1-10 15:12:06
学习了,mark
回复

使用道具 举报

Wyy_Ck 发表于 2017-1-16 10:37:49
请教一个小问题:

第一种:创建了5个分区
              create'split1', 'f1', SPLITS => ['100', '200', '300', '400']
         put'split1','001000000_2016','f1:name','111'           会放到第一个分区中
              put'split1','501000000_2016','f1:name','222'           会放到第五个分区中

这几个简单操作,第一个为什么就放在第一个分区了?  前面也没有看到怎么分区的

回复

使用道具 举报

langke93 发表于 2017-1-16 15:24:58
Wyy_Ck 发表于 2017-1-16 10:37
请教一个小问题:

第一种:创建了5个分区

201000000_2016试试这个可能放到第二分区
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条