问题导读
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']
put'split1','001000000_2016','f1:name','111' 会放到第一个分区中
put'split1','501000000_2016','f1:name','222' 会放到第五个分区中
-》第二种
create'split2', 'f1', SPLITS_FILE => '/opt/datas/splits.txt'
-》第三种(默认创建15个分区,一般不使用)
create'split3', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
-》第四种: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
-》修改配置支持压缩
拷贝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/
如果有多台regionserver,要将文件拷贝到每一台regionserver上
重启集群,测试
如果继续报错:
cp../hadoop-2.5.0/lib/native/* ../jdk1.7.0_67/jre/lib/amd64/
重启测试
2016-12-1919:10:48,830 INFO [main]compress.CodecPool: Got brand-new decompressor [.snappy]
SUCCESS
-》创建表测试
create'snappytest',{NAME=>'F1',COMPRESSION => 'SNAPPY'},{NAME=>'F2'}
-》垃圾回收参数调优
-》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
原始
新配置
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中查询:
导出:没有导出
怎么实现用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
-》启动hue
hue:build/env/bin/supervisor
hadoop-senior01.ibeifeng.com:8888
|
|