作爲習慣了用idea開發的小夥伴,不太想用eclipse開發Hadoop,於是研究了一下idea如何遠程調試mr,現分享一下。
一 開發環境
本地win10系統
Intellij idea14工具
虛擬機中hadoop2.6.0僞分佈模式
二配置步驟(這裏笨小蔥參考的這篇文章:http://www.cnblogs.com/yjmyzz/p/how-to-remote-debug-hadoop-with-eclipse-and-intellij-idea.html,下面列出idea中的配置)
2.1 下載hadoop-2.6.0二進制文件(hadoop-2.6.0.tar.gz),解壓。
官網地址:https://archive.apache.org/dist/hadoop/common/hadoop2.6.0/.
2.2 在win10中添加幾個環境變量
HADOOP_HOME=D:\yangjm\Code\study\hadoop\hadoop-2.6.0
HADOOP_BIN_PATH=%HADOOP_HOME%\bin
HADOOP_PREFIX=D:\yangjm\Code\study\hadoop\hadoop-2.6.0
另外,PATH變量在最後追加;%HADOOP_HOME%\bin
2.3 創建一個maven的WordCount項目
pom文件如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>yjmyzz</groupId> 8 <artifactId>mapreduce-helloworld</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.apache.hadoop</groupId> 14 <artifactId>hadoop-common</artifactId> 15 <version>2.6.0</version> 16 </dependency> 17 <dependency> 18 <groupId>org.apache.hadoop</groupId> 19 <artifactId>hadoop-mapreduce-client-jobclient</artifactId> 20 <version>2.6.0</version> 21 </dependency> 22 <dependency> 23 <groupId>commons-cli</groupId> 24 <artifactId>commons-cli</artifactId> 25 <version>1.2</version> 26 </dependency> 27 </dependencies> 28 29 <build> 30 <finalName>${project.artifactId}</finalName> 31 </build> 32 33 </project>
項目結構如下:
項目上右擊-》Open Module Settings 或按F12,打開模塊屬性
添加依賴的Libary引用
然後把$HADOOP_HOME下的對應包全導進來
導入的libary可以起個名稱,比如hadoop2.6
3.2 設置運行參數
注意二個地方:
1是Program aguments,這裏跟eclipes類似的做法,指定輸入文件和輸出文件夾
2是Working Directory,即工作目錄,指定爲$HADOOP_HOME所在目錄
然後就可以調試了
intellij下唯一不爽的,由於沒有類似eclipse的hadoop插件,每次運行完wordcount,下次再要運行時,只能手動命令行刪除output目錄,再行調試。
在IDE環境中運行時,IDE需要知道去連哪一個hdfs實例(就好象在db開發中,需要在配置xml中指定DataSource一樣的道理),將$HADOOP_HOME\etc\hadoop下的core-site.xml,複製到resouces目錄下,類似下面這樣:
裏面的內容如下:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://172.28.20.***:9000</value> </property> </configuration>
上面的IP換成虛擬機裏的IP即可
三 bug解決
問題0:如果啓動最初報錯一個winutils.exe 找不到,那麼下載一下放到HADOOP_HOME的bin目錄下.(這裏還需要添加一個下載hadoop.dll放到HADOOP_HOME的bin目錄下和windows系統的c:/window/system32/,不然的話會出現問題三錯誤。)
這裏分享一下winutils.exe和hadoop.dll的2.6.0版本
網盤地址:http://pan.baidu.com/s/1i5HKJIH
問題一:
拋異常:java.io.IOException: Failed on local exception: com.google.protobuf.InvalidProtocolBufferException: Protocol messageend-group tag did not match expected tag.;
可能是端口問題
cdh的環境下,hdfs是8020端口,conf.set(“fs.defaultFS”, “hdfs://192.168.0.4:8020”);
普通hadoop環境,hdfs是9000端口,conf.set(“fs.defaultFS”, “hdfs://192.168.0.121:9000”);
修改org.apache.hadoop.io.nativeio.NativeIO源碼:
爲:
重新編譯
問題三:
Exception in thread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(II[BI[BIILjava/lang/String;JZ)V
at org.apache.hadoop.util.NativeCrc32.nativeComputeChunkedSumsByteArray(Native Method)
at org.apache.hadoop.util.NativeCrc32.calculateChunkedSumsByteArray(NativeCrc32.java:86)
at org.apache.hadoop.util.DataChecksum.calculateChunkedSums(DataChecksum.java:430)
at org.apache.hadoop.fs.FSOutputSummer.writeChecksumChunks(FSOutputSummer.java:202)
。。。。。。。。
下載hadoop.dll放到HADOOP_HOME的bin目錄下和windows系統的c:/window/system32/
注意如果這個hadoop.dll的版本要和hadoop的一致,可以稍微高一點,低了可能就會報這個異常
問題四:
異常信息:
Exception in thread "main" org.apache.hadoop.security.AccessControlException: Permission denied:user=Administrator, access=WRITE, inode="/spark/global":root:supergroup:drwxr-xr-x
at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkFsPermission(FSPermissionChecker.java:271)at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:257)
這是因爲當前用戶Administrator沒有對hdfs的寫入權限. 有幾種方式解決:
1、在系統的環境變量或java JVM變量裏面添加HADOOP_USER_NAME,這個值具體等於多少看自己的情況,以後會運行HADOOP上的Linux的用戶名。(修改完重啓eclipse,不然可能不生效)
2、將當前系統的帳號修改爲hdfs用戶(CDH默認爲用戶名hdfs)
3、使用HDFS的命令行接口修改相應目錄的權限,hadoop fs -chmod 777 /user,後面的/user是要上傳文件的路徑,不同的情況可能不一樣,比如要上傳的文件路徑爲hdfs://namenode/user/xxx.doc,則這樣的修改可以,如果要上傳的文件路徑爲hdfs://namenode/java/xxx.doc,則要修改的爲hadoop fs -chmod 777 /java或者hadoop fs -chmod 777 /,java的那個需要先在HDFS裏面建立Java目錄,後面的這個是爲根目錄調整權限。
bug全部改完後打個斷點就可以遠程調試mr啦。