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,所以我们查数据(从缓存查)如此的快。