IDEA遠程調試Hadoop步驟及出錯解決整理

作爲習慣了用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”);


問題二:
拋異常: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)
at org.apache.hadoop.util.DiskChecker.checkAccessByFileMethods(DiskChecker.java:187)
        ........

修改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啦。生氣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章