虛擬機器下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 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次
再次執行會提示出錯,需要將./output
刪除。
rm -R ./output
Hadoop偽分散式配置
Hadoop可以在單節點上以偽分散式的方式執行,Hadoop程序以分離的Java程序來執行,節點即是NameNode也是DataNode。需要修改2個配置檔案etc/hadoop/core-site.xml
和etc/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
試試看。
接著開啟NaneNode
和DataNode
守護程序。
sbin/start-dfs.sh
若出現下面SSH的提示,輸入yes即可。
有可能會出現如下很多的warn提示,下面的步驟中也會出現,特別是native-hadoop library
這個提示,可以忽略,並不會影響hadoop的功能。想解決這些提示可以看後面的附加教程(最好還是解決下,不困難,省得看這麼多無用提示)。
成功啟動後,可以通過命令jps
看到啟動了如下程序NameNode
、DataNode
和SecondaryNameNode
。
有時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 的地方。
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/*
結果如下,注意到跟單機模式中用的不是相同的資料,所以執行結果不同(換成原來的資料,結果是一致的)。
可以看到,使用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
就可以!