Hadoop問題集
1、問題:
hadoop安裝完以后,在執(zhí)行命令時,經(jīng)常會提示一下警告:
- WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform...
- using builtin-java classes where applicable
原因:
這個跟系統(tǒng)位數(shù)有關系,我們平常使用的是Centos 6.5 64位操作系統(tǒng)。
解決辦法:
(1)如果你是hadoop2.6的可以下載下面這個:
http://dl.bintray.com/sequenceiq/sequenceiq-bin/hadoop-native-64-2.6.0.tar
(2)下載完以后,解壓到hadoop的native目錄下,覆蓋原有文件即可。操作如下:
- tar -x hadoop-native-64-2.4.0.tar -C hadoop/lib/native/
2、hadoop HA namenode 無法啟動錯誤
問題:
- 2014-12-15 14:27:55,224 INFO org.apache.hadoop.hdfs.server.namenode.FSImage: No edit log streams selected.
- 2014-12-15 14:27:55,300 ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile(file=/usr/hadoop/tmp/dfs/name/current/fsimage_0000000000000030732, cpktTxId=0000000000000030732)
- java.io.IOException: Premature EOF from inputStream
- at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:194)
- at org.apache.hadoop.hdfs.server.namenode.FSImageFormat$LoaderDelegator.load(FSImageFormat.java:221)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:913)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:899)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImageFile(FSImage.java:722)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:660)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:279)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:955)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:700)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:529)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:585)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:751)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:735)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1407)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)
- 2014-12-15 14:27:55,438 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Encountered exception loading fsimage
- java.io.IOException: Failed to load an FSImage file!
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:671)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:279)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:955)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:700)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:529)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:585)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:751)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:735)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1407)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)
- 2014-12-15 14:27:55,440 INFO org.mortbay.log: Stopped HttpServer2$SelectChannelConnectorWithSafeStartup@HM0:50070
- 2014-12-15 14:27:55,540 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Stopping NameNode metrics system...
- 2014-12-15 14:27:55,541 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system stopped.
- 2014-12-15 14:27:55,541 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: NameNode metrics system shutdown complete.
- 2014-12-15 14:27:55,541 FATAL org.apache.hadoop.hdfs.server.namenode.NameNode: Exception in namenode join
- java.io.IOException: Failed to load an FSImage file!
- at org.apache.hadoop.hdfs.server.namenode.FSImage.loadFSImage(FSImage.java:671)
- at org.apache.hadoop.hdfs.server.namenode.FSImage.recoverTransitionRead(FSImage.java:279)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFSImage(FSNamesystem.java:955)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.loadFromDisk(FSNamesystem.java:700)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.loadNamesystem(NameNode.java:529)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:585)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:751)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.(NameNode.java:735)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1407)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1473)
原因:
查看文件大小 fsimage_0000000000000030732 大小為0,而在另一臺服務器長度不為0,是這個fsimage文件的問題
解決:
可以從另一臺服務器上拷貝該文件,或者刪除這個文件及對應的md5文件即可。
建議從其他機器拷貝fsimage文件
3、設置conbinner注意事項
問題:
在使用combiner的時候,出現(xiàn)IntWritable is not Text,或者其他的類型不匹配問題
原因:
這是設置combiner的時候,map輸出的keyvalue類型和combiner輸出的keyvalue類型不一致導致的。
解決:
如果設置combiner,必須保證一點,map輸出的keyvalue類型和combiner輸出的keyvalue類型必須一致!!!
4、error:server IPC version 9 cannot communicate with client version 4
問題:
error:server IPC version 9 cannot communicate with client version 4
原因:
(1)如果是在使用插件操作hdfs時報錯,是因為,eclipse插件和eclipse的版本不匹配
(2)如果是在執(zhí)行mapreduce時報錯:是因為jar包不匹配
解決:
重新編譯hadoop插件,使用自己的hadoop和eclipse版本
5、Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
問題:
Could not locate executable null\bin\winutils.exe in the Hadoop binaries.
原因:
在使用hadoop插件的時候,會在本地找winutils.exe這個文件,而這個文件是hadoop安裝包下的文件,必須配置eclipse插件的hadoop的windows本地路徑才行。
解決:
配置windows的hadoop環(huán)境變量,并且重啟機器,讓環(huán)境變量生效
6、問題:Shuffle Error: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
原因:
程序里面需要打開多個文件,進行分析,系統(tǒng)一般默認數(shù)量是1024,(用ulimit -a可以看到)對于正常使用是夠了,但是對于程序來講,就太少了。
解決:
修改2個文件。
/etc/security/limits.conf
- vi /etc/security/limits.conf
加上:
- * soft nofile 102400
- * hard nofile 409600
- $cd /etc/pam.d/
- $sudo vi login
添加session required /lib/security/pam_limits.so
7、問題:Too many fetch-failures
原因:
出現(xiàn)這個問題主要是結點間的連通不夠全面。
解決:
1) 檢查/etc/hosts
要求本機ip對應服務器名
要求要包含所有的服務器ip+服務器名
2) 檢查 .ssh/authorized_keys
要求包含所有服務器(包括其自身)的public key
8、問題:處理速度特別的慢 出現(xiàn)map很快 但是reduce很慢 而且反復出現(xiàn) reduce=0%
解決:
修改 conf/hadoop-env.sh 中的export HADOOP_HEAPSIZE=4000
9、問題:能夠啟動datanode,但無法訪問,也無法結束的錯誤
原因:
可能原因很多,需要查看日志定位,可能的原因是namespaceId不一致
解決:
(1)刪除namenode的本地文件夾:${hadoop}/namedir/*
(2)刪除datanode的本地文件夾:${hadoop}/datadir/*
(3)重新格式化
(4)注意:刪除是個很危險的動作,不能確認的情況下不能刪除!!做好刪除的文件等通通備份!!
10、問題:java.io.IOException: Could not obtain block: blk_194219614024901469_1100 file=/user/hive/warehouse/src_20090724_log/src_20090724_log
原因:
出現(xiàn)這種情況大多是結點斷了,沒有連接上。
解決:
檢查datanode是否有宕機情況,恢復
11、問題:java.lang.OutOfMemoryError: Java heap space
原因:
出現(xiàn)這種異常,明顯是jvm內存不夠得原因,要修改所有的datanode的jvm內存大小。
解決:
執(zhí)行命令
- Java -Xms1024m -Xmx4096m
一般jvm的***內存使用應該為總內存大小的一半,我們使用的8G內存,所以設置為4096m,這一值可能依舊不是***的值。
12、問題:單個node新加硬盤
原因:
datanode的硬盤不夠用了
解決:
(1)修改需要新加硬盤的node的dfs.data.dir,用逗號分隔新、舊文件目錄
(2)重啟dfs
13、問題:hdfs的namenode內存飆升,不夠用
原因:
可能是上傳了過多的小文件
解決:
用命令合并HDFS小文件
- hadoop fs -getmerge <src> <dest>
14、問題:hadoop OutOfMemoryError
解決:
- <property>
- <name>mapred.child.java.opts</name>
- <value>-Xmx800M -server</value>
- </property>
With the right JVM size in your hadoop-site.xml , you will have to copy this
to all mapred nodes and restart the cluster.
或者:
- hadoop jar jarfile [main class] -D mapred.child.java.opts=-Xmx800M
15、問題:Hadoop name -format后Incompatible namespaceIDS 錯誤解決辦法
Hadoop集群在namenode格式化(bin/hadoop namenode -format)后重啟集群會出現(xiàn)如下錯誤:
Incompatible namespaceIDS in ... :namenode namespaceID = ... ,datanode namespaceID=...
原因:
是格式化namenode后會重新創(chuàng)建一個新的namespaceID,以至于和datanode上原有的不一致。
解決:
(1)刪除datanode dfs.data.dir目錄(默認為tmp/dfs/data)下的數(shù)據(jù)文件,
(2)hadoop namenode -format
(3)修改/home/hadoop/data/current/VERSION 文件,把namespaceID修成與namenode上相同即可(log錯誤里會有提示)
另外的解決方案
(1)查看集群的所有的namespaceid
namenode:${hadoop}/namenode/current/VERSION
datanode:${hadoop}/data/current/VERSION
(2)找出和集群namespaceid不一樣的,改成一樣
16、問題:hadoop:RemoteException
啟動Hadoop集群測試HBase時候,發(fā)現(xiàn)三臺DataNode只啟動成功了兩臺,未啟動成功的那一臺日志中出現(xiàn)了下列異常:
- 2012-09-07 23:58:51,240 WARN org.apache.hadoop.hdfs.server.datanode.DataNode:
- DataNode is shutting down: org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.protocol.
- UnregisteredDatanodeException: Data node 192.168.100.11:50010 is attempting to report storage ID DS-1282452139-218.196.207.181-50010-1344220553439.
- Node 192.168.100.12:50010 is expected to serve this storage.
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getDatanode(FSNamesystem.java:4608)
- at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.processReport(FSNamesystem.java:3460)
- at org.apache.hadoop.hdfs.server.namenode.NameNode.blockReport(NameNode.java:1001)
- at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
- at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
- at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
- at java.lang.reflect.Method.invoke(Method.java:601)
- at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:563)
- at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1388)
- at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1384)
- at java.security.AccessController.doPrivileged(Native Method)
- at javax.security.auth.Subject.doAs(Subject.java:415)
- at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
- at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1382)
- at org.apache.hadoop.ipc.Client.call(Client.java:1070)
- at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:225)
- at $Proxy5.blockReport(Unknown Source)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.offerService(DataNode.java:958)
- at org.apache.hadoop.hdfs.server.datanode.DataNode.run(DataNode.java:1458)
- at java.lang.Thread.run(Thread.java:722)
原因:
兩臺DataNode的storageID出現(xiàn)了沖突,應該是因為我直接備份安裝的原因吧。
解決:
直接將出現(xiàn)異常的那臺機器的data目錄刪除!
17、問題:namenode無法啟動,不報錯
原因:
可能原因是:之前用root用戶啟動過,導致current文件夾的權限和所屬用戶更改了,需要更改回來
解決:
current文件夾位于hadoop安裝目錄同級目錄的tmp/dfs/namesecondary
18、問題:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platfo
- [root@db96 hadoop]# hadoop dfs -put ./in
- DEPRECATED: Use of this script to execute hdfs command is deprecated.
- Instead use the hdfs command for it.
- 14/07/17 17:07:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- put: `./in': No such file or directory
原因:
查看本地文件:
- [root@db96 hadoop]# file /usr/local/hadoop/lib/native/libhadoop.so.1.0.0
- /usr/local/hadoop/lib/native/libhadoop.so.1.0.0: ELF 32-bit LSB shared object,
- Intel 80386, version 1 (SYSV), dynamically linked, not stripped
是32位的hadoop,安裝在了64位的linux系統(tǒng)上。lib包編譯環(huán)境不一樣,所以不能使用。
解決:
重新編譯hadoop.就是重新編譯hadoop軟件。 (本例文是在從庫db99上編譯。你也可以在master db96上編譯 //只要機器的環(huán)境一直。)
參考手動編譯步驟:64位的linux裝的hadoop是32位的,需要手工編譯
http://blog.csdn.net/wulantian
19、Hadoop 報錯be replicated to 0 nodes, instead of 1
問題:
Hadoop 報錯be replicated to 0 nodes, instead of 1
原因
(1)namespaceid不相同
(2)沒有足夠的硬盤
解決
(1)停止datanode
(2)刪除datadir下所有數(shù)據(jù)。
(3)重啟datanode
20、The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe m
問題:
Hadoop集群啟動的時候一切正常,但一直處于safemode,只能讀不能寫,這種時候應該查看namenode的logs,當然這可能會出現(xiàn)不同的情況... :
- org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot delete /home/hadoop/tmp/mapred/system. Name node is in safe mode.
- The ratio of reported blocks 0.0000 has not reached the threshold 0.9990. Safe mode will be turned off automatically.
原因:
由日志可以看出無法刪除/home/hadoop/tmp/mapred/system.(其實這只是一種假象,往往我們會去糾結于這個目錄,其實不然)
解決:
(1):***辦法強制退出安全模式(safemode)
hadoop dfsadmin -safemode leave
這種方式雖然快,但會有遺留問題,我在用habse的時候就遇到過,很麻煩,然后你就用“hadoop fsck /”工具慢慢恢復吧。
(2):刪除namenode下/home/hadoop/tmp下的所有文件,重新format,當然這種方式非常暴力,因為你的數(shù)據(jù)完全木有了
(3):參考源碼可發(fā)現(xiàn)這個錯誤是在檢查file的時候拋出來的,基本也就是file的block丟失、錯誤等原因造成的。
這種情況在副本數(shù)為1的情況下會很棘手,其他的時候hadoop基本能自行解決,錯誤數(shù)很多的情況下就會一直處于safemode下,當然你關于集群修改配置文件后的分發(fā),本人寫了一個配置文件分發(fā)工具可以強制離開安全模式,先保證正常讀寫,然后再啟用“hadoop fsck /”工具慢慢修復。
21、Access denied for user 'root'@'hadoop1master' (using password: YES)
問題:
Access denied for user 'root'@'hadoop1master' (using password: YES)
原因:
沒有除本地用戶的其他用戶遠程連接
解決:
修改mysql表,將localhost修改為%
22、運行本地的wordcount報錯
(1)此時使用Run as->Java Application運行,會報如下類似錯誤:
- 2015-01-22 15:31:47,782 [main] WARN org.apache.hadoop.util.NativeCodeLoader (NativeCodeLoader.java:62) - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- 2015-01-22 15:31:47,793 [main] ERROR org.apache.hadoop.util.Shell (Shell.java:373) - Failed to locate the winutils binary in the hadoop binary path
- java.io.IOException: Could not locate executable D:\hbl_study\hadoop2\hadoop-2.6.0\bin\winutils.exe in the Hadoop binaries.
- at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:355)
- at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:370)
- ......
該錯誤是找不到winutils.exe,需要將winutils.exe拷貝到hadoop2.6.0/bin目錄下。
(2)再次運行報錯類似:
- Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
- at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
- at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)
- at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:977)
- ......
該錯誤是缺少hadoop.dll(hadoop2.6.0編譯的版本)文件,需要將hadoop.dll拷貝到hadoop2.6.0/bin目錄下。
再次運行沒有報錯。
23、在eclipse中運行hdfs的api報錯
問題:
運行api的時候報了權限問題,使用的用戶是hadoop,而我們想使用root用戶
原因:
配置環(huán)境變量中設置了HADOOP_USER_NAME=hadoop或者在run configuration中設置的-DHADOOP_USER_NAME=hadoop
解決:
將配置環(huán)境變量中設置成HADOOP_USER_NAME=root或者在run configuration中設置的-DHADOOP_USER_NAME=root
24、org.apache.hadoop.dfs.SafeModeException:Name node is in safe mode安全模式
運行hadoop程序時,有時候會報以下錯誤:
- org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
分析問題:
Hadoop的NameNode處在安全模式下。
那什么是Hadoop的安全模式呢?
在分布式文件系統(tǒng)啟動的時候,開始的時候會有安全模式,當分布式文件系統(tǒng)處于安全模式的情況下,文件系統(tǒng)中的內容不允許修改也不允許刪除,直到安全模式結束。
安全模式主要是為了系統(tǒng)啟動的時候檢查各個DataNode上數(shù)據(jù)塊的有效性,同時根據(jù)策略必要的復制或者刪除部分數(shù)據(jù)塊。
運行期通過命令也可以進入安全模式。在實踐過程中,系統(tǒng)啟動的時候去修改和刪除文件也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。
現(xiàn)在就清楚了,那現(xiàn)在要解決這個問題,我想讓Hadoop不處在safe mode模式下,能不能不用等,直接解決呢?
答案是可以的,只要在Hadoop的目錄下輸入:
解決方法:
- bin/hadoop dfsadmin -safemode leave
也就是關閉Hadoop的安全模式,這樣問題就解決了。
25、用java -jar執(zhí)行hadoop的job報錯
問題:
用java -jar執(zhí)行hadoop的jar包時報錯
- [root@centos ~]# java -jar test04.jar
- Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration
- at cn.hc.hadoop.text.MyJob.main(MyJob.java:28)
- Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
- at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
- at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
- at java.security.AccessController.doPrivileged(Native Method)
- at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
原因:
用hadoop的mapreduce變成,在執(zhí)行的時候需要依賴hadoop的大部分依賴,所以上述錯誤是缺少hadoop的依賴包
解決:
(1)建議使用hadoop -jar 執(zhí)行job
(2)如果使用java -jar,需要使用java -cp 把hadoop依賴的所有jar拼接到路徑里面去
(3)如果使用java -jar,另一種是在打包的時候把hadoop依賴的jar一起打包進去
26、windows平臺調用yarn報錯:no job control一般解決方法
在使用windows調用Hadoop yarn平臺的時候,一般都會遇到如下的錯誤:
- WARN org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor: Exception from container-launch with container ID: container_1401177251807_0034_01_000001 and exit code: 1
- org.apache.hadoop.util.Shell$ExitCodeException: /bin/bash: line 0: fg: no job control
- at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
- at org.apache.hadoop.util.Shell.run(Shell.java:418)
- at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
- at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
- at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:300)
- at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:81)
- at java.util.concurrent.FutureTask.run(FutureTask.java:262)
- at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
- at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
- at java.lang.Thread.run(Thread.java:744)
(1)首先這個問題是在windows的eclipse作為客戶端提交任務到linux Hadoop集群才會出現(xiàn)的問題,如果是linux的eclipse提交任務到linux Hadoop集群則不會出現(xiàn)這樣的問題。那么一個很直觀的想法就是同時使用兩個客戶端運行一個任務,然后每個步驟都調試,來確定其中的不同點。這么做,肯定是可以的。但是這么做肯定也是比較費時的(而且還要自己在一個linux上裝個eclipse,麻煩);
(2)按照1的做法,一般就可以看到有兩點的不同,一個是java命令的不同,還有一個就是classpath的不同。先說下斷點的地方:
1)java命令的斷點:
YarnRunner.java的這一行:
- // Setup the command to run the AM
- List<String> vargs = new ArrayList<String>(8);
- vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
這里打上斷點后,然后運行到下面這一行,就可以看到vargs是如下的樣子(或者看vargsFinal這個變量):
- [%JAVA_HOME%, -Dlog4j.configuration=container-log4j.properties, -Dyarn.app.container.log.dir=<LOG_DIR>, -Dyarn.app.container.log.filesize=0, -Dhadoop.root.logger=INFO,CLA, , -Xmx1024m, org.apache.hadoop.mapreduce.v2.app.MRAppMaster, 1><LOG_DIR>/stdout, 2><LOG_DIR>/stderr, null, null]
2)classpath的斷點:YarnRunner.java中,查看environment的值,可以看到起值為:
- {CLASSPATH=%PWD%;$HADOOP_CONF_DIR;$HADOOP_COMMON_HOME/*;$HADOOP_COMMON_HOME/lib/*;$HADOOP_HDFS_HOME/*;$HADOOP_HDFS_HOME/lib/*;$HADOOP_MAPRED_HOME/*;$HADOOP_MAPRED_HOME/lib/*;$HADOOP_YARN_HOME/*;$HADOOP_YARN_HOME/lib/*;%HADOOP_MAPRED_HOME%\share\hadoop\mapreduce\*;%HADOOP_MAPRED_HOME%\share\hadoop\mapreduce\lib\*;job.jar/job.jar;job.jar/classes/;job.jar/lib/*;%PWD%/*}
(3)看到2中的兩個值就可以確定,windows和linux的不同之處了,主要有兩個:
- %%和$的區(qū)別;
- 正反斜杠的區(qū)別(這個好像不區(qū)別也行);
(4)看出上面兩個地方的區(qū)別后,如果直接把這兩個值改為:
- [$JAVA_HOME/bin/java -Dlog4j.configuration=container-log4j.properties -Dyarn.app.container.log.dir=<LOG_DIR> -Dyarn.app.container.log.filesize=0 -Dhadoop.root.logger=INFO,CLA -Xmx1024m org.apache.hadoop.mapreduce.v2.app.MRAppMaster 1><LOG_DIR>/stdout 2><LOG_DIR>/stderr ]
和
- {CLASSPATH=$PWD:$HADOOP_CONF_DIR:$HADOOP_COMMON_HOME/*:$HADOOP_COMMON_HOME/lib/*:$HADOOP_HDFS_HOME/*:$HADOOP_HDFS_HOME/lib/*:$HADOOP_MAPRED_HOME/*:$HADOOP_MAPRED_HOME/lib/*:$HADOOP_YARN_HOME/*:$HADOOP_YARN_HOME/lib/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*:job.jar/job.jar:job.jar/classes/:job.jar/lib/*:$PWD/*}
那么應該是可以運行的;
(5)怎么改呢?
1)在我們的工程中新建一個YarnRunner類,該類與源碼的YarnRunner類一模一樣(包路徑,代碼內容都一樣);
2)把下面替換為(這里默認Hadoop 集群是在linux環(huán)境下的):
即把
- vargs.add(Environment.JAVA_HOME.$() + "/bin/java");
替換為
- vargs.add("$JAVA_HOME/bin/java");
3)添加:
- replaceEnvironment(environment);
這個方法放在***面,為:
- private void replaceEnvironment(Map<String, String> environment) {
- String tmpClassPath = environment.get("CLASSPATH");
- tmpClassPathtmpClassPath=tmpClassPath.replaceAll(";", ":");
- tmpClassPathtmpClassPath=tmpClassPath.replaceAll("%PWD%", "\\$PWD");
- tmpClassPathtmpClassPath=tmpClassPath.replaceAll("%HADOOP_MAPRED_HOME%", "\\$HADOOP_MAPRED_HOME");
- tmpClassPathtmpClassPath= tmpClassPath.replaceAll("\\\\", "/" );
- environment.put("CLASSPATH",tmpClassPath);
- }
這樣替換完成后,在windows的eclipse中向linux Hadoop集群中提交任務就可以執(zhí)行了。
27、運行mr程序報UnsatisfiedLinkError:nativeio.NativeIO$Windows.access0(Ljava/lang/String
有的同學在開發(fā)工具里面跑mr程序時候,遇到了下
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
一般這個問題是由本地hadoop環(huán)境變量照成的。
需要設置hadoop_home變量的值。
注意hadoop安裝目錄下,bin目錄中缺少hadoop.dll和winutils.exe等動態(tài)庫。還要增加bin目錄到path路徑。
另外編輯器需要添加hadoop環(huán)境 還要注意jdk等是否正確安裝。
28、hdfs API文件找不到異常
問題:
在使用hdfs的copyfromlocal上傳文件到hdfs時,爆出本地文件找不到異常,但是查看本地文件確實存在
原因:
windows設置了隱藏已知文件的擴展名功能,導致上傳的文件沒有寫擴展名
解決:
在上傳文件的地方添加上擴展名即可。
29、hadoop節(jié)點啟動異常
問題:
在執(zhí)行hadoop-deamon.sh start xxx時報錯
錯誤:找不到或無法加載主類
原因:
啟動的時候,節(jié)點名寫錯了
解決:
修改名字,名字有, namenode datanode等
30、UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/Strin
好多同學在windows平臺Eclipse上跑MR本地程序的時候,都報了如下的異常:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
解決步驟如下:
一、檢查自己是否配置環(huán)境變量HADOOP_HOME 和path,如下所示:
注意要配置Windows版編譯的hadoop。
二、檢查C:\Windows\System32下是否缺少hadoop.dll,如果缺少的話把這個文件拷貝到C:\Windows\System32下面即可
然后重啟電腦,也許還沒那么簡單,還是出現(xiàn)這樣的問題。
我們再繼續(xù)分析:
我們在出現(xiàn)錯誤的的atorg.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)我們來看這個類NativeIO的557行,如圖所示:
Windows的唯一方法用于檢查當前進程的請求,在給定的路徑的訪問權限,所以我們先給以能進行訪問,我們自己先修改源代碼,return true 時允許訪問。
我們下載對應hadoop源代碼,hadoop-2.6.0-src.tar.gz解壓,hadoop-common-project\hadoop-common\src\main\java\org\apache\hadoop\io\nativeio下NativeIO.java 復制到對應的Eclipse的project,然后修改557行為return true如圖所示:
這樣通過***解救大法。我們就可以愉快的在Windows上跑MR了。
31、Error: java.io.IOException: Unable to initialize any output collector
錯誤如下所示:
- Error: java.io.IOException: Unable to initialize any output collector
- at org.apache.hadoop.mapred.MapTask.createSortingCollector(MapTask.java:412)
- at org.apache.hadoop.mapred.MapTask.access$100(MapTask.java:81)
- at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:695)
- at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:767)
- at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
- at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
- at java.security.AccessController.doPrivileged(Native Method)
- at javax.security.auth.Subject.doAs(Subject.java:415)
- at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1656)
- at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
解決思路:
錯誤都是出現(xiàn)在Mapper的task里面。錯誤說明輸出的類型錯誤。請優(yōu)先排查自己mr程序中的輸出類型跟你在job中設置的輸出類型是否一致。
就是一致的情況下,要排除自己導入的包是否正確,比如import里面不是import的org.apache.hadoop.io.Text類,而是另外一個不知所云的包下面的Text。
***還有一種情況,如果是自定義的情況下,請回頭檢查自己寫的Key類,發(fā)現(xiàn)有沒有顯式地定義類的構造函數(shù)。
一般在添加無參數(shù)的構造函數(shù)后,問題即可解決。因為必須有默認的構造器皿,這樣Mapreduce方法才能創(chuàng)建對象,然后通過readFields方法從序列化的數(shù)據(jù)流中讀出進行賦值。
32、hadoop 8088 看不到mapreduce 任務的執(zhí)行狀態(tài),無數(shù)據(jù)顯示。
錯誤頁面顯示如下:
解決方法:
(1)首先檢查自己的集群中配置$HADOOP_HOME/conf/mapred-site.xml是否存在。
其中的mapreduce.framework.name是否配置。
(2)如果還不行的話,請在$HADOOP_HOME/conf/mapred-site.xml中原來的配置文件基礎之上再添加下面
- <property>
- <name>mapreduce.jobhistory.address</name>
- <value>master:10020</value>
- </property>
- <property>
- <name>mapreduce.jobhistory.webapp.address</name>
- <value>master:19888</value>
- </property>
33、org.apache.hadoop.fs.ChecksumException: Checksum error: file:.....
有的同學在練習中遇到了這樣的錯誤:
- [root@hadoop01 zookeeper-3.4.5]# hadoop fs -put /root/xx.oo /wc/input
- 16/09/23 19:37:17 INFO fs.FSInputChecker: Found checksum error: b[0, 53]=69206c6f766520796f750a77656c636f6d6520796f750a686f772061726520796f750a7468697320697320796f7520686f6d650a0a
- org.apache.hadoop.fs.ChecksumException: Checksum error: file:/root/xx.oo at 0 exp: -1023732142 got: -897233467
- at org.apache.hadoop.fs.FSInputChecker.verifySums(FSInputChecker.java:323)
- at org.apache.hadoop.fs.FSInputChecker.readChecksumChunk(FSInputChecker.java:279)
- at org.apache.hadoop.fs.FSInputChecker.read1(FSInputChecker.java:228)
- at org.apache.hadoop.fs.FSInputChecker.read(FSInputChecker.java:196)
- at java.io.DataInputStream.read(DataInputStream.java:100)
- at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:78)
- at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:52)
- at org.apache.hadoop.io.IOUtils.copyBytes(IOUtils.java:112)
- at org.apache.hadoop.fs.shell.CommandWithDestination$TargetFileSystem.writeStreamToFile(CommandWithDestination.java:466)
- at org.apache.hadoop.fs.shell.CommandWithDestination.copyStreamToTarget(CommandWithDestination.java:391)
- at org.apache.hadoop.fs.shell.CommandWithDestination.copyFileToTarget(CommandWithDestination.java:328)
- at org.apache.hadoop.fs.shell.CommandWithDestination.processPath(CommandWithDestination.java:263)
- at org.apache.hadoop.fs.shell.CommandWithDestination.processPath(CommandWithDestination.java:248)
- at org.apache.hadoop.fs.shell.Command.processPaths(Command.java:306)
- at org.apache.hadoop.fs.shell.Command.processPathArgument(Command.java:278)
- at org.apache.hadoop.fs.shell.CommandWithDestination.processPathArgument(CommandWithDestination.java:243)
- at org.apache.hadoop.fs.shell.Command.processArgument(Command.java:260)
- at org.apache.hadoop.fs.shell.Command.processArguments(Command.java:244)
- at org.apache.hadoop.fs.shell.CommandWithDestination.processArguments(CommandWithDestination.java:220)
- at org.apache.hadoop.fs.shell.CopyCommands$Put.processArguments(CopyCommands.java:267)
- at org.apache.hadoop.fs.shell.Command.processRawArguments(Command.java:190)
- at org.apache.hadoop.fs.shell.Command.run(Command.java:154)
- at org.apache.hadoop.fs.FsShell.run(FsShell.java:287)
- at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
- at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
- at org.apache.hadoop.fs.FsShell.main(FsShell.java:340)
- put: Checksum error: file:/root/xx.oo at 0 exp: -1023732142 got: -897233467
錯誤原因:
啟動任務的命令中包含一個參數(shù)“-files tb_steps_url_path_dim.txt”
Hadoop客戶端需要將機器本地磁盤中的tb_steps_url_path_dim.txt文件上傳到DFS中。
在上傳的過程中,Hadoop將通過FSInputChecker判斷需要上傳的文件是否存在進行校驗的crc文件,即.tb_steps_url_path_dim.txt.crc,如果存在crc文件,將會對其內容一致性進行校驗,如果校驗 失敗,則停止上傳該文件。最終導致整個MR任務無法執(zhí)行。
crc文件來源
DFS命令:hadoop fs -getmerge srcDir destFile
這類命令在執(zhí)行的時候,會將srcDir目錄下的所有文件合并成一個文件,保存在destFile中,同時會在本地磁盤生成一個. destFile.crc的校驗文件。
DFS命令:hadoop fs -get -crc src dest
這類命令在執(zhí)行的時候,會將src文件,保存在dest中,同時會在本地磁盤生成一個. dest.crc的校驗文件。
如何避免
在使用hadoop fs -getmerge srcDir destFile命令時,本地磁盤一定會(沒有參數(shù)可以關閉)生成相應的.crc文件。
所以如果需要修改getmerge獲取的文件的內容,再次上傳到DFS時,可以采取以下2種策略進行規(guī)避:
(1)刪除.crc文件 ls -a 查看,同級目錄下有個crc校驗文件,刪除即可。
(2)將getmerge獲取的文件修改后重新命名,如使用mv操作,再次上傳到DFS中。
34、security.AccessControlException: Access denied for user sunqw. Superuser privilege is required。
問題:
Windows|Eclipse 運行HDFS程序之后,報:
- org.apache.hadoop.security.AccessControlException: Permission denied: user=sunqw, access=WRITE, inode="":hadoop:supergroup:rwxr-xr-x
或者
Windows|Eclipse 運行HDFS程序之后,報:
- org.apache.hadoop.security.AccessControlException: Access denied for user sunqw. Superuser privilege is required
解決方法:
方式一:
在系統(tǒng)環(huán)境變量中增加HADOOP_USER_NAME,其值為root;
或者 通過java程序動態(tài)添加,如下:
?1System.setProperty("HADOOP_USER_NAME", "root");
方式二:
使用Eclipse在非hadoop運行的用戶下進行寫入hdfs文件系統(tǒng)中時,由于sunqw對"/"目錄沒有寫入權限,所以導致異常的發(fā)生。解決方法即開放hadoop中的HDFS目錄的權限,命令如下:hadoop fs -chmod 777 / 。
方式三:
修改hadoop的配置文件:conf/hdfs-core.xml,添加或者修改 dfs.permissions 的值為 false。
方式四:
將Eclipse所在機器的用戶的名稱修改為root,即與服務器上運行hadoop的用戶一致。
【本文為51CTO專欄作者“王森豐”的原創(chuàng)稿件,轉載請注明出處】