HBase-表的压缩
一、如何选择压缩算法以及Data_Block_Encoding?
(1)如果Key很长,或者有很多Column,那么推荐使用FAST_DIFF。
(2)如果数据是冷数据,不经常被访问,那么使用GZIP压缩格式。因为虽然它比Snappy/LZO需要占用更多而CPU,但是它的压缩比率更高,更节省磁盘。
(3)如果是热点数据,那么使用Snappy/LZO压缩格式。它们相比GZIP,占用的CPU更少。
(4)在大多数情况下,Snappy/LZO的选择都很好。Snappy比LZO更好。
建表语句:
CREATE 'hbase_test',{NAME=>'C',COMPRESSION => 'SNAPPY',DATA_BLOCK_ENCODING => 'FAST_DIFF'} ;
修改表的编码和压缩方式:
alter 'default:hbase_test',{NAME=>'C',COMPRESSION => 'SNAPPY',DATA_BLOCK_ENCODING => 'FAST_DIFF'} ;
业务上可能会遇到这种情况,在最初创建hbase表时候,未指定压缩方式,当数据导入之后,由rowkey带来的数据膨胀导致hdfs上的数据大小远远大于原始数据大小。所以这时候可能就不得不考虑使用压缩,但是如果将表删除,再创建一张指定压缩的表,再重新导入数据未免太浪费时间。当然也完全不用这样,可以直接修改hbase表的压缩方式,然后在执行major_compact即可。
alter 'tableName',{NAME=>'familyName',COMPRESSION => 'SNAPPY',DATA_BLOCK_ENCODING => 'FAST_DIFF'} ; //设置表使用SNAPPY压缩,并使用FAST_DIFF编码 desc 'tableName' //验证是否已启用压缩方式 major_compact 'tableName' //执行合并
需要注意的几点:
1.在执行alter之后,hbase表已经启用压缩,但是对于原来表里已有的数据并不会进行压缩,后续再写入的数据才会执行压缩(可以到hdfs验证)
2.如果想把原来表里已有的数据也使用压缩,那么需要执行一次major_compact。major_compact会重新读写数据,在这个流程中,对原有的数据进行压缩,但是如果表数据很大执行major_compact对hbase集群会有比较大的影响。如果是线上环境,建议在业务不繁忙期间执行。
二、在HBase中如何设置SNAPPY压缩?
升级到hbase2.5.1以及以上版本,然后修改或者添加配置。
hbase.io.compress.snappy.codec配置的值为org.apache.hadoop.hbase.io.compress.xerial.SnappyCodec可以解决。
(1)打开HBase配置文件 hbase-site.xml
vi $HBASE_HOME/conf/hbase-site.xml
(2)添加以下配置项到hbase-site.xml文件中
<property> <name>hbase.io.compress.snappy.codec</name> <value>org.apache.hadoop.hbase.io.compress.xerial.SnappyCodec</value> </property>
(3)重启HBase。
$HBASE_HOME/bin/stop-hbase.sh ;
$HBASE_HOME/bin/start-hbase.sh ;
三、HBase如何拷贝数据到另外一张表?
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --new.name=test02 --families=name test01
当然也可以根据startrow和stoprow筛选数据拷贝
hbase org.apache.hadoop.hbase.mapreduce.CopyTable --startrow=000 --stoprow=999 --new.name=test02 --families=name test01
CopyTable的命令格式如下:
CopyTable [general options] [--starttime=X] [--endtime=Y] [--new.name=NEW] [--peer.adr=ADR] <tablename>
常用选项说明如下:
- startrow:开始行。
- stoprow:停止行。
- starttime:开始时间(以毫秒为单位的unixtime)。若未指定endtime意味着从开始时间到永久。
- endtime:结束时间。如果未指定starttime,则忽略。
- versions:要复制的单元格版本数。
- new.name:新表的名称。
- peer.adr:目标集群的地址,格式为hbase.zookeeer.quorum:hbase.zookeeper.client.port:zookeeper.znode.paren,对于CloudTable集群而言就是“${CloudTable目标集群的“ZK链接地址”}:/hbase”。
- families:要复制的列族列表,多个列族之间以逗号分隔。如果要从sourceCfName复制到destCfName,请指定为sourceCfName:destCfName。如果复制后列族名称保持不变,只需指定cfName。
- all.cells:对删除标记和已删除的单元格也进行复制。
- tablename:要复制的表的名称。
本文来自博客园,作者:业余砖家,转载请注明原文链接:https://www.cnblogs.com/yeyuzhuanjia/p/17769994.html