RegionServer功能职责

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/JavaMan_chen/article/details/47334729

RegionServer功能职责

租约管理

HBase的租约管理功能主要应用在scan查询上,如果客户端执行scan操作以后,在60秒内没有将Scanner进行关闭,也没有显示的将租约移除,这时查询租约将会过期,RegionServer会强行关闭与之对应的Scanner,来防止无效连接数过多的情况发生。查询租约的过期时间可通过hbase.client.scanner.timeout.period参数来声明,默认为60秒。

在功能实现上租约管理逻辑主要是通过Leases类来封装的,其对内声明了如下数据结构用于存储所有的租约信息(租约信息通过Lease对象来封装)

leases : Map<String, Lease>

同时其还对外声明了createLease和cancelLease方法用于向leases集合中添加/删除租约。Leases线程启动后,其会循环遍历leases集合,一旦发现有租约已经过期,便通知其LeaseListener进行回调处理。而Lease对象主要实现了java的Delayed接口,可通过其getDelay方法来返回当前租约还有多久过期。

Nonce管理

客户端提交RPC申请之后,如果服务端的响应超时,其会将该申请重新发送,直至重试次数达到指定参数值之后,在退出申请逻辑。经过这样处理之后,服务端有可能出现如下问题:

拿append操作举例,原本客户端只想添加一条KeyValue数据到数据库中,但由于服务端的响应超时,会导致append申请重复多次发送,造成的结果是目标数据在服务端被多次添加,出现append操作冗余的情况。

为了防止该情况发生,HBase对外声明了nonce管理功能(通过ServerNonceManager类),客户端的每次申请及重复申请使用同一个nonce进行描述,发送到服务端以后,服务端会首先判断该nonce是否存在,如果不存在则可放心执行nonce所对应操作(如append或increment)。否则需要根据当前nonce的状态进行相应的回调处理:

  • 如果nonce处于WAIT状态,表明该nonce所对应的操作正在被执行,当前线程需等待其执行结束,在根据其执行结果做进一步的处理;

  • 如果nonce处于PROCEED状态,表明该nonce所对应的操作已经被执行,只不过执行结果以失败而告终,因此在这里可重新执行;

  • 如果nonce处于DONT_PROCEED状态,表明该nonce所对应的操作已经成功被执行,这里无需在做处理。

因此,当nonce进入DONT_PROCEED状态以后,所有通过它来执行的操作都将被忽略掉,从而防止了操作冗余的情况发生。需要注意的是当nonce计入DONT_PROCEED或PROCEED状态后,其可存活的时间是受参数控制的(hbase.server.hashNonce.gracePeriod),默认为30分钟。30分钟之后,ServerNonceManager会将该nonce进行删除,通过其cleanUpOldNonces方法。

堆内存监控

  1. 当用于MemStore和BlockCache的堆内存百分比达到80%时,系统将会抛出异常。

    因此在设置相关参数时,应满足如下判断条件:

    hfile.block.cache.size + hbase.regionserver.global.memstore.size <= 0.8

  2. 堆内存的使用空间达到95%时,系统将会打印警告信息

    95%的参数值是通过hbase.heap.occupancy.low_water_mark来设置的,相关警告信息如下:

    heapOccupancyPercent is above heap occupancy alarm watermark

  3. 弹性调整MemStore和BlockCache的空间比例,但总大小不能大于堆内存的80%

    当指定如下4个参数时,RegionServer会根据当前堆内存的使用情况对MemStore和BlockCache的大小做动态调整(通过HeapMemoryTuner来实现)。

    memstore弹性空间:[hbase.regionserver.global.memstore.size.min.range, hbase.regionserver.global.memstore.size.max.range]

    blockcache弹性空间:[hfile.block.cache.size.min.range,hfile.block.cache.size.max.range]

  4. 监控因GC所导致的应用暂停时间

    如果暂停时间大于1秒(jvm.pause.info-threshold.ms参数控制),打印如下输出信息:

    Detected pause in JVM or host machine (eg GC): pause of approximately...

    如果暂停时间大于10秒(jvm.pause.warn-threshold.ms参数控制),同样打印上面的输出信息,只不过信息级别为WARN。具体的监控逻辑可参考org.apache.hadoop.hbase.util.JvmPauseMonitor.Monitor类的实现(HADOOP-9618)。

健康检测

RegionServer进程启动以后,会在后台开启HealthCheckChore线程,默认情况下会每隔10秒钟对RegionServer进行一次健康检测,看其是否处于健康状态,检测周期是通过hbase.node.health.script.frequency参数来声明的。

在检测过程中主要是执行hbase.node.health.script.location参数对应的脚本(示例脚本可参考hbase-examples/src/main/sh/healthcheck/healthcheck.sh),如果脚本在执行过程中出现以下异常情况:

(1)脚本执行的返回值不为0;

(2)脚本执行超时(超时时间通过hbase.node.health.script.timeout参数设置,默认为60秒);

(3)脚本执行过程中,打印了以ERROR开头的文字信息;

则RegionServer的健康检测将以失败而告终。而如果HealthCheckChore线程在循环过程中出现了3次(hbase.node.health.failure.threshold参数控制)健康检测失败的情况,并且前后两次失败的时间间隔小于30秒,其会认为RegionServer没有处于健康状态,会强行将其关闭,并打印如下信息:

The node reported unhealthy {threshold} number of times consecutively.

30秒的时间间隔是通过如下方式计算得出的:

hbase.node.health.script.frequency * hbase.node.health.failure.threshold

展开阅读全文

hbase regionserver启动失败

07-31

三台主机:rn192.168.1.121 sp.soft.pc1 作为主机masterrn192.168.1.122 sp.soft.pc2rn192.168.1.123 sp.soft.pc3rn搭建了hadoop集群,zookeeper集群,启动后各服务后进程如下:rn[img=https://img-bbs.csdn.net/upload/201807/31/1533028510_624154.png][/img]rnrn在sp.soft.pc1下启动hbase,结果如下:rn[img=https://img-bbs.csdn.net/upload/201807/31/1533028465_520977.png][/img]rn另外两台机器中的hregionserver启动后很快就停止了,查看日志有如下错误:rn2018-07-31 16:53:12,908 ERROR [regionserver/sp:16020] regionserver.HRegionServer: pache/hadoop/fs/ContentSummary; @98: invokestaticrn Reason:rn Type 'org/apache/hadoop/fs/ContentSummary$Builder' (current frame, stack[1]) is not assignable to 'org/apache/hadoop/fs/QuotaUsage$Builder'rn Current Frame:rn bci: @98rn flags: rn locals: 'org/apache/hadoop/hdfs/protocol/proto/HdfsProtos$ContentSummaryProto', 'org/apache/hadoop/fs/ContentSummary$Builder' rn stack: 'org/apache/hadoop/hdfs/protocol/proto/HdfsProtos$StorageTypeQuotaInfosProto', 'org/apache/hadoop/fs/ContentSummary$Builder' rn Bytecode:rn 0x0000000: 2ac7 0005 01b0 bb03 4159 b703 424c 2b2arn 0x0000010: b603 43b6 0344 2ab6 0345 b603 462a b603rn 0x0000020: 47b6 0348 2ab6 0349 b603 4a2a b603 4bb6rn 0x0000030: 034c 2ab6 034d b603 4e2a b603 4fb6 0350rn 0x0000040: 2ab6 0351 b603 522a b603 53b6 0354 2ab6rn 0x0000050: 0355 b603 5657 2ab6 0357 9900 0b2a b603rn 0x0000060: 582b b803 592b b603 5ab0 rn Stackmap Table:rn same_frame(@6)rn append_frame(@101,Object[#2149])rn *****rnjava.lang.VerifyError: Bad type on operand stackrn..................................rn2018-07-31 16:53:13,146 ERROR [main] regionserver.HRegionServerCommandLine: Region server exitingrnjava.lang.RuntimeException: HRegionServer Abortedrn at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:67)rn at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)rn at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)rn at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)rn at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:2968)rnrnrn日志内容太多,没有完全贴出来。有哪位大神来瞅瞅,我这是反了什么低级错误导致的。rn 论坛

没有更多推荐了,返回首页