使用0.20.X系列版本的Hadoop快有一年時間了,主要集中在HDFS上。期間自己參與了部署Hadoop叢集(1 Server + 20 PC),也參與了分析HDFS的源碼。
這幾天,由於項目需要,轉移到了0.22.0版本了,需要重新部署Hadoop叢集。這次部署要牽扯到mapreduce項目下contribute中的raid。目的是:部署0.22.0版本Hadoop的叢集,配置並試用其raid的功能。由於之前對0.22.0版本不熟悉,所以在部署叢集前,準備先在Ubuntu上部署偽分布式的,熟悉相關檔案的位置和使用。
0.22.0版本偽分布式的部署和其他版本的沒有什麼本質的不同,主要是有一些細節需要處理,並需要熟悉整個項目相關檔案的組織圖。下面主要記錄一下在偽分布式安裝和編譯Raid時的一些問題和解決方案。
1.從hadoop-0.22.0.tar.gz解壓後的目錄可知,該版本相比於0.20.X系列目錄結構有較大變化。這給一直使用0.20.X版本系列的人帶來了一點兒麻煩,需要大致翻看一下各個目錄都有什麼。
2.配置注意事項:
在hadoop-env.sh中啟用JAVA_HOME的配置和你需要的配置項;
配置好masters、slaves列表檔案,其中masters中只需要指定SecondaryNamenode所在的結點的hostname或IP地址即可;
對於設定檔可以按照core-site.xml、hdfs-site.xml、mapred-site.xml的順序依次填寫配置項;
如果要使用raid,還需要在hdfs-site.xml和raid源碼目錄下的raid.xml中進行配置,可參看HDFS RAID的Wiki。
3.Hadoop叢集的管理和使用指令碼,要賦予可執行許可權。另外,與hdfs、mapreduce相關的shell指令檔已經被分開放在相應的目錄下。為了使用方便可以將相應檔案拷貝到$HADOOP_HOME/bin下,也可以在環境變數PATH中添加這些檔案所在的目錄。
4.重新編譯Raid項目,顯示Ivy無法解析:
[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::[ivy:resolve] :: UNRESOLVEDDEPENDENCIES ::[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::[ivy:resolve] ::org.apache.hadoop#hadoop-common;0.22.0-SNAPSHOT: not found[ivy:resolve] ::org.apache.hadoop#hadoop-common-test;0.22.0-SNAPSHOT: not found[ivy:resolve] ::org.apache.hadoop#hadoop-hdfs;0.22.0-SNAPSHOT: not found[ivy:resolve] ::::::::::::::::::::::::::::::::::::::::::::::
解決方案是:進入$HADOOP_HOME/mapreduce/ivy尋找libraries.properties檔案,找到hadoop-common.version和hadoop-hdfs.version這兩項,改成
hadoop-common.version=0.22.0hadoop-hdfs.version=0.22.0
5.Raid配置相關的問題
關於Raid的配置和使用並沒有清晰完整的指南,最完整的的應該算是HDFS RAID Wiki裡的介紹。但是,這個Wiki裡有錯誤,只看這個Wiki進行配置的話,肯定會導致RaidNode無法啟動。最明顯的一個問題是由這個配置項導致的:
<property> <name>fs.hdfs.impl</name> <value>org.apache.hadoop.dfs.DistributedRaidFileSystem</value> <description>The FileSystem for hdfs: uris.</description></property>
其中的value部分應該是org.apache.hadoop.hdfs.DistributedRaidFileSystem,否則肯定會在記錄檔中看到報類找不到的錯誤。
當然,只是改了這裡日誌裡還是會不停的報錯,剩下的部分就只能根據錯誤看源碼慢慢分析、改正、驗證了。比如:
Q:記錄檔報BlockFixer中有一處類型轉換異常,就是嘗試將DistributedRaidFileSystem對象轉換為DistributedFileSystem對象。
A: 在BlockFixer.java中將getDFS(Path)方法改為:
/** * Returns a DistributedFileSystem hosting the path supplied. */ protected DistributedFileSystem getDFS(Path p) throws IOException { LOG.info("[-Control Flow-]:" + p.getFileSystem(getConf())); return (DistributedFileSystem) ((DistributedRaidFileSystem)p.getFileSystem(getConf())).getFileSystem(); }
然後,在raid目錄下執行Ant jar命令,將在mapreduce/build/的對應目錄下產生新的jar檔案,替換原有jar檔案。
目前,在偽分布式環境下,已經試用了Raid的XOR編碼方案對指定目錄下的檔案進行編碼。
我的部落格:http://zhoutai.duapp.com