根據前面一篇Linux系統安裝的文章,我們使用的是烏班圖系統,所以下面的Hadoop就是在Ubuntu 14.04版本下安裝的。
安裝:
Hadoop 可以通過 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下載,一般選擇下載最新的穩定版本,即下載 “stable” 下的 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的,另一個包含 src 的則是 Hadoop 源代碼,需要進行編譯纔可使用。下載完 Hadoop 文件後一般就可以直接使用。這裏需要強調的一點是,Hadoop的壓縮文件是默認在Linux系統裏面下載的,而不是下載在Windows系統中的,因爲如果用虛擬機運行的Linux系統,則虛擬機Linux系統裏面的文件跟Windows系統中的文件是不能互相訪問的,需要通過一定手段讓其能夠互相訪問,目前不做說明。
我們選擇將 Hadoop 安裝至 /usr/local/ 中:
sudo tar -zxf ~/下載/hadoop-2.7.2.tar.gz -C /usr/local # 解壓到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.7.2/ ./hadoop # 將文件夾名改爲hadoop
sudo chown -R hadoop ./hadoop # 修改文件權限
Hadoop 解壓後即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息:cd /usr/local/hadoop
./bin/hadoop version
配置:
單機模式:
Hadoop 默認模式爲非分佈式模式(本地模式),無需進行其他配置即可運行。非分佈式即單 Java 進程,方便進行調試。
可以執行例子來感受下 Hadoop 的運行。Hadoop 附帶了豐富的例子(運行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此選擇運行 grep 例子,我們將 input 文件夾中的所有文件作爲輸入,篩選當中符合正則表達式 dfs[a-z.]+ 的單詞並統計出現的次數,最後輸出結果到 output 文件夾中。
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 將配置文件作爲輸入文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/* # 查看運行結果
執行成功後如下所示,輸出了作業的相關信息,輸出的結果是符合正則的單詞 dfsadmin 出現了1次:
Hadoop 默認不會覆蓋結果文件,因此再次運行上面實例會提示出錯,需要先將./output刪除:
rm -r ./output
僞分佈式模式:
Hadoop 可以在單節點上以僞分佈式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既作爲 NameNode 也作爲 DataNode,同時,讀取的是 HDFS 中的文件。Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/ 中,僞分佈式需要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實現。修改配置文件 core-site.xml (通過 gedit或者vim 編輯: gedit ./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>
同樣的對於修改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>
配置完成後,執行 NameNode 的格式化:
./bin/hdfs namenode -format
初始化成功的話,會看到 “successfully formatted” 和 “Exitting with status 0” 的提示,若爲 “Exitting with status 1” 則是出錯。
接着開啓 NameNode 和 DataNode 守護進程:
./sbin/start-dfs.sh #start-dfs.sh是個完整的可執行文件,中間沒有空格
這中間可能會有讓輸入yes or no的情況,直接輸入y即可。
啓動完成後,可以通過命令jps來判斷是否成功啓動,若成功啓動則會列出如下進程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 沒有啓動,請運行 sbin/stop-dfs.sh 關閉進程,然後再次嘗試啓動嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查之前步驟,或通過查看啓動日誌排查原因。
成功啓動後,可以訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,可以在線查看 HDFS 中的文件。
實例:
運行Hadoop僞分佈實例,要使用 HDFS,首先需要在 HDFS 中創建用戶目錄:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着將 ./etc/hadoop 中的 xml 文件作爲輸入文件複製到分佈式文件系統中,即將 /usr/local/hadoop/etc/hadoop 複製到分佈式文件系統中的 /user/hadoop/input 中。使用的是 hadoop 用戶,並且已創建相應的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
複製完成後,可以通過如下命令查看文件列表:
./bin/hdfs dfs -ls input
僞分佈式運行 MapReduce 作業的方式跟單機模式相同,區別在於僞分佈式讀取的是HDFS中的文件:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
查看運行結果的命令(查看的是位於 HDFS 中的輸出結果):
./bin/hdfs dfs -cat output/*
當然也可以將運行結果取回到本地:
rm -r ./output # 先刪除本地的 output 文件夾(如果存在)
./bin/hdfs dfs -get output ./output # 將 HDFS 上的 output 文件夾拷貝到本機
cat ./output/*
最後關閉Hadoop:
./sbin/stop-dfs.sh
或者用更簡單的方法(在任一個目錄下都可以運行):
stop-all.sh