1. 程式人生 > >虛擬機器下Linux系統Hadoop單機/偽分散式配置:Hadoop2.5.2+Ubuntu14.04(半原創)

虛擬機器下Linux系統Hadoop單機/偽分散式配置:Hadoop2.5.2+Ubuntu14.04(半原創)

  • 系統: Ubuntu 14.04 64bit
  • Hadoop版本: Hadoop 2.5.2 (stable)
  • JDK版本: JDK 1.6

虛擬機器及Ubuntu安裝

1. 下載並安裝 VMware workstation 11 

 下載地址:https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation/11_0?wd=%20VMware%20workstation%2011%20&issp=1&f=3&ie=utf-8&tn=baiduhome_pg&inputT=1321&rsp=1

2. 下載Ubuntu 14.04,注意在虛擬機器上安裝之前需要解壓!

3.在Vmware中新建虛擬機器:虛擬機器安裝嚮導,標準,安裝盤映象檔案:指向ubuntu 14.04解壓的wubi.exe的路徑。

4.虛擬機器命名,注意儲存路徑,預設分配磁碟空間20G,虛擬磁碟拆分成多個檔案。

虛擬機器安裝完成後自動啟動安裝

建立hadoop使用者

如果你安裝Ubuntu的時候不是用的hadoop使用者,那麼需要增加一個名為hadoop的使用者,並將密碼設定為hadoop

建立使用者

sudo useradd hadoop

修改密碼為hadoop,按提示輸入兩次密碼

sudo passwd hadoop

給hadoop使用者建立目錄,方可登陸

sudo mkdir /home/hadoop
sudo chown hadoop /home/hadoop

可考慮為 hadoop 使用者增加管理員許可權,方便部署,避免一些許可權不足的問題:

sudo adduser hadoop sudo

最後登出當前使用者,使用hadoop使用者進行登陸。


JDK1.6的安裝及配置
1.通過火狐瀏覽器下載jdk-6u45-linux-x64.bin(以下操作在虛擬機器中進行 sudo cp/home/moweiyang01/Downloads/jdk-6u45-linux-x64.bin /home/hadoop/
sudo chomd u+x jdk-6u45-linux-x64.bin 執行jdk,在/home/hadoop$下:./ jdk-6u45-linux-x64.bin mv jdk1.6.0_45 jdk 1.6 sudo gedit /etc/profile 加入以下java的配置資訊 export JAVA_HOME=/home/hadoop/jdk1.6 export JRE_HOME=/home/hadoop/jdk1.6/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 儲存profile檔案 在hadoop下執行 source /etc/profile 輸入java -version檢查java是否配置成功。 在 /etc/environment 中配置:
sudo vim /etc/environment
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:  /home/hadoop/jdk1.6/bin” SSH的配置 輸入命令: sudo apt-get install ssh
ssh localhost

然後按提示輸入密碼hadoop,這樣就登陸到本機了。但這樣的登陸是需要密碼的,需要配置成無密碼登陸。

先退出剛才的ssh,然後生成ssh證書:

exit                           # 退出 ssh localhost
cd ~/.ssh                      # 如果沒有該目錄,先執行一次ssh localhost
ssh-keygen -t rsa              # 一直按回車就可以
cp id_rsa.pub authorized_keys

安裝Hadoop 2.5.2

下載後,解壓到/usr/local/中。

sudo tar -zxvf ~/Downloads/hadoop-2.5.2.tar.gz -C /usr/local   # 解壓到/usr/local中
sudo mv /usr/local/hadoop-2.5.2/ /usr/local/hadoop      # 將檔名改為hadoop
sudo chown -R hadoop:hadoop /usr/local/hadoop       # 修改檔案許可權

Hadoop解壓後即可使用。輸入如下命令Hadoop檢查是否可用,成功則會顯示命令列的用法:

/usr/local/hadoop/bin/hadoop

Hadoop單機配置

Hadoop預設配置是以非分散式模式執行,即單Java程序,方便進行除錯。可以執行附帶的例子WordCount來感受下Hadoop的執行。例子將Hadoop的配置檔案作為輸入檔案,統計符合正則表示式dfs[a-z.]+的單詞的出現次數。

cd /usr/local/hadoop
mkdir input
cp etc/hadoop/*.xml input
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar grep input output 'dfs[a-z.]+'
cat ./output/*

執行成功後如下所示,輸出了作業的相關資訊,輸出的結果是符合正則的單詞dfsadmin出現了1次

Hadoop單機WordCount輸出結果Hadoop單機WordCount輸出結果

再次執行會提示出錯,需要將./output刪除。

rm -R ./output

Hadoop偽分散式配置

Hadoop可以在單節點上以偽分散式的方式執行,Hadoop程序以分離的Java程序來執行,節點即是NameNode也是DataNode。需要修改2個配置檔案etc/hadoop/core-site.xmletc/hadoop/hdfs-site.xml。Hadoop的配置檔案是xml格式,宣告property的name和value。

修改配置檔案etc/hadoop/core-site.xml,將

<configuration>
</configuration>

修改為下面配置:

<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/usr/local/hadoop/tmp</value>
        <description>Abase for other temporary directories.</description>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>

修改配置檔案etc/hadoop/hdfs-site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/usr/local/hadoop/tmp/dfs/data</value>
    </property>
</configuration>

關於配置的一點說明:上面只要配置 fs.defaultFS 和 dfs.replication 就可以執行,不過有個說法是如沒有配置 hadoop.tmp.dir 引數,此時 Hadoop 預設的使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在每次重啟後都會被幹掉,必須重新執行 format 才行(未驗證),所以偽分散式配置中最好還是設定一下。此外也需要顯式指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則下一步可能會出錯。

配置完成後,首先初始化檔案系統 HDFS:

bin/hdfs namenode -format

成功的話,最後的提示如下,Exitting with status 0 表示成功,Exitting with status 1: 則是出錯。若出錯,可試著加上 sudo, 既 sudo bin/hdfs namenode -format 試試看。

初始化HDFS檔案系統初始化HDFS檔案系統

接著開啟NaneNodeDataNode守護程序。

sbin/start-dfs.sh

若出現下面SSH的提示,輸入yes即可。

啟動Hadoop時的SSH提示啟動Hadoop時的SSH提示

有可能會出現如下很多的warn提示,下面的步驟中也會出現,特別是native-hadoop library這個提示,可以忽略,並不會影響hadoop的功能。想解決這些提示可以看後面的附加教程(最好還是解決下,不困難,省得看這麼多無用提示)。

啟動Hadoop時的warn提示啟動Hadoop時的warn提示

成功啟動後,可以通過命令jps看到啟動了如下程序NameNodeDataNodeSecondaryNameNode

通過檢視啟動日誌分析啟動失敗原因

有時Hadoop無法正確啟動,如 NameNode 程序沒有順利啟動,這時可以檢視啟動日誌來排查原因,不過新手可能需要注意幾點:

  • 啟動時會提示形如 “Master: starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-Master.out”,其中 Master 對應你的機器名,但其實啟動日誌資訊是記錄在 /usr/local/hadoop/logs/hadoop-hadoop-namenode-Master.log 中,所以應該檢視這個 .log 的檔案;
  • 每一次的啟動日誌都是追加在日誌檔案之後,所以得拉到最後面看,這個看下記錄的時間就知道了。
  • 一般出錯的提示在最後面,也就是寫著 Fatal、Error 或者 Java Exception 的地方。

通過jps檢視啟動的Hadoop程序通過jps檢視啟動的Hadoop程序

Hadoop的Web介面Hadoop的Web介面

Hadoop偽分散式例項-WordCount

首先建立所需的幾個目錄

bin/hdfs dfs -mkdir /user
bin/hdfs dfs -mkdir /user/hadoop

接著將etc/hadoop中的檔案作為輸入檔案複製到分散式檔案系統中,即將/usr/local/hadoop/etc/hadoop複製到分散式檔案系統中的/user/hadoop/input中。上一步建立的 /user/hadoop 相當於 HDFS 中的使用者當前目錄,可以看到複製檔案時無需指定絕對目錄,下面的命令的目標路徑就是 /user/hadoop/input:

bin/hdfs dfs -put etc/hadoop input

執行MapReduce作業,執行成功的話跟單機模式相同,輸出作業資訊。

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar grep input output 'dfs[a-z.]+'

檢視執行結果

bin/hdfs dfs -cat output/*

也可以將執行結果取回到本地。

rm -R ./output
bin/hdfs dfs -get output output
cat ./output/*

結果如下,注意到跟單機模式中用的不是相同的資料,所以執行結果不同(換成原來的資料,結果是一致的)。

Hadoop偽分散式執行WordCout結果Hadoop偽分散式執行WordCout結果

可以看到,使用bin/hdfs dfs -命令可操作分散式檔案系統, 如

bin/hdfs dfs -ls /user/hadoop           # 檢視`/user/hadoop`中的檔案
bin/hdfs dfs -rm -R /user/hadoop/input/*    # 刪除 input 中的檔案
bin/hdfs dfs -rm -R /user/hadoop/output     # 刪除 output 資料夾
執行程式時,輸出目錄需不存在

執行 Hadoop 程式時,結果的輸出目錄(如output)不能存在,否則會提示錯誤,因此執行前需要先刪除輸出目錄。建議在程式中加上如下程式碼進行刪除,避免繁瑣的命令列操作:

Configuration conf = new Configuration();
Job job = new Job(conf);
...
/* 刪除輸出目錄 */
Path outputPath = new Path(args[1]);
outputPath.getFileSystem(conf).delete(outputPath, true);
...

結束Hadoop程序,則執行

sbin/stop-dfs.sh
注意

下次再啟動hadoop,無需進行HDFS的初始化,只需要執行 sbin/stop-dfs.sh 就可以!

以上部分摘自http://www.powerxing.com/install-hadoop-2-4-1-single-node/