1. 程式人生 > >myeclipse配置hadoop開發環境,及遇到問題解決

myeclipse配置hadoop開發環境,及遇到問題解決

eclipse版本:eclipse-jee-indigo-SR2-win32

1、安裝Hadoop開發外掛

     hadoop安裝包contrib/目錄下有個外掛hadoop-1.2.1-eclipse-plugin.jar,拷貝到eclipse根目錄下/dropins目錄下。

2、 啟動eclipse,開啟Perspective:
【Window】->【Open Perspective】->【Other...】->【Map/Reduce】->【OK】
QQ圖片20131105185502.jpg


3、 開啟一個View:
【Window】->【Show View】->【Other...】->【MapReduce Tools】->【Map/Reduce Locations】->【OK】
QQ圖片20131105185519.jpg 
4、 新增Hadoop location:
QQ圖片20131105185530.jpg QQ圖片20131105185540.jpg 
location name: 我填寫的是:amber-hadoop.
Map/Reduce Master 這個框裡
Host:就是jobtracker 所在的叢集機器,這裡寫192.168.1.121
Hort:就是jobtracker 的port,這裡寫的是9001
這兩個引數就是mapred-site.xml裡面mapred.job.tracker裡面的ip和port  
DFS Master 這個框裡
Host:就是namenode所在的叢集機器,這裡寫192.168.1.121
Port:就是namenode的port,這裡寫9000
這兩個引數就是core-site.xml裡面fs.default.name裡面的ip和port
(Use M/R master host,這個複選框如果選上,就預設和Map/Reduce Master這個框裡的host一樣,如果不選擇,就可以自己定義輸入,這裡jobtracker 和namenode在一個機器上,所以是一樣的,就勾選上)
user name:這個是連線hadoop的使用者名稱,因為我是用grid使用者安裝的hadoop,而且沒建立其他的使用者,所以就用grid。

然後點選finish按鈕,此時,這個檢視中就有多了一條記錄。
重啟myeclipse並重新編輯剛才建立的那個連線記錄,現在我們編輯advance parameters tab頁(這裡要根據hadoop環境conf目錄下檔案裡面配置一致)
QQ圖片20131105185549.jpg 
(重啟編輯advance parameters tab頁原因:在新建連線的時候,這個advance paramters  tab頁面的一些屬性會顯示不出來,顯示不出來也就沒法設定,所以必須重啟一下eclipse再進來編輯才能看到)
這裡大部分的屬性都已經自動填寫上了,其實就是把core-defaulte.xml、hdfs-defaulte.xml、mapred-defaulte.xml裡面的一些配置屬性展示出來。因為在安裝hadoop的時候,其site系列配置檔案裡有改動,所以這裡也要弄成一樣的設定。主要關注的有以下屬性:
fs.defualt.name:這個在General tab頁已經設定了

mapred.job.tracker:這個在General tab頁也設定了
dfs.replication:這個這裡預設是3,因為我在hdfs-site.xml裡面設定成了1,所以這裡也要設定成1
然後點選finish,然後就連線上了(先要啟動sshd服務,啟動hadoop程序),連線上的標誌如圖:
QQ圖片20131105185559.jpg 
5、新建Map/Reduce Project:

【File】->【New】->【Project...】->【Map/Reduce】->【Map/Reduce Project】->【Project name: WordCount】->【Configure Hadoop install directory...】->【Hadoop installation directory: F:\hadoop-1.2.1】->【Apply】->【OK】->【Next】->【Allow output folders for source folders】->【Finish】
QQ圖片20131105185607.jpg 
6、新建WordCount類:
QQ圖片20131105185616.jpg 

第一個錯誤
13/11/04 20:42:53 INFO file.FileUtile: Read File :F:\Workspaces\MyEclipse 10\FileTest\src\tf.txt
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890abcdefghijklmnopqrst1234567890
13/11/04 20:42:53 INFO file.FileUtile: Read Contetn size 130
Exception in thread "main" org.apache.hadoop.ipc.RemoteException: org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create /user/grid/in/hw.txt. Name node is in safe mode.
The reported blocks is only 5 but the threshold is 0.9990 and the total blocks 8. Safe mode will be turned off automatically.
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFileInternal(FSNamesystem.java:1561)
at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.startFile(FSNamesystem.java:1527)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:710)
at org.apache.hadoop.hdfs.server.namenode.NameNode.create(NameNode.java:689)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

QQ圖片20131105185626.jpg 

在主節點處,關閉掉安全模式,當然你等待下一些時間等備份複製完畢,這個錯誤也會消失的
#bin/hadoop dfsadmin –safemode leav

第二個錯誤:
org.apache.hadoop.security.AccessControlException:Permission denied:user=SEVEN,access=WRITE,inode="tmp":root:supergroup:rwxr-xr-x 。
  問題原因:本地使用者SEVEN(本機windows使用者)想要遠端操作hadoop系統,沒有許可權引起的。
      解決辦法:
            a、如果是測試環境,可以取消hadoop hdfs的使用者許可權檢查。開啟conf/hdfs-site.xml,找到dfs.permissions屬性修改為false(預設為true)OK了。
<property>
<name>dfs.permissions</name>
<value>false</value>
<description>
If "true", enable permission checking in HDFS.
If "false", permission checking is turned off,
but all other behavior is unchanged.
Switching from one parameter value to the other does not change the mode,
owner or group of files or directories.
</description>
</property>
            b、修改hadoop location引數,在advanced parameter選項卡中,找到hadoop.job.ugi項,將此項改為啟動hadoop的使用者名稱即可。(注意第一次設定的時候可能沒有hadoop.job.ugi引數,報錯後在去看就有了,或者關閉重啟之後。)
      c、因為Eclipse使用hadoop外掛提交作業時,會預設以 DrWho 身份去將作業寫入hdfs檔案系統中,對應的也就是 HDFS 上的/user/hadoop ,  由於 DrWho 使用者對hadoop目錄並沒有寫入許可權,所以導致異常的發生。解決方法為:放開 hadoop 目錄的許可權 , 命令如下 :$ hadoop fs -chmod 777

我是用直接把windows使用者改成grid使用者

執行成功後的結果如下所示: QQ圖片20131105185636.jpg

第三個錯誤
13/11/04 21:33:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/11/04 21:33:34 ERROR security.UserGroupInformation: PriviledgedActionException as:grid cause:java.io.IOException: Failed to set permissions of path: \home\grid\hadoop-1.2.1\tmp\mapred\staging\grid1670184777\.staging to 0700
Exception in thread "main" java.io.IOException: Failed to set permissions of path: \home\grid\hadoop-1.2.1\tmp\mapred\staging\grid1670184777\.staging to 0700
at org.apache.hadoop.fs.FileUtil.checkReturnValue(FileUtil.java:691)
at org.apache.hadoop.fs.FileUtil.setPermission(FileUtil.java:664)
at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:514)
at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:349)
at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:193)
at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:126)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:942)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:936)

出現不能在HDFS裡面建立檔案.許可權問題
修改了
F:\hadoop-1.2.1\src\core\org\apache\hadoop\fs
中的FileUtil.java,checkReturnValue 裡面內容註釋掉

重新編譯打包hadoop-core-1.2.1.jar,替換掉hadoop-1.2.1根目錄下的hadoop-core-1.2.1.jar即可。
當然也和我一樣小白,編譯打包不成功的,直接下載個免許可權的hadoop-core-1.2.1.jar即可.我會放附件上

第四個錯誤

13/11/05 18:25:53 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
13/11/05 18:25:53 INFO mapred.JobClient: Cleaning up the staging area file:/home/grid/hadoop-1.2.1/tmp/mapred/staging/grid489274882/.staging/job_local489274882_0001
13/11/05 18:25:53 ERROR security.UserGroupInformation: PriviledgedActionException as:grid causerg.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://h1:9000/user/grid/out already exists
Exception in thread "main" org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://h1:9000/user/grid/out already exists
at org.apache.hadoop.mapreduce.lib.output.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:137)
at org.apache.hadoop.mapred.JobClient$2.run(JobClient.java:973)

這個只要在hdfs裡的目錄指定新的目錄,或者刪除原有目錄就ok
QQ圖片20131105185645.jpg 

第五問題 ,上修改完畢之後再次執行結果又出錯了
13/11/05 18:36:41 INFO mapred.MapTask: Processing split: hdfs://h1:9000/user/grid/in/test1.txt:0+12
13/11/05 18:36:41 INFO mapred.MapTask: io.sort.mb = 100
13/11/05 18:36:41 INFO mapred.LocalJobRunner: Map task executor complete.
13/11/05 18:36:41 WARN mapred.LocalJobRunner: job_local1365353611_0001
java.lang.Exception: java.lang.OutOfMemoryError: Java heap space
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:354)
Caused by: java.lang.OutOfMemoryError: Java heap space

1、在D:/apache-tomcat-6.0.18/bin/catalina.bat最前面加入:set JAVA_OPTS=-Xms384m -Xmx384m
注意:只有startup.bat啟動tomcat,設定才能生效,如果利用windows的系統服務啟動tomcat服務,上面的設定就不生效了,
就是說set JAVA_OPTS=-Xms384m -Xmx384m沒起作用
2、在Eclilpse中修改啟動引數,在VM arguments 加入了-Xms384m -Xmx384m,設定如下圖所示
QQ圖片20131105185706.jpg

3. 單獨為某個程式設定記憶體大小.eclipse裡預設的一個程式的jvm配置為:-Xms8m -Xmx128m,所以我們的處理耗記憶體比較大時需要手動調整一下,以便不會記憶體溢位。具體的設定方法為:
選中被執行的類,點選選單‘Run as ->Open Run Dialog...’,選擇(x)=Argument標籤頁下的vm arguments框裡輸入 -Xmx512m, 儲存執行就ok了

我是用了第三種方法
執行結果通過
13/11/05 18:48:02 INFO mapred.JobClient:     SPLIT_RAW_BYTES=508
13/11/05 18:48:02 INFO mapred.JobClient:     Reduce input records=12
13/11/05 18:48:02 INFO mapred.JobClient:     Reduce input groups=11
13/11/05 18:48:02 INFO mapred.JobClient:     Combine output records=12
13/11/05 18:48:02 INFO mapred.JobClient:     Reduce output records=11
13/11/05 18:48:02 INFO mapred.JobClient:     Map output records=12
QQ圖片20131105185714.jpg