hbase——1.基础

HBase是一种高可靠性、高性能、面向列的分布式存储数据库,运行于HDFS之上,使用Zookeeper作为协调工具。本文对比了HBase与关系型数据库在数据类型、操作、存储模式、索引、维护和扩展方面的区别,并介绍了HBase的访问接口、数据模型和功能组件。

hbase:高可靠型、高性能、面向列、可伸缩的分布式存储数据库,

hbase运行于hdfs之上,使用zookeeper作为协调工具。

 

与关系型数据库对比:

1.数据类型方面

关系型数据库有很多数据类型(int,char等),hbase只有字符串。

2.数据操作方面

关系型数据库定义了非常多的操作。

如表间的连接操作,关系型数据库效率很低;而hbase存在一张表中不需要连接,提升了效率。

3.存储模式方面

关系数据库基于行存储,hbase基于列存储。

如果企业事务型操作比较多,按行存储比较好,因为经常要插入一条条数据;

如何企业以分析型为主,那么按列存储比较好。

比如分析超市购物表的年龄分布,按行存储的表要扫描所有的行,再拿到年龄列的值;

而按列存储的表直接拿出年龄那一列即可。

4.数据索引方面

关系数据库可以构建很多索引,行索引、列索引,精准定位。

hbase在原始设计上只支持对行的简单索引。

5.数据维护方面

更新数据时,关系型数据库旧值会被新值覆盖,hbase都会保留着。

6.扩展方面

关系型数据库很难水平扩展;最多提升机器性能(增加磁盘等)来纵向扩展。

hbase基于集群、hdfs,水平扩展性能非常好。

 

hbase访问接口:

1.java接口:最常规和高效的方式,适合mapreduce批处理表数据

2.shell接口:命令行工具,最简单的接口

3.sql接口:hive的类sql语言、pig的Latin流式编程语言

4.其他:Thrift Gateway、REST Gateway等

 

hbase数据模型:

行键RowKey(行)、列限定符Column(列)、列族Column Family

(列族是hbase存储的基本单元,包含多个列)

单元格内的值都是字符串类型,需要我们自己解析(如解析成整形)

时间戳Timestamp(64位整数,标识新旧版本的)

通过行键、列族、列、时间戳四个维度来定位数据。

逻辑数据模型:

物理模型:

 

hbase功能组件:

库函数:用于链接客户端,客户端通过库函数访问hbase数据库

Master服务器:管理Region服务器

1.对分区信息进行维护和管理

2.Master中有region服务器列表,可以看到有哪些region服务器在工作,哪些故障。

3.负责对region进行分配

如一个表进行分区,分成多个region,每个region分到哪个region服务器

4.负责负责均衡

比如有一个region服务器负载很重,另一个很轻,把他们均衡一下

Region服务器:负责存储表的每个不同region

 

表和region:

表越来越大就需要分区,分成多个region

region大小最佳为1G到2G,取决于机器性能

对于同一个region,它是绝不会比拆分到不同的region服务器上去的。

 

表region的定位:

通过三层架构来寻址:zookeeper文件、ROOT表、META表

zookeeper记录ROOT表的位置信息;(ROOT表只有一个分区)

ROOT表记录了META表的相关region信息;(META表是分区的,有多个分区)

META表记录了用户数据表的region信息;(我们自己的表也是分区的,有多个分区)

 

hbase运行机制:

客户端:访问hbase,直接跟region服务器打交道

客户端缓存着已访问过的regin服务器地址,方便下次访问,cache。

region服务器:我们的表很大,会分区,region服务器存放表的分区region

master服务器:管理region服务器

master可以启动多个HMaster,通过zookeeper的选举机制只运行一个。

zookeeper服务器:协同管理

zookeeper在hbase中提供管家的功能,维护和管理整个hbase集群,

zookeeper存储ROOT表来定位region;

zookeeper保证只有一个master运行hmaster,监视HLog,出现故障通知master。

region服务器(详细):

一个region服务器中存放多个region,每个region又会存放多个列族store,

(hbase存储数据以列族为单位,按列族切分,每个列族构成一个store)

列族store中的数据先写入缓存MemStore,缓存满了再写入磁盘StoreFile,

StoreFile是hbase的表示形式,借助Hdfs来存储,也就是hdfs文件HFile。

所有region公用一个日志HLog,zookeeper监视它。

 

在华为云平台跑spark任务报错 Caused by: org.apache.hadoop.hbase.client.RetriesExhaustedException: Failed after attempts=36, exceptions: 2025-08-25T07:01:50.340Z, java.net.SocketTimeoutException: callTimeout=60000, callDuration=60108: Call to address=node-ana-orderaddyqhe/25.213.25.20:16020 failed on local exception: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call[id=5,methodName=Scan], waitTime=60005ms, rpcTimeout=59999ms row '04202508200' on table 'rmc:vs_cust_voltrate_day' at region=rmc:vs_cust_voltrate_day,04202508098000000069179115,1756088418368.de6c9f38dbdf5f4a282d305ccd4375a8., hostname=node-ana-orderaddyqhe,16020,1754979845078, seqNum=4835966 at org.apache.hadoop.hbase.client.RpcRetryingCallerWithReadReplicas.throwEnrichedException(RpcRetryingCallerWithReadReplicas.java:299) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:253) at org.apache.hadoop.hbase.client.ScannerCallableWithReplicas.call(ScannerCallableWithReplicas.java:59) at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithoutRetries(RpcRetryingCallerImpl.java:200) at org.apache.hadoop.hbase.client.ClientScanner.call(ClientScanner.java:281) at org.apache.hadoop.hbase.client.ClientScanner.loadCache(ClientScanner.java:462) at org.apache.hadoop.hbase.client.ClientScanner.nextWithSyncCache(ClientScanner.java:324) at org.apache.hadoop.hbase.client.ClientScanner.next(ClientScanner.java:637) at org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:244) at org.apache.hadoop.hbase.mapreduce.TableRecordReader.nextKeyValue(TableRecordReader.java:133) at org.apache.hadoop.hbase.mapreduce.TableInputFormatBase$1.nextKeyValue(TableInputFormatBase.java:218) at org.apache.spark.rdd.NewHadoopRDD$$anon$1.hasNext(NewHadoopRDD.scala:247) at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458) at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458) at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458) at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458) at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:458) at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:511) at org.apache.spark.sql.execution.UnsafeExternalRowSorter.sort(UnsafeExternalRowSorter.java:201) at org.apache.spark.sql.execution.exchange.ShuffleExchangeExec$.$anonfun$prepareShuffleDependency$10(ShuffleExchangeExec.scala:343) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2(RDD.scala:897) at org.apache.spark.rdd.RDD.$anonfun$mapPartitionsInternal$2$adapted(RDD.scala:897) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:373) at org.apache.spark.rdd.RDD.iterator(RDD.scala:337) at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:373) at org.apache.spark.rdd.RDD.iterator(RDD.scala:337) at org.apache.spark.shuffle.ShuffleWriteProcessor.write(ShuffleWriteProcessor.scala:59) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:99) at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:52) at org.apache.spark.scheduler.Task.run(Task.scala:131) at org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:505) at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1617) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:508) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: java.net.SocketTimeoutException: callTimeout=60000, callDuration=60108: Call to address=node-ana-orderaddyqhe/25.213.25.20:16020 failed on local exception: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call[id=5,methodName=Scan], waitTime=60005ms, rpcTimeout=59999ms row '04202508200' on table 'rmc:vs_cust_voltrate_day' at region=rmc:vs_cust_voltrate_day,04202508098000000069179115,1756088418368.de6c9f38dbdf5f4a282d305ccd4375a8., hostname=node-ana-orderaddyqhe,16020,1754979845078, seqNum=4835966 at org.apache.hadoop.hbase.client.RpcRetryingCallerImpl.callWithRetries(RpcRetryingCallerImpl.java:167) at org.apache.hadoop.hbase.client.ResultBoundedCompletionService$QueueingFuture.run(ResultBoundedCompletionService.java:80) ... 3 more Caused by: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call to address=node-ana-orderaddyqhe/25.213.25.20:16020 failed on local exception: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call[id=5,methodName=Scan], waitTime=60005ms, rpcTimeout=59999ms at org.apache.hadoop.hbase.ipc.IPCUtil.wrapException(IPCUtil.java:217) at org.apache.hadoop.hbase.ipc.AbstractRpcClient.onCallFinished(AbstractRpcClient.java:398) at org.apache.hadoop.hbase.ipc.AbstractRpcClient.access$100(AbstractRpcClient.java:97) at org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:429) at org.apache.hadoop.hbase.ipc.AbstractRpcClient$3.run(AbstractRpcClient.java:425) at org.apache.hadoop.hbase.ipc.Call.setTimeout(Call.java:111) at org.apache.hadoop.hbase.ipc.RpcConnection$1.run(RpcConnection.java:199) at org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer$HashedWheelTimeout.expire(HashedWheelTimer.java:669) at org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer$HashedWheelBucket.expireTimeouts(HashedWheelTimer.java:744) at org.apache.hbase.thirdparty.io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:469) ... 1 more Caused by: org.apache.hadoop.hbase.ipc.CallTimeoutException: Call[id=5,methodName=Scan], waitTime=60005ms, rpcTimeout=59999ms at org.apache.hadoop.hbase.ipc.RpcConnection$1.run(RpcConnection.java:200) ... 4 more
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值