一次对HBase协处理器的内存耗尽问题的GC分析和解决

1.GC Dump文件获取

(1)修改GC配置,手动启动region server

 
 
1
2
3
4
5
6
cd  / etc / hbase / conf /  
vim  hbase - env. sh
#export SERVER_GC_OPTS="verbose:gc -XX....""-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath
=/var/log/hbase/"
: wq
cd  / usr / lib / hbase / bin /
. / hbase - daemon. sh  -- config  / etc / hbase / conf  start  regionserver

(2)启动脚本

87机器

-减少heap size

注意dump文件较大,脚本可能跑不起来,需要减少regionserver heap memory

配置方式也在hbase-env.sh当中

-切换用户

 
 
su  -  hbase

-重启region server

 
 
cd  / usr / lib / hbase / bin /
. / hbase - daemon. sh  -- config  / etc / hbase / conf  restart  regionserver  

-查看regionserver进程

 
 
ps  - ef| grep  hbase

-运行脚本

 
 
cd  ~/ zhangs /
python  large. py  

-记录运行结果

 得到

 java_pidxxxxx.hprof

2.分析Dump文件

使用Eclipse的工具(可以单独下载)Eclipse Memory Analyzer(EMA)分析:

分析上图,不难看出Coprocessor占据了JVM内存的95%以上

 

 

 

通过上面两个结果,可以看出,主要的内存消耗出现在


  
  
org. elasticsearch. action. bulk. BulkRequest  

内含的


  
  
org. elasticsearch. action. update. UpdateRequest  

的ArrayList当中

3.增加代码的测试方法

可能是Elasticsearch写不进去导致的,增加测试index到es的测试代码,得到异常:

org.elasticsearch.client.transport.NoNodeAvailableException: None of the configured nodes are available: []
at org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305)
at org.elasticsearch.client.transport.TransportClientNodesService.execute(TransportClientNodesService.java:200)
at org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106)
at org.elasticsearch.client.support.AbstractClient.bulk(AbstractClient.java:167)
at org.elasticsearch.client.transport.TransportClient.bulk(TransportClient.java:370)
at org.elasticsearch.action.bulk.BulkRequestBuilder.doExecute(BulkRequestBuilder.java:166)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:91)
at org.elasticsearch.action.ActionRequestBuilder.execute(ActionRequestBuilder.java:65)
at com.gavin.observer.ElasticSearchOperator.bulkRequest(ElasticSearchOperator.java:55)
at com.gavin.observer.ElasticSearchOperator.access$100(ElasticSearchOperator.java:23)
at com.gavin.observer.ElasticSearchOperator$CommitTimer.run(ElasticSearchOperator.java:108)
at java.util.TimerThread.mainLoop(Timer.java:555)
at java.util.TimerThread.run(Timer.java:505)

4.增加日志 

我们在每次操作缓存ConcurrentHashMap的上锁前和解锁后,都增加了log

发现:

1.一个注释为“定时任务,避免RegionServer迟迟无数据更新,导致ElasticSearch没有与HBase同步”的Timer

这个Timer在调度后,会打断最终一个提交给ES的request,产生上面的异常

我们注释掉了这个Timer,继续执行,发现其他的异常:

 
 
1
org. elasticsearch. action. actionrequestvalidationexception  validation  failed  1  script  or  doc  is  missing

参考了:http://stackoverflow.com/questions/32329127/elasticsearch-java-bulk-upsert-exception 两个答案的解决方法

重新打包,测试,根据打出的日志,可以看出更新请求成功了

 

注意:

1. 我们在测试代码中,使用 addTransportAddress时,使用了两个端口:1092 和 1093.

代码对 1092这个配置 会继续抛出异常:

 
 
16 / 06 / 28  17: 15: 48  INFO  client. transport[ Grenade ]  failed  to  get  node  info  for  [# transport# - 1 ] [ byd0151
] [ inet [ / 192.168.0.160: 1092 ]]disconnecting...
org. elasticsearch. transport. ReceiveTimeoutTransportException[ ] [ inet [ / 192.168.0.160: 1092 ]] [ cluster
: monitor / nodes / info ]  request_id  [ 2 ]  timed  out  after  [ 5000 ms ]
         at  org. elasticsearch. transport. TransportService $TimeoutHandler. run ( TransportService. java: 529 )
         at  java. util. concurrent. ThreadPoolExecutor. runWorker ( ThreadPoolExecutor. java: 1142 )
         at  java. util. concurrent. ThreadPoolExecutor $Worker. run ( ThreadPoolExecutor. java: 617 )
         at  java. lang. Thread. run ( Thread. java: 745 )

 这个时配置错误导致的,1092端口是http端口,Java API使用的是1093 这个 TCP端口,删除错误后,异常消失。

 2. 对于这个Timer,我们删掉之后,可能存在一定问题,

但是缓冲区最多10个请求,如果是统计用途,大数据量可以忽略


 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值