hadoop2.7集羣,新增datanode節點後報錯的解決思路

咱們的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 ,此次再也不報錯了。能夠正常執行結束。

相關文章
相關標籤/搜索