HBase
2020-06-09 09:45:13 0 举报
AI智能生成
HBase知识点覆盖
作者其他创作
大纲/内容
hbase的架构
Client
Zookeeper
HRegionServer向ZK发送心跳
当HRegionServer心跳失败后,通知HMaster
节点上下线感知
存元数据
HMaster
对HRegionServer管理的region数作负载均衡
存元数据
当某个HRegionServer挂掉后,HMaster会将它所管理的Region分配给其它可用的HRegionServer
HRegionServer
负责客户端的读写请求
运行过程中region变大时,对其切分
HBase上Regionserver的内存分为两个部分
Memstore,主要用来写
BlockCache,主要用于读数据
Region
集群中分布式存储的最小单元
memstore
内存缓冲区
BlockCache
存储经常访问的数据
hbase存储数据结构
rowkey
Column Family
Column
Timestamp
cell
{row key, column( =<family> + <label>), version}唯一确定的单元
cell中的数据是没有类型的,全部是以字节数组进行存储
HBase的存储原理
HMaster
HregionServer
Region
store
memstore
storeFile
HFile
HBase的读写数据流程
读操作
客户端发起读请求 get
1.首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息
2、根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息
3、找到这个region对应的regionServer,然后客户端发送请求给RegionServer
4、查找对应的region
5、先从memstore查找数据,如果没有,再从BlockCache上读取
6、如果BlockCache中也没有找到,再到StoreFile上进行读取
7、从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,
而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端
而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后在返回结果给客户端
写操作
客户端发起写请求 put
1.首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息
2、根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息
3、找到这个region对应的regionServer,然后客户端发送请求给RegionServer
4、把数据分别写到HLog(write ahead log)和memstore各一份
5、memstore达到阈值后把数据刷到磁盘,生成storeFile文件
6、删除HLog中的历史数据
Flush机制
当memstore的大小超过这个值的时候,会flush到磁盘,默认为128M
hbase.hregion.memstore.flush.size
当memstore中的数据时间超过1小时,会flush到磁盘
hbase.regionserver.optionalcacheflushinterval
HregionServer的全局memstore的大小,超过该大小会触发flush到磁盘的操作,默认是堆大小的40%
hbase.regionserver.global.memstore.size
手动flush
flush tableName
Compact合并机制,防止小文件过多,影响查询效率
minor compaction 小合并
表示至少需要三个满足条件的store file时,minor compaction才会启动
hbase.hstore.compaction.min
表示一次minor compaction中最多选取10个store file
hbase.hstore.compaction.max
表示文件大小小于该值的store file 一定会加入到minor compaction的store file中,默认128M
hbase.hstore.compaction.min.size
表示文件大小大于该值的store file 一定会被minor compaction排除,默认值为LONG.MAX_VALUE
hbase.hstore.compaction.max.size
major compaction 大合并
合并Store中所有的HFile为一个HFile
有删除标记的数据会被真正移除,同时超过单元格maxVersion的版本记录也会被删除
默认值为7天进行一次大合并
hbase.hregion.majorcompaction
手动触发
major_compact tableName
region 拆分机制
SteppingSplitPolicy (2.0版本默认这个)
region个数等于1 ? 切分阈值为flush size * 2 : MaxRegionFileSize
KeyPrefixRegionSplitPolicy
根据rowKey的前缀对数据进行分组,这里是指定rowKey的前多少位作为前缀
DelimitedKeyPrefixRegionSplitPolicy
保证相同前缀的数据在同一个region中
DisabledRegionSplitPolicy
不启用自动拆分, 需要指定手动拆分
表的预分区
手动指定预分区
create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']
分区创建在文件中:create 'student','info',SPLITS_FILE => '/opt/bigdata/split.txt'
HexStringSplit 算法
HexStringSplit会将数据从“00000000”到“FFFFFFFF”之间的数据长度按照n等分之后算出每一段的起始rowkey和结束rowkey,以此作为拆分点
例如:create 'mytable','base_info','extra_info',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}
region 合并
通过Merge类冷合并Region
需要先关闭hbase集群
hbase org.apache.hadoop.hbase.util.Merge 表名 region_key1 region_key2
通过online_merge热合并Region
不需要关闭hbase集群,在线进行合并
online_merge的传参是Region的hash值,而Region的hash值就是Region名称的最后那段在两个.之间的字符串部分
进入hbase shell: merge_region 'c2212a3956b814a6f0d57a90983a8515','553dd4db667814cf2f050561167ca030'
实战
打成jar包提交到集群中运行
hadoop jar hbase_java_api-1.0-SNAPSHOT.jar com.kaikeba.HBaseLoad
hadoop jar hbase_java_api-1.0-SNAPSHOT.jar com.kaikeba.HBaseLoad
加载HFile文件到hbase表中
代码加载
//构建LoadIncrementalHFiles加载HFile文件
LoadIncrementalHFiles load = new LoadIncrementalHFiles(configuration);
load.doBulkLoad(new Path("hdfs://node1:9000/output_HFile"), admin,table,connection.getRegionLocator(tableName));
LoadIncrementalHFiles load = new LoadIncrementalHFiles(configuration);
load.doBulkLoad(new Path("hdfs://node1:9000/output_HFile"), admin,table,connection.getRegionLocator(tableName));
命令加载
1.hadoop jar hbase-server-VERSION.jar completebulkload [-c /path/to/hbase/config/hbase-site.xml] /user/todd/myoutput mytable
2.- 先将hbase的jar包添加到hadoop的classpath路径下
export HBASE_HOME=/opt/bigdata/hbase
export HADOOP_HOME=/opt/bigdata/hadoop
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`
export HBASE_HOME=/opt/bigdata/hbase
export HADOOP_HOME=/opt/bigdata/hadoop
export HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`
3.hadoop jar /opt/bigdata/hbase/lib/hbase-server-1.2.1.jar completebulkload /output_HFile t5
hbase集成hive
创建基于hbase的hive表
create external table hiveFromHbase(
rowkey string,
f1 map<STRING,STRING>,
f2 map<STRING,STRING>,
f3 map<STRING,STRING>
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
TBLPROPERTIES ("hbase.table.name" = "hbase_test");
rowkey string,
f1 map<STRING,STRING>,
f2 map<STRING,STRING>,
f3 map<STRING,STRING>
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:,f2:,f3:")
TBLPROPERTIES ("hbase.table.name" = "hbase_test");
将hive表映射到hbase表中
create table hive_test(
id string,
name string,
age int,
address string
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address")
TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive");
id string,
name string,
age int,
address string
)STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:name,f2:age,f3:address")
TBLPROPERTIES ("hbase.table.name" = "hbaseFromhive");
rowkey设计
长度原则
建议越短越好,不要超过16个字节。设计过长会降低memstore内存的利用率和HFile存储数据的效率
owkey散列原则
rowkey唯一原则
hbase表的热点的解决方案
预分区
加盐:在rowkey的前面增加随机数
哈希
反转,牺牲了rowkey的有序性
hbase的数据备份
基于hbase提供的类对hbase中某张表进行备份
全量备份
HBase数据导出到HDFS
hbase org.apache.hadoop.hbase.mapreduce.Export test /hbase_data/test_bak
hbase org.apache.hadoop.hbase.mapreduce.Export test /hbase_data/test_bak
HBase数据导出到本地文件
hbase org.apache.hadoop.hbase.mapreduce.Export test file:///home/hadoop/test_bak
hbase org.apache.hadoop.hbase.mapreduce.Export test file:///home/hadoop/test_bak
将本地文件上的数据导入到备份目标表中
hbase org.apache.hadoop.hbase.mapreduce.Driver import test_bak file:///home/hadoop/test_bak/*
hbase org.apache.hadoop.hbase.mapreduce.Driver import test_bak file:///home/hadoop/test_bak/*
将hdfs上的数据导入到备份目标表中
hbase org.apache.hadoop.hbase.mapreduce.Driver import test_bak /hbase_data/test_bak/*
hbase org.apache.hadoop.hbase.mapreduce.Driver import test_bak /hbase_data/test_bak/*
增量备份
hbase org.apache.hadoop.hbase.mapreduce.Export test /hbase_data/test_bak_increment 开始时间戳 结束时间戳
基于snapshot的方式实现对hbase中某张表进行备份
hbase的二级索引
本质就是建立hbase表中列与行键之间的映射关系
确保query查询使用Index
创建 convered index
create index USER_COOKIE_ID_AGE_INDEX on USER ("f"."cookie_id") include("f"."age");
在查询中提示其使用index
在select和column_name之间加上/*+ Index(<表名> <index名>)*/,通过这种方式强制使用索引。
例如:
select /*+ index(user,USER_COOKIE_ID_AGE_INDEX) */ "age" from user where "cookie_id"='0000023f-53b3-421b';
例如:
select /*+ index(user,USER_COOKIE_ID_AGE_INDEX) */ "age" from user where "cookie_id"='0000023f-53b3-421b';
使用本地索引 (创建Local Indexing 索引)
索引性能调优
1. index.builder.threads.max
创建索引时,使用的最大线程数。
默认值: 10。
创建索引时,使用的最大线程数。
默认值: 10。
2. index.builder.threads.keepalivetime
创建索引的创建线程池中线程的存活时间,单位:秒。
默认值: 60
创建索引的创建线程池中线程的存活时间,单位:秒。
默认值: 60
3. index.writer.threads.max
写索引表数据的写线程池的最大线程数。
更新索引表可以用的最大线程数,也就是同时可以更新多少张索引表,数量最好和索引表的数量一致。
默认值: 10
写索引表数据的写线程池的最大线程数。
更新索引表可以用的最大线程数,也就是同时可以更新多少张索引表,数量最好和索引表的数量一致。
默认值: 10
4. index.writer.threads.keepalivetime
索引写线程池中,线程的存活时间,单位:秒。
默认值:60
索引写线程池中,线程的存活时间,单位:秒。
默认值:60
5. hbase.htable.threads.max
每一张索引表可用于写的线程数。
默认值: 2,147,483,647
每一张索引表可用于写的线程数。
默认值: 2,147,483,647
6. hbase.htable.threads.keepalivetime
索引表线程池中线程的存活时间,单位:秒。
默认值: 60
索引表线程池中线程的存活时间,单位:秒。
默认值: 60
7. index.tablefactory.cache.size
允许缓存的索引表的数量。
增加此值,可以在写索引表时不用每次都去重复的创建htable,这个值越大,内存消耗越多。
默认值: 10
允许缓存的索引表的数量。
增加此值,可以在写索引表时不用每次都去重复的创建htable,这个值越大,内存消耗越多。
默认值: 10
8. org.apache.phoenix.regionserver.index.handler.count
处理全局索引写请求时,可以使用的线程数。
默认值: 30
处理全局索引写请求时,可以使用的线程数。
默认值: 30
phoenix
squirrel GUI工具连接
0 条评论
下一页