Hadoop环境搭建与入门实例
1目的及要求
基于Hadoop平臺,實現廣度優先搜索(BFS)的Mapreduce算法找到圖中兩個點的最短路徑。
給定一個圖<V,E>(采用鄰接列表輸入文件格式:源節點ID,相鄰節點ID,源節點到相鄰節點的距離),基于MapReduce的方式,采用廣度優先搜索(BFS)找到兩個頂點的最短距離。
?
2實驗環境
本實驗基于虛擬機環境,所采用的軟件及其版本如下:
虛擬機軟件:Oracle VirtualBox?5.2.6
虛擬機操作系統:Ubuntu 16.04.1 LTS - 64 bit
Java環境:JDK-1.8
Hadoop平臺:Hadoop 2.7.6
?
3實驗內容與步驟
3.1實驗環境搭建
3.1.1搭建Java開發環境
1)鍵入如下命令將jdk軟件包解壓至指定目錄:
tar -zxvf jdk-8u181-linux-x64.tar.gz -C your_java_home
2)鍵入如下命令編輯profile文件:
sudo vim /etc/profile
設置jdk環境變量,在profile文件的末尾添加如下內容:
export JAVA_HOME=your_java_home
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
需要注意的是,設置CLASSPATH環境變量時,等號后面有個點,代表當前目錄。
3)鍵入如下命令,讓環境變量立即生效:
source /etc/profile
4)檢查jdk是否安裝好,鍵入如下命令:
???java -version
結果如下圖所示:
?
?
3.1.2搭建Hadoop環境
Hadoop有多種部署模式,包括本地模式,偽分布式模式和完全分布式模式。
其中,本地模式主要用于本地開發調試;偽分布式模式主要用于學習用途,這種模式是在一臺機器的不同進程上運行Hadoop的各個模塊,偽分布式的意思是雖然各個模塊是在各個進程上分開運行的,但是只是運行在一個操作系統上的,并不是真正的分布式。完全分布式模式是生產環境采用的模式,Hadoop運行在服務器集群上。
這里搭建的是偽分布式模式,過程如下:
1)鍵入如下命令將hadoop軟件包解壓至指定目錄:
tar -zxvf hadoop-2.7.6.tar.gz -C your_hadoop_home
2)鍵入如下命令,給hadoop添加Java環境變量:
vim your_hadoop_home/etc/hadoop/hadoop-env.sh
在hadoop-env.sh文件中設置JAVA_HOME的位置添加如下內容:
export JAVA_HOME=your_java_home
3)修改hadoop配置文件
首先進入hadoop配置文件目錄
cd your_hadoop_home/etc/hadoop
編輯core-site.xml配置文件,在configuration標簽之間添加如下內容:
其中,hadoop.tmp.dir用于設置hadoop存儲臨時文件的目錄。
?
編輯hdfs-site.xml配置文件,添加如下內容:
其中,dfs.name.dir與dfs.data.dir分別用于設置hdfs的namenode和datanode存儲數據。
4)格式化hdfs,命令如下:
your_hadoop_home/bin/hdfs namenode -format
5)鍵入如下命令,啟動hdfs:
your_hadoop_home/sbin/start-dfs.sh
啟動完畢后,使用jps命令可以查看當前運行的Java進程,如下圖所示:
hdfs啟動后,在瀏覽器中輸入如下地址,可以進入hadoop的管理界面:
http://localhost:50070/
如下圖所示:
在網頁的Utilities-Browse the file system子頁面,可以查看當前存儲在hdfs里的內容。
?
3.2實驗步驟
1)準備可執行jar文件
根據實驗要求,使用Java語言編寫程序,程序分為兩個模塊,預處理模和MapReduce迭代模塊。其中,預處理模塊包括Preprocess.java一個源文件,迭代模塊包括Mainjob.java和Node.java兩個源文件。由于程序中使用了Hadoop的類庫,在源文件編譯時需要在classpath中加入Hadoop的類庫所在路徑,使用如下命令進行編譯:
javac Preprocess.java Node.java Mainjob.java -cp `hadoop classpath`
需要注意,hadoop classpath兩邊的是反單引號,通過執行hadoop classpath這一命令,可以返回Hadoop的類庫路徑。
編譯完成后,使用jar命令將兩個模塊編譯生成的類分別打包成兩個jar文件,并命名為preprocess.jar和mainjob.jar。
?
2)上傳輸入文件到HDFS
在hdfs啟動后,首先在hdfs中創建目錄:
your_hadoop_path/bin/hdfs dfs -mkdir -p /BFS/10000EWG/input
然后使用如下命令將欲處理的文件上傳到hdfs:
your_hadoop_path/bin/hdfs dfs -put 10000EWG.txt /BFS/10000EWG/input
?
3)執行程序
在準備好可執行jar文件和待處理的輸入文件后,首先提交預處理程序至Hadoop平臺運行:
your_hadoop_path/bin/hadoop jar preprocess.jar
然后提交執行MapReduce循環迭代程序:
your_hadoop_path/bin/hadoop jar mainjob.jar
?
4)程序運行輸出
預處理程序運行較快,主處理模塊由于包含大量迭代步驟運行較慢,通過程序輸出可知,共迭代了69次(以10000EWG.txt為輸入數據),如下圖所示:
在HDFS中保存了迭代過程中生成的中間文件,如下圖所示:
4實驗結果與數據處理
4.1 MapReduce介紹
MapReduce是由Google提出的一種分布式計算模型,用于解決海量數據的計算問題。MapReduce計算模型的原理是:利用一個輸入key/value對集合來產生一個輸出的key/value對集合。MapReduce庫的用戶用兩個函數表達這個計算:Map()和Reduce()。用戶自定義的Map函數接受一個輸入的key/value對值,然后產生一個中間key/value對值的集合。MapReduce庫把所有具有相同中間key值的中間value值集合在一起后傳遞給Reduce函數。用戶自定義的Reduce函數接受一個中間key的值和相關的一個value值的集合。Reduce函數合并這些具有相同key的value值,從而形成一個較小的key/value對集合。
?
4.2 Dijkstra算法
Dijkstra算法使用了廣度優先搜索解決賦權有向圖或者無向圖的單源最短路徑問題。下面來回顧一下該算法的步驟:
1)把所有結點的標識都設為UNVISITED,距離設為INFINIT。
2)把出發點s的距離設置為0,狀態設置為VISITED。
3)從圖中所有UNVISITED的點中選擇距離最小的結點v。
4)設置v的狀態為VISITED。
5)用v來更新其相鄰結點。若某相鄰結點u的當前距離D[u] > D[v] + weight(v, u),則把u的距離D[u]更新為D[v] + weight(v, u)。
6)重復3到5步的操作,直到所有結點狀態都被設置為VISITED。
?
4.3實驗數據處理
在實驗給出的輸入數據中,每一行表示的是任意兩個頂點間的距離,為了便于使用最短路徑算法,要先對數據進行預處理,使每一行表示頂點到其所有相鄰定點距離的形式。
基于map-reduce的并行最短路徑算法和Dijkstra算法類似,也是基于迭代的思想。它每次迭代執行一個map-reduce job,并且只遍歷一個頂點。在Map中,它先輸出這個頂點的完整鄰接頂點數據,然后遍歷該頂點的鄰接頂點,并輸出該頂點ID及距離。在Reduce中,對當前頂點,遍歷map的輸出權重,若比當前的路徑值小,則更新。最后輸出當前該頂點到其它定點的距離,作為下一次迭代的輸入。
?
總結
以上是生活随笔為你收集整理的Hadoop环境搭建与入门实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓系统应用启动流程分析
- 下一篇: 为什么读书了,还不如那些初中毕业的同学