版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwlhz/article/details/79931211
Hbase thrift 1 问题汇总
Hbase thrift 启动线程池:./bin/hbase thrift start -threadpool , 报下面的错误:
Exception in thread "thrift-worker-103" java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:713)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.processWorkerExit(ThreadPoolExecutor.java:1017)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1163)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
原因:
系统线程数太少,增加nproc线程数
修改/etc/security/limits.conf 中指定用户的线程最大个数
* soft nofile 65536
* hard nofile 65536
xxx soft nproc 65535
xxx hard nproc 65535
xxx soft stack 1024
xxx hard stack 1024
xxx是hbase运行的用户。
同时可以调整服务所占内存的最小/最大值,具体数值根据硬件配置而定。
修改hbase/conf/hbase-env.sh配置文件:
export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx20g -Xms10g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70"
export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx20g -Xms10g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"
export HBASE_THRIFT_OPTS="$HBASE_THRIFT_OPTS $HBASE_JMX_BASE -Xms10g -Xmx20g"
export HBASE_HEAPSIZE=8000
这里把Master、Region Server、Thrift的内存大小都改为:10g、20g
堆大小改为80g
把所有的hbase节点都做了同样的修改。
重启服务后,问题解决。可以通过ps -ef | grep master进程号 看到内存确实由之前的默认1g改为10g了。
Thrift服务启动有两种方式:
1. 每个节点上启动thrift服务
./bin/hbase-daemon.sh start thrift
- 仅在Master上启动线程池服务
./bin/hbase thrift start -threadpool
由于系统Hbase集群节点数很多,第二种方式更简单些
其他的优化配置还包括:超时时间间隔、最小/最大 thrift工作线程等,都在hbase-site.xml中:
<property>
<name>hbase.regionserver.handler.count</name>
<value>400</value>
</property>
<property>
<name>hbase.thrift.minWorkerThreads</name>
<value>1000</value>
</property>
<property>
<name>hbase.thrift.maxWorkerThreads</name>
<value>2000</value>
</property>
<property>
<name>hbase.thrift.server.socket.read.timeout</name>
<value>6000000</value>
<description>eg:milisecond</description>
</property>
<property>
<name>hbase.regionserver.thrift.maxreadlength</name>
<value>0</value>
<description>0:not check data length</description>
</property>
其他优化,还需要调整系统的打开文件数、栈大小等。
ulimit -a
参考:
https://blog.csdn.net/wolf_soul/article/details/62045732