7.HBase

xiaoxiao2022-06-11  33

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

转载请注明原文地址: https://www.6miu.com/read-4932153.html

最新回复(0)