我们的hadoop是2.7版本的,取得当时最新的版本,唉,不稳定呀,中间波折好多。
当前集群是1个namenode,4个datanode。服务器是虚拟机,配置太差,需要增加节点。
悲催的hadoop集群,我同时增加了3个datanode节点,原来集群有4个数据节点,可能因为加的太多了,执行balancer的时候,很快将服务器资源耗尽了。
查了一下,服务器上设置了进程最大个数是1024个,而balancer在执行的时候会启动native进程,因为需要执行的balance操作太多,集群会不断的启动本地进程,将进程数耗尽。连ps 命令都不好使了,幸好我之前记下了balancer的进程号,终于kill掉。出错信息日志如下:
2015-09-11 20:04:11,175 WARN org.apache.hadoop.hdfs.LeaseRenewer: Failed to renew lease for [DFSClient_NONMAPREDUCE_880883068_1] for 73 seconds. Will retry shortly ...
java.io.IOException: com.google.protobuf.ServiceException: java.lang.OutOfMemoryError: unable to create new native thread
at org.apache.hadoop.ipc.ProtobufHelper.getRemoteException(ProtobufHelper.java:47)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.renewLease(ClientNamenodeProtocolTranslatorPB.java:592)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187)
at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102)
at com.sun.proxy.$Proxy12.renewLease(Unknown Source)
at org.apache.hadoop.hdfs.DFSClient.renewLease(DFSClient.java:891)
at org.apache.hadoop.hdfs.LeaseRenewer.renew(LeaseRenewer.java:417)
at org.apache.hadoop.hdfs.LeaseRenewer.run(LeaseRenewer.java:442)
at org.apache.hadoop.hdfs.LeaseRenewer.access$700(LeaseRenewer.java:71)
at org.apache.hadoop.hdfs.LeaseRenewer$1.run(LeaseRenewer.java:298)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.protobuf.ServiceException: java.lang.OutOfMemoryError: unable to create new native thread
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:243)
at com.sun.proxy.$Proxy11.renewLease(Unknown Source)
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.renewLease(ClientNamenodeProtocolTranslatorPB.java:590)
... 12 more
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:714)
at java.util.concurrent.ThreadPoolExecutor.addWorker(ThreadPoolExecutor.java:949)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1371)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
at org.apache.hadoop.ipc.Client$Connection.sendRpcRequest(Client.java:1022)
at org.apache.hadoop.ipc.Client.call(Client.java:1449)
at org.apache.hadoop.ipc.Client.call(Client.java:1407)
at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:229)
... 14 more
思路一:尝试了调整balancer的threshold,据网上说,该值是0~100。按照90、80、70、50、30、10的顺序执行,这样一点一点的balance,会不会好一点,实际使用后,发现大于10的一律不好使,所以这个方法也行不通了。失败!
思路二:是否是因为突然间增加了三个节点,hadoop的后台balancer的内容太多(当前数据量是370G,绝大多数都是hbase文件)。那我就一个节点一个节点的增加,会不会好一点?于是,我又把三台中的两台的节点去掉了,只剩下一台后,执行balancer。好吧,刚开始以为可行,结果跑了大概几分钟之后,同样的问题又出现了。。。失败!
后来发现新加的主机和原有的hadoop的主机时区设置不一样,改为中国上海时区后,还是出下面的问题。不过时区设置肯定要设置的,算是提前避免了另外一个隐藏的问题吧。
思路三:由于服务器使用的是vm,配置不是很高,所以一直不想改系统参数来调优,如果把参数值调高,linux的使用效率增加,同时也可能这个vm主机承受不住,造成系统宕机。但是没办法了,执行ulimit -a,查看结果中的“max user processes (-u) 1024”,
执行vi /etc/security/limits.d/90-nproc.conf,修改将1024改为5120,保存退出即可。
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
* soft nproc 1024
root soft nproc unlimited
然后执行start-balancer.sh threshold 5 ,这次不再报错了。可以正常执行结束。