7.HBase_应用_表设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15014327/article/details/83317874

HBase的namespace中存放tables。默认情况下:

  • default:未指定命名空间创建的表,都在此命名空间下存放。
  • hbase:系统的命令空间,主要存放:meta表、命名空间。

1.多个列族和设置属性

# 创建命名空间
create_namespace 'ns1'
# 查看命名空间
list_namespace
# 创建表
# create 'ns1:t1',{NAME => 'CF',VERSIONS => 2}
create 'ns1:t1','cf1' # 等价于 create 'ns1:t1',{NAME => 'cf1'}
# 创建表(多个列族)
create 'ns1:t1','cf1','cf2' # 等价于 create 'ns1:t1',{NAME => 'cf1'},{NAME => 'cf2'}
# 查看表信息
describe 'ns1:t1' # 可查看表的信息,包括很多属性

2.创建表预分区

生成环境中,最方便导入大量数据的方式是:data file -> hfile -> bulk load。但是,我们刚创建表的时候默认只有一个Region。往表中导入大量数据,必然需要切分成两个Region。这时候,就出现了"瞬间大量写入",对于RegionServer来说,压力巨大(有可能会挂掉)。
解决方案:创建表时,多给表一些Region(结合实际业务,依据表数据的ROWKEY进行设计)。

(1) 创建表(指定预估RowKey,以日期为例:年月日时分秒毫秒)

#生成四个Region
create 'ns1:logs','info',SPLITS => ['20181001000000000','20181011000000000','20181021000000000']

(2) 创建表(指定RowKey文件)

create 'ns1:logs','info',SPLITS_FILE => '/opt/apps/logs.txt' #local file
vim /opt/apps/logs.txt
    20181001000000000
    20181011000000000
    20181021000000000

(3) 创建表(指定类对RowKey分区)

create 'ns1:logs','info',{NUMREGIONS => 5,SPLITALGO => 'HexStringSplit'}
create 'ns1:logs','info',{NUMREGIONS => 5,SPLITALGO => 'UniformSplit'}

3.话单实例 : 存储RowKey设计

需求 : 本人某段时间通话记录
查询条件 : (本人号码)telphone + (starttime - endtime)
数据样式 : time    area    active	phone	talktime	mode	price
核心 : rowkey查询快、rowkey范围检索、rowkey前缀匹配
设计 : 
	rowkey : telphone + time	#18801773332_20181025000000000
	info : area    active	phone	talktime	mode	price
需求 : 本人与某好友一段时间通话记录
说明 : 相对于上面那个表,这个表的设计称为索引表或辅助表
查询条件 : phone + (starttime - endtime)
数据样式 : time    area    active	phone	talktime	mode	price
核心 : rowkey查询快、rowkey范围检索、rowkey前缀匹配
设计 : 
	rowkey : phone + time	#18801773332_20181025000000000
	info : area    active	phone	talktime	mode	price
解释 : 因为在主表中根据rowkey(主叫号码_呼叫时间)检索,某个好友的通话记录会在这个时间段内分散,查询慢。
      我们创建索引表,它的rowkey(被叫号码_呼叫时间)会把某个被叫号码某段时间的通话记录排序连续放在一起,检索非常快。
出现的问题 : 主表数据和索引表数据如何同步?
        方案 : phoenix 或 solr作为索引表使用cloudera search同步

4.表属性

先配置Hadoop和HBase的Snappy压缩:

# 1.查看hadopp是否支持压缩
hadoop checknative
Native library checking:
hadoop:	false
zlib:	false
snappy:	false
# 2.检查当前HBase是否支持压缩
hbase org.apache.hadoop.util.NativeLibraryChecker
Native library checking:
hadoop:	false
zlib:	false
snappy:	false
# 3.下载
https://github.com/google/snappy
# 4.(上传到hadoop安装目录)解压
tar -zxf 
# 5.编译安装
make & make install
# 6.声明环境变量
export HBASE_HOME=/usr/hdp/2.5.3.0-37/hbase
export HADOOP_HOME=/usr/hdp/2.5.3.0-37/hadoop
export HADOOP_SNAPPY_HOME=/usr/hdp/2.5.3.0-37/hadoop/hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar
# 7.将snappy里的jar拷贝到hbase的lib下
cp `${HADOOP_SNAPPY_HOME}/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar` `${HBASE_HOME}/lib`
# 8.在hbase的lib下创建native文件夹
mkdir lib/native
# 9.设置软连接
ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64
# 10.再次查看是否压缩
hbase org.apache.hadoop.util.NativeLibraryChecker
Native library checking:
hadoop:	true
zlib:	true
snappy:	true
# 11.测试压缩文件
hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://master:8020/test.txt snappy 

# 注意:我使用的Ambari安装的集群,所以不需要以上步骤去配置snappy。
#      如果是手动安装的,按照以上步骤配置完成后,记得要重启hadoop和hbase。

(1) 表压缩属性

# 创建表(有压缩属性)
create 'lv:t2',{NAME => 'CF1',COMPRESSION => 'SNAPPY'}

(2) 表inMemory和BlockCache属性

  • RegionServer的内存分配主要是:MemStore(写数据时保存)、BlockCache(读数据时保存)、Other(其他使用)。
  • 用户读取数据时,从MemStore、BlockCache、HFile按顺序读取。每个RegionServer一个BlockCache。
  • BlockCache:按照Cache分为三种:inMemory、Single和Multi类型。inMemory一般存放Meta元数据信息,不会被刷掉。
  • inMemory、Single和Multi三种Cache分配比例是1:1:2。
# 查看表"缓存"属性
hbase(main):002:0> describe 'emp'
Table emp is ENABLED            
emp      
COLUMN FAMILIES DESCRIPTION      
{NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', 
REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', 
MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', 
BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 
1 row(s) in 0.1050 seconds

说明:因为默认BLOCKCACHE=true,所以我们查数据(从缓存查)如此的快。

猜你喜欢

转载自blog.csdn.net/qq_15014327/article/details/83317874