1.GC Dump文件获取
(1)修改GC配置,手动启动region server
(2)启动脚本
87机器
-减少heap size
注意dump文件较大,脚本可能跑不起来,需要减少regionserver heap memory
配置方式也在hbase-env.sh当中
-切换用户
-重启region server
-查看regionserver进程
-运行脚本
-记录运行结果
得到
java_pidxxxxx.hprof
2.分析Dump文件
使用Eclipse的工具(可以单独下载)Eclipse Memory Analyzer(EMA)分析:
分析上图,不难看出Coprocessor占据了JVM内存的95%以上
通过上面两个结果,可以看出,主要的内存消耗出现在
内含的
的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,继续执行,发现其他的异常:
参考了:http://stackoverflow.com/questions/32329127/elasticsearch-java-bulk-upsert-exception 两个答案的解决方法
重新打包,测试,根据打出的日志,可以看出更新请求成功了
注意:
1. 我们在测试代码中,使用 addTransportAddress时,使用了两个端口:1092 和 1093.
代码对 1092这个配置 会继续抛出异常:
这个时配置错误导致的,1092端口是http端口,Java API使用的是1093 这个 TCP端口,删除错误后,异常消失。
2. 对于这个Timer,我们删掉之后,可能存在一定问题,
但是缓冲区最多10个请求,如果是统计用途,大数据量可以忽略