hbase建表,删表,修改,查询(get,scan,布隆过滤器)

本文详细介绍了HBase的建表、插入数据、查询及过滤器的使用方法。从创建表、添加列族到使用Put插入数据,再到通过Get和Scan查询数据,涵盖了HBase的基本操作。同时,讲解了不同类型的过滤器,如RowFilter、ValueFilter和SingleColumnValueFilter等,用于高效地过滤和检索数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建表

直接建表:

create ‘表名’,‘列族名'

如果之后想加入新的列族:

alter ‘表名’,‘列族名’

补充:

alter ‘表名’,{NAME=‘列族名’,属性1=>属性值 1,属性2=>属性值2}{NAME=>‘列族名2’ ,属性 1=>属性值1.....}

如果是不存在的列族,就是添加,如果是已存在的列族,就是修改属性.(eg:version,bloofilter,ttl…)
其中Alter 允许的列族级别属性 BLOOMFILTER, COMPRESSION ,TTL, BLOCKSIZE, BLOCKCACH …

如果建表时想加入一些设置:

create ‘表名’,{NAME=>‘列族名’,VERSIONS=>‘’,BLOCKCACHE=>‘’, BLOOMFILTER=>‘’,COMPRESSION=>‘’,TTL=>‘’},{NAME=>’列族名’, 属性=>属性值........}

bloomfilter是设置布隆过滤器(一般是none,可以设置为row,rowcol),compression是设置数据压缩方式,TTL是设置数据过期时间
查看表的属性:

describe '表名‘

删除表:

Disable '表名‘
drop ‘表名‘

删除列族:

alter‘表名’,delete=>’列族名’

判断表是否存在:

exists '表名‘

为某列族的某列数据拼接后缀数据:

Append ‘表名’,‘行键’,‘列名’,‘拼接值’

删除某个列族的某个字段数据:

delete ‘表名’,‘行键’,‘列族:列’

插入数据put

put只能每次插入一个行键对应的一个列族的一个列属性的值,不能直接插入多条数据,区别mysql的一条语句查询。
eg:

put  'student','001','grade:Database',92
put  'student','001','grade:Math',98
put 'student','003','doom:phone',1110989009

hbase查询

list

hbase所有属性:columns,startrow,endrow,timerange,versions,fliter,limit

get

get是直接使用的行键进行查询是索引查找,速度最快
无论是get还是scan都使用[ ]来查询多个列族字段的数据或者查询时间戳范围数据,如columns=>[‘info:name’,‘info:sno’,‘grade:Database’],如果只是一个列族的单字段数据可以不使用[ ]
eg:
versions=>3表示取过去3个版本的数据,但是前提是需要先设置当前字段有三个版本

get 'student','001',{COLUMNS=>['info:name','info:sno'],TIMERANGE=>[1639034014464,1639034055161],VERSIONS=>3}

scan

scan是基于范围查找,另外Scan命令若不指定显示的版本数,则显示拥有最大(最 新)时间戳的数据版本。
直接查看表中的前10行数据:

scan 'student'{LIMIT=>10}

更广用法:
eg:

scan 'student',{COLUMNS=>['info:name' ,'info:dept' ], STARTROW=>'002',STOPROW=>'005',TIMERANGE=>[1639034014464,1639034055161],VERSIONS=>3}

如果想要显示所有版本数据就必须加上versions

布隆过滤器

查找形式多样,支持多种形式的查找
RowFilter
行键过滤器
查询student表中rowkey中包含123的数据。

scan 'student', {FILTER=> "RowFilter(=,'substring:123')"}

ValueFilter
值过滤器
查询student表中值包含123的数据,因为hbase在存储的时候是以key-value格式的列式存储,在查询遍历的时候每行每列都会遍历,所以才有这个过滤器.
除了可以查询等于,也可以查询大于、大于等于、小于、小于等于、不等于,比较的方式是字典排序。
除非在数据存储的时候存储的类型为数字类型。
substring:包含的意思、binary:精确查询、regexstring:正则匹配、null:空值比较、long:数字比较

scan 'student',{FILTER=> "ValueFilter(=,'substring:123')"}

SingleColumnValueFilter
单列值过滤器
查询student表中列簇为info.列名为server的所有数据。
注意:在使用单列值过滤器必须保证每行数据都有要查询的列,因为查询结果也会返回没有要查询的列的整行记录。

scan 'student',{FILTER=>"SingleColumnValueFilter('info','server',=,'binary:chds-2:60020')"}

PrefixFilter
行键前缀过滤器
查询student表中行键以123开头的所有数据

scan 'student',{FILTER=>"PrefixFilter('123')"}

ColumnPrefixFilter
单列名前缀过滤器
查询student表中以server开头的列的所有数据

scan 'student',{FILTER=>"ColumnPrefixFilter('server')"}

MultipleColumnPrefixFilter
多列名前缀过滤器
查询student表中以server和regioninfo开头的列的所有数据

scan 'student',{FILTER=>"MultipleColumnPrefixFilter('servedr','regioninfo')"}

PageFilter
分页过滤器
分页过滤器要和startRow搭配使用,和LIMIT功能类似。
过滤器搭配使用的时候分页过滤器要放在最后。
但是如果是页面开发使用java api操作,分页过滤器有一个缺点就是必须一页一页翻页,因为要传递startRow的值,和ES的深度分页类似

scan 'student',{FILTER=>"PageFilter(2)",STARTROW=>''}
scan 'student',{LIMIT=>2,STARTROW=>''}

InclusiveStopFilter
包含结尾过滤器
endRow在使用过程中查询结果不包括endRow,可以搭配使用这个过滤器。

scan 'student',{STARTROW=>'',ENDROW=>'',FILTER=>"InclusiveStopFilter('')"}

FamilyFilter
列簇过滤器

scan 'student',{FILTER=>"FamilyFilter(=,'binary:info')"}

QualifierFilter
列名过滤器

scan 'student',{FILTER=>"QualifierFilter(=,'binary:server')"}

SingleColumnValueExcludeFilter
单列值不包含过滤器,和单列值过滤器类似

scan 'student',{FILTER=>"SingleColumnValueExcludeFilter('info','server',=,'binary:13270')
<think>我们正在处理关于HBase的两个问题:1)查询数据量的方法;2)性能优化。我们将结合提供的引用信息来回答。 首先,关于查询HBase中数据量的方法:HBase本身没有直接提供类似于SQL中COUNT(*)的函数来快速获取总行数。但是,我们可以通过以下几种方法来获取数据量: 1.使用HBase Shell的count命令:在HBaseShell中,我们可以对执行`count 'table_name'`命令。这个命令会执行一个MapReduce作业来计算行数,因此对于大可能会比较慢。为了提高效率,可以指定一个时间范围或者使用缓存,例如:`count'table_name',{INTERVAL=>10000, CACHE =>1000}`,其中INTERVAL示每10000行显示一次,CACHE示每次扫描缓存的记录数(默认为10,增加缓存可加快速度)[^4]。2.使用HBase的HadoopMapReduce作业:HBase提供了`RowCounter`工具,它是一个MapReduce作业,专门用于统计的行数。使用命令:`hbase org.apache.hadoop.hbase.mapreduce.RowCounter'table_name'`。这种方法适合大数据量,因为它利用了集群的并行计算能力。 3.使用HBase的协处理器(Coprocessor):从HBase0.92版本开始,我们可以使用AggregationClient(基于协处理器)来执行聚合操作,包括计数。这种方式比全扫描更高效,但需要预先在上启用协处理器。 4.使用HBase的API编程:通过Java API,我们可以编写程序进行全扫描,然后计数。但是这种方法效率最低,一般不议用于大数据量。 然后,关于性能优化: 根据提供的引用,我们可以从以下几个方面进行优化: 1.索引和查询优化:HBase本身不支持二级索引,但我们可以通过设计合适的行键(RowKey)来优化查询。行键设计应遵循以下原则:-避免热点:行键应分散,避免所有数据集中在某个Region。-利用前缀:将经常一起查询的数据放在相邻的行键上。-长度适中:行键长度不宜过长(通常议10~100字节)。2.扫描器(Scanner)设置:通过调整扫描器的缓存大小(Caching)和批量大小(Batch)来提高查询效率。在Java API中,我们可以设置:```javaScanscan =new Scan();scan.setCaching(1000);//设置一次从服务器获取的行数scan.setBatch(100);//设置一次从服务器获取的数(如果很多)```这样可以减少RPC次数,提高效率[^4]。 3.使用过滤器(Filter):在查询时使用过滤器来减少传输的数据量。例如,使用PageFilter来分页,使用PrefixFilter来按行键前缀过滤等。 4.读写优化:-写优化:使用批量写(Put的List)而不是单条写;关闭写前日志(WAL)以提高写入速度(但会降低可靠性);调整MemStore和BlockCache的大小。-读优化:增加BlockCache的大小(用于缓存数据块);使用布隆过滤器(BloomFilter)来减少磁盘读取次数;开启压缩(如Snappy、LZ4)以减少I/O。5.集群优化:调整Region的大小和数量;平衡RegionServer的负载;调整HDFS的副本因子和块大小等。 6.监控和诊断:使用HBase自带的监控工具(如HBaseWeb UI)来监控集群状态,识别性能瓶颈。下面我们结合引用内容来总结: 引用[1]提到索引和查询优化是提高HBase查询性能的关键。引用[2]强调了在具体问题场景下优化查询的重要性。引用[3]则介绍了HBase数据读写性能优化的核心概念和技巧。引用[4]具体说明了如何通过设置扫描器的缓存来提高结果集游标移动的效率。 因此,我们可以这样回答:###查询HBase数据量的方法1.**使用HBaseShell的count命令**:执行`count 'table_name'`,可以通过参数`INTERVAL`和`CACHE`来调整显示间隔和缓存大小,提高效率[^4]。 2. **使用RowCounter MapReduce作业**:执行`hbaseorg.apache.hadoop.hbase.mapreduce.RowCounter 'table_name'`,适合大数据量。 3. **使用协处理器(AggregationClient)**:通过聚合协处理器实现高效计数,需要预先启用协处理器。### HBase性能优化方法1. **行键设计**:合理设计行键,避免热点,利用前缀优化查询[^1]。2.**扫描器设置**:通过`setCaching`和`setBatch`方法减少RPC次数,提高扫描效率[^4]。 3. **使用过滤器**:减少传输的数据量。4.**读写优化**:-写操作:批量写入、调整WAL策略、调整MemStore大小。-读操作:增加BlockCache、使用布隆过滤器、开启压缩[^3]。5.**集群优化**:调整Region大小和数量,负载均衡,优化HDFS配置。 6. **监控诊断**:利用HBase监控工具实时分析性能。 通过以上方法,可以有效提升HBase查询效率和整体性能。§§相关问题§§1.HBase行键设计有哪些最佳实践?2.如何通过协处理器实现HBase的聚合操作?3.HBase读写性能优化的具体参数配置有哪些?4.如何监控HBase集群的性能指标?</think>### 查询HBase数据量的方法 在HBase中获取数据量主要有以下三种方法,根据场景选择: 1. **HBase Shell的count命令** 基础语法:`count '<table_name>'` 优化参数(减少RPC次数): ```bash count 'user_table', { INTERVAL => 10000, CACHE => 1000 } # INTERVAL: 每1万行显示统计进度 # CACHE: 每次RPC获取1000行(默认10) ``` 适用场景:中小规模(耗时与数据量成正比)。 2. **RowCounter MapReduce工具** 执行全并行扫描: ```bash hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'user_table' ``` 优势:利用集群并行计算,适合**亿级以上大**。 注意:会触发全扫描,避免业务高峰执行。 3. **协处理器AggregationClient** 通过代码实现高效聚合(需启用协处理器): ```java Configuration conf = HBaseConfiguration.create(); AggregationClient ac = new AggregationClient(conf); long rowCount = ac.rowCount(TableName.valueOf("user_table"), new LongColumnInterpreter(), null); ``` 原理:在RegionServer本地计算,减少网络传输[^3]。 --- ### HBase查询性能优化方案 结合引用内容,核心优化策略如下: #### 一、查询层优化 1. **扫描器缓存设置** ```java Scan scan = new Scan(); scan.setCaching(1000); // 单次RPC获取1000行(默认1条) scan.setBatch(100); // 数较多时批量获取 ``` 效果:减少`resultScanner.next()`的RPC次数,提升游标移动效率[^4]。 2. **行键设计原则** - **避免热点**:添加随机前缀(如`hash(userid)_userid`) - **查询优化**:将高频查询字段前置(如`region_date_id`) - **长度控制**:议10~100字节(过短易冲突,过长降低存储效率)[^1]。 3. **布隆过滤器** 启用`ROW`或`ROWCOL`模式,加速`Get`操作: ```bash create 'user_table', {NAME => 'cf', BLOOMFILTER => 'ROW'} ``` #### 二、存储层优化 1. **压缩算法选择** ```bash alter 'user_table', NAME => 'cf', COMPRESSION => 'SNAPPY' ``` 推荐:冷数据用`GZ`(高压缩比),热数据用`LZ4/SNAPPY`(低CPU开销)[^3]。 2. **读写缓存分离** ```xml <!-- hbase-site.xml --> <property> <name>hfile.block.cache.size</name> <value>0.4</value> <!-- 读缓存(BlockCache) --> </property> <property> <name>hbase.regionserver.global.memstore.size</name> <value>0.4</value> <!-- 写缓存(MemStore) --> </property> ``` 调整原则:读多场景增大`BlockCache`,写多场景增大`MemStore`[^3]。 #### 三、集群级优化 1. **Region预分区** 避免自动分裂带来的性能波动: ```bash create 'user_table', 'cf', {NUMREGIONS => 16, SPLITALGO => 'UniformSplit'} ``` 2. **本地化率监控** 确保数据与HDFS DataNode在同一物理节点: ```bash hbase hbck -details | grep Locality # 目标值 > 0.99 ``` 3. **堆外内存配置** 减轻GC压力: ```xml <property> <name>hbase.regionserver.offheap.global.memstore.size</name> <value>0.3</value> <!-- 堆外内存占比 --> </property> ``` --- ### 典型场景优化议 | 场景 | 优化措施 | |---------------------|--------------------------------------------------------------------------| | **高频范围查询** | 行键按查询顺序设计 + 开启`PrefixFilter` + 增大`Scan.setCaching` | | **实时点查** | 布隆过滤器(ROW) + 调整`BlockCache` > 0.5 | | **批量写入** | 禁用WAL(`Put.setDurability(0)`) + 批量`Put(List)` + 压缩算法(LZ4) | | **时序数据存储** | 时间戳倒序写入 + Cold Region归档 + 冷热数据分离存储[^1] | > **监控工具**:通过`hbase shell`的`status 'detailed'`观察各RegionServer的请求延迟、缓存命中率,优先优化热点Region。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看不见的罗辑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值