Ubuntu 14.04 (32位)上搭建Hadoop 2.5.1單機和偽分散式環境
引言
一直用的Ubuntu 32位系統(準備下次用Fedora,Ubuntu越來越不適合學習了),今天準備學習一下Hadoop,結果下載Apache官網上釋出的最新的封裝好的2.5.1版,配置完了根本啟動不起來,檢視錯誤日誌發現是native庫的版本和系統不一致,使用file命令可以發現封裝版的native庫檔案全是64位的:
原來官網釋出的版本開始用64位環境編譯了(貌似之前是32位環境編譯)。沒辦法,只好自己下載原始碼編譯了。
毫無意外的,編譯時各種錯誤簡直停不下來,強忍著一個個耐心解決了,配置的時候又由於自2.3開始帶來的框架的質變,很多配置都不一樣,網上教程真是看花了眼。。。不過最後還是強行配置好,終於跑起來了。系統地記下來,避免後來者繞彎路。
主要參考了2篇文章(其實就是2篇文章的整合):
環境
<a target=_blank href="http://www.ubuntu.com/download/desktop">Ubuntu 14.04 (32 bit)</a>
[建議使用64位系統,最好是其他Linux發行版]
<a target=_blank href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 7u71</a>
[一定要使用JDK7,不要用最新的JDK8,否則編譯會出錯,系統自帶的OpenJDK也別用,注意配置環境變數,使預設Java環境為JDK7,一定要用“java -version”命令確認一下!] <a target=_blank href="http://ant.apache.org/bindownload.cgi">Ant 1.9.4</a>
[Ubuntu官方源的Ant是1.9.3版,也能用,不想手動配置環境就“apt-get install ant”也行]
<a target=_blank href="http://maven.apache.org/download.cgi">Maven 3.2.3</a>
[使用官方最新的3.2.3版就行,不要用2,不要apt-get安裝,Ubuntu官方源的當前版本可能太舊,可能導致編譯失敗]
<a target=_blank href="http://findbugs.sourceforge.net/index.html">FindBugs 3.0.0</a>
[就用最新的3.0.0版,<span style="font-family: Arial, Helvetica, sans-serif;">Ubuntu</span>官方源的當前版是2.0版,太舊,會導致編譯失敗] <a target=_blank href="http://download.csdn.net/download/ruijiliang/6991999">Protobuf 2.5</a>
[這個要注意:官方最新的是2.6版,但是hadoop 2.5.1就要求Protobuf是2.5版,所以務必使用連結提供的2.5版,否則編譯會失敗]
<a target=_blank href="http://www.apache.org/dyn/closer.cgi/hadoop/common">Hadoop 2.5.1 src</a>
[32位系統的就老老實實原始碼編譯吧,別下到那個編譯完成的版本了]
注:以上工具版本最好保持一致,使用其他版本可能導致編譯失敗,當然可以隨便嘗試,能編譯成功就行,上述工具正確安裝配置後一般能保證編譯成功。
編譯環境
先把編譯環境配置起來。依次安裝並配置JDK 7u71, Ant 1.9.4, Maven 3.2.3, Findbugs 3.0.0 和 Protobuf 2.5就行了:
JDK 7u71:
tar -zxvf jdk-7u71-linux-i586.tar.gz
sudo cp -r jdk1.7.0_71 /usr/lib/jvm/
#配置環境變數:
export JAVA_HOME=/usr/lib/jvm//jdk1.7.0_71
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre//bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
#注意:
#1、JAVA路徑要在原本的PATH之前,否則java命令預設會軟連線到自帶的OpenJDK上。最好“java -version”確認一下。
#2、/etc/profile , .profile 或者.bashrc(.zshrc) 中配置都行,但必須source之後才能生效。.bashrc 或.zshrc的話source一次就行了,/etc/profile 或 .profile則需要每次啟動終端時都source一次才能生效,直到下次開機。不同配置檔案的載入機制不同,不多說。
#3、下面工具的配置同理。
Ant 1.9.4:
tar zxvf apache-ant-1.9.4-bin.tar.gz </span>
sudo cp -r apache-ant-1.9.4 /usr/share/
<span style="font-family: 'Microsoft YaHei';">#配置環境變數:export ANT_HOME=/usr/share/apache-ant-1.9.4 export PATH=$PATH:$ANT_HOME/bin</span>
Maven 3.2.3:
tar -zxvf apache-maven-3.2.3-bin.tar.gz
sudo cp -r apache-maven-3.2.3 /usr/share/
#配置環境變數:
<span style="font-family: 'Microsoft YaHei';"> export M2_HOME=/usr/share/apache-maven-3.2.3 </span>
export MAVEN_OPTS="-Xms256m -Xmx512m"
export PATH=$PATH:$M2_HOME/bin
FindBugs 3.0.0:
tar zxvf findbugs-3.0.0.tar.gz
udo cp -r findbugs-3.0.0 /usr/share/
#配置環境變數:
export FINDBUGS_HOME=/usr/share/findbugs-3.0.0
export PATH=$PATH:$FINDBUGS_HOME/bin
Protobuf 2.5.0:
tar zxvf protobuf-2.5.0.tar.gz
cd protobuf-2.5.0
./configure --prefix=/usr/share
make
sudo make install
我把工具都安裝在/usr/share目錄下,Ubuntu系統預設會搜尋該目錄下的庫檔案,無需其他配置就行了。但是如果工具被安裝在了/usr/local目錄下,Ubuntu是不會自動搜尋該目錄的庫檔案的,此時需要配置開發庫環境變數:
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
編譯
tar zxvf hadoop-2.5.1-src.tar.gz
cd hadoop-2.5.1-src
mvn package -Pdist,native,docs -DskipTests -Dtar
#等待編譯完成就行了,完成後得到的編譯版Hadoop位於hadoop-2.5.1-src/hadoop-dist/target中,其中的hadoop-2.5.1目錄即為編譯版。
自編譯雖然麻煩,但是成功編譯得到的版本比直接下載的打包編譯版在本機上表現更穩定,error和warning基本沒有了。另外下面這篇文章提供了編譯過程中可能產生的常見問題和解決辦法:http://blog.csdn.net/amaowolf/article/details/8125351
配置
萬事俱備,開始正式搭建。
Hadoop三種執行模式:
1. 單機模式(standalone):單機模式是Hadoop的預設模。當配置檔案為空時,Hadoop完全執行在本地。因為不需要與其他節點互動,單機模式就不使用HDFS,也不載入任何Hadoop的守護程序。該模式主要用於開發除錯MapReduce程式的應用邏輯。
2. 偽分佈模式(Pseudo-Distributed Mode):Hadoop守護程序執行在本地機器上,模擬一個小規模的的叢集。該模式在單機模式之上增加了程式碼除錯功能,允許你檢查記憶體使用情況,HDFS輸入輸出,以及其他的守護程序互動。
3. 全分佈模式(Fully Distributed Mode):Hadoop守護程序執行在一個叢集上。
自己學習還是搭偽分散式比較好(單機模式其實不需要什麼配置)。也不單獨新增Hadoop使用者了,切換麻煩,就用自己常用帳戶就行了。
步驟:
1、安裝ssh
由於Hadoop用ssh通訊,先安裝ssh
- ~$ sudo apt-get install openssh-server
ssh安裝完成以後,先啟動服務:
- ~$ sudo /etc/init.d/ssh start
- ~$ ps -e | grep ssh
作為一個安全通訊協議,使用時需要密碼,因此我們要設定成免密碼登入,生成私鑰和公鑰:
- ~$ ssh-keygen -t rsa -P ""
因為我已有私鑰,所以會提示是否覆蓋當前私鑰。第一次操作時會提示輸入密碼,按Enter直接過,這時會在~/home/{username}/.ssh下生成兩個檔案:id_rsa和id_rsa.pub,前者為私鑰,後者為公鑰,現在我們將公鑰追加到authorized_keys中(authorized_keys用於儲存所有允許以當前使用者身份登入到ssh客戶端使用者的公鑰內容):
- ~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
- ~$ ssh localhost
登出:
- ~$ exit
- ~$ ssh localhost
登出:
- ~$ exit
2、安裝hadoop 2.5.1
將剛才編譯得到的hadoop-2.5.1複製到/opt目錄下(大型軟體和平臺我一般放在這個目錄),為方便配置,設定許可權為777:
- ~$ sudo cp -r hadoop-2.5.1-src/hadoop-dist/target/hadoop-2.5.1 /opt/
- ~$ sudo chmod -R 777 /opt/hadoop-2.5.1
在/etc/profile 或 .profile 或 .bashrc中配置hadoop環境變數,注意配置完成後一定要source一下。
- export HADOOP_HOME=/opt/hadoop-2.5.1
- export CLASSPATH=.:$HADOOP_HOME/lib:$CLASSPATH
- export PATH=$PATH:$HADOOP_HOME/bin
4.設定hadoop-env.sh(Java 安裝路徑)
開啟/opt/hadoop-2.5.1/etc/hadoop目錄下的hadoop-env.sh檔案,新增以下資訊:
- export JAVA_HOME=${JAVA_HOME} #當然如果沒有配置JAVA_HOME也可以設定成具體的JDK路徑
- export HADOOP_HOME=/opt/hadoop-2.5.1 #以下2行純粹為了保險,實際上是重複設定了一次步驟3
- export PATH-$PATH:$HADOOP_HOME/bin
並且,讓環境變數配置生效source
- ~$ source /opt/hadoop-2.5.1/etc/hadoop/hadoop-env.sh
至此,hadoop的單機模式已經安裝成功。
5、偽分散式環境搭建
5.1.設定*-site.xml
這裡需要設定4個檔案:core-site.xml,hdfs-site.xml,mapred-site.xml和yarn-site.xml.都在/opt/hadoop-2.5.1/etc/hadoop/目錄下
core-site.xml: Hadoop Core的配置項,例如HDFS和MapReduce常用的I/O設定等。
hdfs-site.xml: Hadoop 守護程序的配置項,包括namenode,輔助namenode和datanode等。
mapred-site.xml: MapReduce 守護程序的配置項,包括jobtracker和tasktracker。
yarn-site.xml: Yarn 框架用於執行MapReduce 處理程式
首先在hadoop目錄下新建幾個資料夾
- ~$ mkdir tmp
- ~$ mkdir -p hdfs/name
- ~$ mkdir -p hdfs/data
接下來編輯那4個檔案(IP地址處我填了我的區域網IP:192.168.1.135,根據需要填寫自己主機的IP或者直接用localhost):
core-site.xml:
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://192.168.1.135:9000</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/opt/hadoop-2.5.1/tmp</value>
- </property>
- </configuration>
- <configuration>
- <property>
- <name>dfs.replication</name>
- <value>1</value>
- </property>
- <property>
- <name>dfs.name.dir</name>
- <value>/uopt/hadoop-2.5.1/hdfs/name</value>
- </property>
- <property>
- <name>dfs.data.dir</name>
- <value>/opt/hadoop-2.5.1/hdfs/data</value>
- </property>
- </configuration>
上述路徑都需要自己手動用mkdir建立(開頭就已經建立了),具體位置也可以自己選擇,其中dfs.replication的值建議配置為與分散式
cluster 中實際的 DataNode 主機數一致,在這裡由於是偽分散式環境所以設定其為1。
- <configuration>
- <property>
- <name>mapreduce.framework.name</name>
- <value>Yarn</value>
- </property>
- </configuration>
請注意這裡安裝的2.5.1版本,2.*版本較1.*版本改動很大,主要是用Hadoop MapReduceV2(Yarn) 框架代替了一代的架構,其中JobTracker 和 TaskTracker 不見了,取而代之的是 ResourceManager, ApplicationMaster 與 NodeManager 三個部分,而具體的配置檔案位置與內容也都有了相應變化。所以我們在mapred-site.xml中設定了處理map-reduce的框架Yarn,接下來就需要在yarn-site.xml中配置ResourceManager, ApplicationMaster 與 NodeManager。
yarn-site.xml:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>Yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property>
<property>
<description>The address of the applications manager interface in the RM.</description>
<name>Yarn.resourcemanager.address</name>
<value>192.168.1.135:18040</value>
</property>
<property>
<description>The address of the scheduler interface.</description>
<name>Yarn.resourcemanager.scheduler.address</name>
<value>192.168.1.135:18030</value>
</property>
<property>
<description>The address of the RM web application.</description>
<name>Yarn.resourcemanager.webapp.address</name>
<value>192.168.1.135:18088</value>
</property>
<property>
<description>The address of the resource tracker interface.</description>
<name>Yarn.resourcemanager.resource-tracker.address</name>
<value>192.168.1.135:8025</value>
</property>
</configuration>
5.2.格式化HDFS
- ~$ /opt/hadoop-2.5.1/bin/hadoop namenode -format
如上圖表示格式化成功。
5.3.啟動Hadoop
接著執行start-all.sh來啟動所有服務,包括namenode,datanode,start-all.sh指令碼用來裝載守護程序。
- /opt/hadoop-2.5.1/sbin$ ./start-all.sh #2.5.1版推薦使用start-dfs.sh和start-yarn.sh來啟動
用Java的jps命令列出所有守護程序來驗證安裝成功
- /opt/hadoop-2.5.1/bin$ jps
5.4.檢查執行狀態
所有的設定已完成,Hadoop也啟動了,現在可以通過下面的操作來檢視服務是否正常,在Hadoop中用於監控叢集健康狀態的Web介面(填寫自己的IP):
http://192.168.1.135:50070 #dfs執行狀態
http://192.168.1.135:8088 #resource manager執行狀態