咱们的hadoop是2.7版本的,取得当时最新的版本,唉,不稳定呀,中间波折好多。java
当前集群是1个namenode,4个datanode。服务器是虚拟机,配置太差,须要增长节点。node
悲催的hadoop集群,我同时增长了3个datanode节点,原来集群有4个数据节点,可能由于加的太多了,执行balancer的时候,很快将服务器资源耗尽了。linux
查了一下,服务器上设置了进程最大个数是1024个,而balancer在执行的时候会启动native进程,由于须要执行的balance操做太多,集群会不断的启动本地进程,将进程数耗尽。连ps 命令都很差使了,幸亏我以前记下了balancer的进程号,终于kill掉。出错信息日志以下:apache
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 threadide
at org.apache.hadoop.ipc.ProtobufHelper.getRemoteException(ProtobufHelper.java:47)oop
at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.renewLease(ClientNamenodeProtocolTranslatorPB.java:592)google
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)spa
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 ,此次再也不报错了。能够正常执行结束。