-
對於各種語言的學習,環境搭建是學習的第一步,本文對Hadoop和Spark的單機及分佈式集羣的環境搭建步驟詳述如下,供大家參考(文章較長,可以只關注自己需要的部分,常見問題及解決方法本文及另一篇博客也有介紹,博客 地址:https://blog.csdn.net/m0_37568814/article/details/80785445)。
一、平臺環境:
虛擬機 VMware Workstation Pro虛擬機操作系統:Ubuntu16.04Windows Server 2008
二、 軟件配套版本包:
jdk-7u80-linux-x64(java version 1.7.0_80)Hadoop 2.6.5
Hadoop-native-64-2.6.0
Scala-2.11.11
Spark-2.1.1-bin-hadoop2.7
三、Hadoop 單機環境及僞分佈式安裝步驟:
1.在 VMware 上新建三個虛擬機(Master,Slave1,Slave2),其中 Master,Slave用於集羣環境的搭建。Slave2 用於 Hadoop 單機環境及僞分佈式環境搭建。
2.在三個虛擬機上分別創建 hadoop 用戶
3.三個虛擬機在 hadoop 用戶下分別安裝 jdk
1) 下載 jdk-7u80-linux-x64.tar.gz,上傳下載包到/opt 目錄。
2) 使用命令tar –xf jdk-7u80-linux-x64.tar.gz解壓壓縮包到當前文件夾。
3) 使用命令配置vim ~/.bashrc配置文件,配置環境變量(詳見下圖),之後使用命令source ./.bashrc 使文件修改生效。
4) 使用命令java –version檢查 jdk 是否安裝成功。
4.更新 apt
5.安裝 vim
6.安裝 SSH,配置 SSH 無密碼登陸
1) 使用命令安裝 ssh server: $sudo apt-get install openssh-server
2) 啓動 SSH 服務
3) 之後使用命令 ssh localhost測試是否成功,使用如下命令設置無密碼登陸。
$exit # 退出剛纔的 ssh localhost
$cd ~/.ssh/ # 若沒有該目錄,請先執行一次 ssh localhost
$ssh-keygen -t rsa # 會有 示,都按回車就可以
$cat ./id_rsa.pub >> ./authorized_keys # 加入授權
7.安裝配置 Hadoop
1) 從官網下載文件 Hadoop2.6.5,上傳到 usr/local 下,配置.bashrc 文件,並使用命令 source ~/.bashrc 使修改生效。
2) 使用命令 hadoop version 檢查 Hadoop 是否安裝成功
8. Hadoop 單機配置(非分佈式),使用如下命令查看單機配置下的執行結果
$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/* # 查看運行結果
至此,Hadoop 單機配置安裝測試完成。
9. 配置 Hadoop 僞分佈式:
1) 按照如下方式編輯文件 vim ./etc/hadoop/core-site.xml
2) 編輯文件 vim ./etc/hadoop/hdfs-site.xml,修改如下
3) 配置完成後,執行 NameNode 的格式化$./bin/hdfs namenode –format,出現以下 status 0 表示格式化成功。
10. 開啓 NameNode 和 DataNode 守護進程 $./sbin/start-dfs.sh
11. 進程開啓後,使用 jps 命令查看節點情況
12. 登陸前臺 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode信息及在線查看 HDFS 中的文件
13. 運行 Hadoop 僞分佈式示例使用以下命令運行及查看示例運行結果:
$./bin/hdfs dfs -mkdir input
$./bin/hdfs dfs -put ./etc/hadoop/*.xml input
$./bin/hdfs dfs -ls input
$./bin/hadoop
jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input
output 'dfs[a-z.]+'
$./bin/hdfs dfs -cat output/*
14. 啓動 YARN
1) 修改配置文件 mapred-site.xml,首先進行重命名:
$mv ./etc/hadoop/mapred-site.xml.template ./etc/hadoop/mapred-site.xml
2) 編輯./etc/hadoop/mapred-site.xml,如下所示
3) 編輯./etc/hadoop/yarn-site.xml 如下所示
4) 修改完成後,啓動 YARN
5) 啓動 YARN 成功後,使用命令 jps 檢查節點信息如下,相比只啓動 hadoop時多了 ResourceManager 和 NodeManager 進程。
15.通過 Web 界面查看任務運行情況:http://localhost:8088/cluster,如下圖所示。
Hadoop 僞分佈式環境搭建完成。
四. Hadoop 集羣安裝配置
1. 集羣環境:一個 master 主機,一個 slave 主機。其中選擇主機 IP 爲115.157.200.152 作爲 master,IP 爲 115.157.200.163 的主機作爲 slave。安裝單機部署的步驟完成以下工作:
· 在 master 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
· 在 master 節點上安裝 Hadoop,並完成配置
· 在其他 slave 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境· 將 master 節點上的 /usr/local/hadoop 目錄複製到 slave 節點上
· 在 master 節點上開啓 Hadoop
2. 檢查主機名稱是否爲 master 和 slave,如果不是,修改配置文件/etc/hostname和/etc/hosts,修改完成後 reboot 重啓服務器。
3. 按照單機部署方式安裝 jdk,配置 SSH 登陸,配置 Hadoop。集羣/分佈式模式需要修改 /usr/local/hadoop/etc/hadoop 中的 5 個配置文件,更多設置項可點擊查看官方說明,這裏僅設置了正常啓動所必須的設置項:core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves。
1) 修改如下:core-site.xml
2) 修改 hdfs-site.xml
3) mapred-site.xml
4) yarn-site.xml
5) slaves
4. 配置好後,將 master 上的 /usr/local/hadoop 文件夾複製到 slave 節點上。因爲之前有跑過僞分佈式模式,建議在切換到集羣模式前先刪除之前的臨時文件。
1) 在 master 節點上執行:
$cd /usr/local
$sudo rm -r ./hadoop/tmp # 刪除 Hadoop 臨時文件
$sudo rm -r ./hadoop/logs/* # 刪除日誌文件
$tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮再複製
$cd ~
$scp ./hadoop.master.tar.gz slave1:/home/hadoop
2) 在 slave1 節點上執行:
$sudo rm -r /usr/local/hadoop # 刪掉舊的(如果存在)
$sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
$sudo chown -R hadoop /usr/local/hadoop
5. 首次啓動需要先在 master 節點執行 NameNode 的格式化:
$ hdfs namenode -format # 首次運行需要執行初始化,之後不需要
6. 啓動 hadoop,在 master 節點上進行:
$start-dfs.sh
$start-yarn.sh
$mr-jobhistory-daemon.sh start historyserver
7. 通過命令 jps 可以查看各個節點所啓動的進程。
1) 啓動成功,在 master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程,如下圖所示:
2) 在 slave 節點可以看到 DataNode 和 NodeManager 進程,如下圖所示:
3) 在 master 節點上通過命令 hdfs dfsadmin -report 查看 DataNode 是否正常啓動,如果 Live datanodes 不爲 0 ,則說明集羣啓動成功。
8. 通過 Web 頁面看到查看 DataNode 和 NameNode 的狀態:http://master:50070/。
9. 在 Hadoop 分佈式集羣上運行示例如下。命令類似於僞分佈式集羣。
$hdfs dfs -mkdir -p /user/hadoop
$hdfs dfs -mkdir input
$hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
$hadoop jar
/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.j
ar grep input output 'dfs[a-z.]+'
10. 通過 Web 界面查看任務進度 http://master:8088/cluster,在 Web 界面點擊 Tracking UI 這一列的 History 連接,可以看到任務的運行信息,如下圖所示:
至此,Hadoop 集羣搭建完成。
五. Spark 集羣的搭建
分別在 master 和 slave 機器上完成 scala 和 spark 的安裝。
1. scala 安裝:
1) 下載scala-2.11.11.tgz,解壓到 /opt 目錄下,即:/opt/scala-2.11.11。
2) root 用戶修改 scala-2.11.11 目錄所屬用戶和用戶組爲 hadoop,使用命令 sudo chown -R hadoop:hadoop scala-2.11.11,修改環境變量 vim ~/.bashrc,添加如下內容:
3) 添加完成後,使用命令 source ~/.bashrc 使其生效。
4) 測試 scala 安裝是否成功,出現如下所示界面,測試驗證成功。
2. Spark 的安裝:
1) 下載 Spark-2.1.1-bin-hadoop2.7.tgz,解壓到 /opt 目錄下並重命名爲spark。
修改 spark 目錄所屬用戶和用戶組$sudo chown -R hadoop:hadoop spark。
2) 修改環境變量 vim ~/.bashrc,添加如下內容:
3) 添加完成後,使用命令 source ~/.bashrc 使其生效。
4) 進入 Spark 安裝目錄下的 conf 目錄,拷貝 spark-env.sh.template到 spark-env.sh。cp spark-env.sh.template spark-env.sh
編輯 spark-env.sh,在其中添加以下配置信息:
SCALA_HOME:指定 Scala 安裝目錄;
JAVA_HOME:指定 Java 安裝目錄;
SPARK_MASTER_IP:指定 Spark 集羣 master 節點的 IP 地址;SPARK_WORKER_MEMORY: 指 定 的 是 Worker(Slave) 節 點 能 夠 分 配 給Executors 的最大內存大小;
HADOOP_CONF_DIR:指定 Hadoop 集羣配置文件目錄。
5) 將 slaves.template 拷貝到 slaves, 編輯其內容爲:
4. 啓動 Spark 集羣
1) 啓動 hadoop 集羣:在 hadoop 安裝目錄下,用命令./sbin/start-dfs.sh 啓動hadoop 集羣,用 jps 命令分別在 master 和 slave 上查看進程信息(參考 hadoop集羣搭建相關介紹)。
2) 啓動 spark 集羣,在 master 節點上運行 start-master.sh,結果如下:
可以看到 master 上多了一個新進程 Master。
3) 在 master 節點上啓動 worker(這裏即爲 slave),運行 start-slaves.sh,結果如下:
可以看到,多了一個 Worker 進程。
4) 前臺界面查看 Spark 集羣信息。瀏覽器中輸入:http://master:8080, 如下圖:
5) 運行 spark-shell,可以進入 Spark 的 shell 控制檯,如下:
6) 瀏覽器訪問 SparkUI
瀏覽器中輸入: http://master:4040, 如下圖:
可以從 SparkUI 上查看一些 如環境變量、Job、Executor 等信息。至此,整個 Spark 分佈式集羣的搭建完成。
7) 停止集羣時,運行 stop-master.sh 來停止 Master 節點, 之後運行可以停止所有的 Worker 節點,Worker 進程停止完成後,最
後使用命令 停止 Hadoop 集羣。
六. Spark 示例分析
1. 編寫一個 Spark 應用程序,對某個文件中的單詞進行詞頻統計。hadoop 用戶下執行如下命令:
stop-slaves.sh
$cd /opt/spark
./sbin/stop-dfs.sh
$mkdir anmycode
$cd anmycode
$mkdir wordcount
$cd wordcount
$vim word.txt
-
使用命令 spark-shell 啓動 spark-shell 如下所示表示成功:
-
在 spark 終端,輸入如下命令:
scala>val textFile = sc.textFile("file:///opt/spark/anmycode/wordcount/word.txt")
scala>textFile.first()
first()是一個“行動”(Action)類型的操作,會啓動真正的計算過程,從文件中加載數據到變量 textFile 中,並取出第一行文本。屏幕上會顯示很多反饋信息,這裏不再給出,你可以從這些結果信息中,找到 word.txt 文件中的第一行的內容。Spark 採用了惰性機制,在執行轉換操作的時候,即使我們輸入了錯誤的語句,spark-shell 也不會馬上報錯,而是等到執行“行動”類型的語句時啓動真正的計算,那個時候“轉換”操作語句中的錯誤就會顯示出來。如下所示:
4. 加載 HDFS 中的文件(參考 Hadoop 搭建介紹)
cd /opt/hadoop
./sbin/start-dfs.sh
./bin/hdfs dfs -mkdir -p /user/hadoop
注意:這個目錄是在 HDFS 文件系統中,不在本地文件系統中。創建好以後,下面我們使用命令查看一下 HDFS 文件系統中的目錄和文件:
./bin/hdfs dfs -ls .
5. 切換回到 spark-shell 窗口,編寫語句從 HDFS 中加載 word.txt 文件,並顯示第一行文本內容:
scala>val textFile = sc.textFile("hdfs://master:9000/user/hadoop/word.txt")
scala>textFile.first()
6) 將 HDFS 上的文本保存到 write back 目錄下,並查看
6. 詞數統計:
scala>val textFile = sc.textFile("file:///opt/spark/anmycode/wordcount/word.txt")
scala>val wordCount = textFile.flatMap(line => line.split(" ")).map(word => (word,
1)).reduceByKey((a, b) => a + b)
scala>wordCount.collect()
測試完成。
七. 常用命令
常用 Hadoop 命令
1. 啓動Hadoop(NameNode 和 DataNode 守護進程):
$hdfs namenode -format # 首次運行需要執行初始化,之後不需要
$ ./sbin/start-dfs.sh
2. 關閉 Hadoop:./sbin/stop-dfs.sh
3. 啓動yarn: 先啓動Hadoop,再使用命令 ./sbin/start-yarn.sh
4. 關閉yarn:
1) ./sbin/stop-yarn.sh
2) ./sbin/mr-jobhistory-daemon.sh stophistoryserver
5. 查看hadoop版本:/usr/local/hadoop下使用./bin/hadoopversion
6. 測試命令:/usr/local/hadoop下使用
./bin/hadoopjar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output'dfs[a-z.]+’
7. 查看運行結果的命令(查看的是位於 HDFS中的輸出結果):
./bin/hdfs dfs -cat output/*
8. 集羣的Master節點啓Hadoop
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
9. 查看各個節點所啓動的進程jps
常用Spark命令:
-
啓動 Master 節點: Master主機上:start-master.sh
-
啓動所有 Worker 節點:Master主機運行:start-slaves.sh
-
運行 spark-shell,可以進入 Spark 的 shell 控制檯
-
測試命令:Spark中運行示例程序JavaWordCount.java,程序所在目錄如下
(Spark安裝目錄):./examples/src/main/java/org/apache/spark/examples/JavaWordCount.java
常用Hadoop&YARN web界面URL:
1. http://localhost:50070 ---查看 NameNode 和 Datanode 信息,在線查看HDFS 中的文件
2. 查看任務的運行情況http://localhost:8088/cluster(單機)http://master:8088/cluster(集羣)
常用Spark web界面URL:
-
http://master:8080---瀏覽器查看 Spark 集羣信息
-
http://master:4040---瀏覽器訪問 SparkUI
八. 遇到的問題及解決方法
1. 虛擬機 root用戶默認密碼修改: sudo passed 回車修改密碼
-
hostname設置(master,slave1),修改/etc/hosts和/etc/hostname
-
ping命令無法使用:虛擬機設置,選擇網絡連接方式(橋接方式)
-
ssh命令報錯: connect to host slave1 port 22: Connection refused
解決方法:安裝並啓動ssh服務,安裝如下:apt-get install -f
apt-get install openssl-client---ubuntu 默認安裝
apt-get install openssl-server
sudo /etc/init.d/ssh start—啓動 ssh 服務
-
安裝jdk時,手動下載軟件包(jdk1.7版本:jdk-7u80-linux-x64),之後配置./bashrc文件。
-
安裝過程中啓動hadoop時報JAVA_HOME路徑找不到。 解決方法:檢查~/bashrc 設置正確。檢查設置hadoop的安裝路徑下:/usr/local/hadoop/etc/hadoop中的hadoop-env.sh中JAVA_HOME需要設置爲jdk所在的目錄。
-
運行hdfs在/user下新建hadoop文件夾時報錯:Unable to load native-hadooplibrary for your platform... using builtin-java classes where applicable解決方法:下載對應的native-hadoop 64位的包,解壓到hadoop安裝目錄下的lib和lib/native下,配置環境變量,並令其生效即可。
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
-
運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如output)不能存在,否則會 示錯誤,因此運行前需要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上如下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操作
Configuration conf = new Configuration(); Job job = new Job(cont);
/* 刪除輸出目錄 */
Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true); -
./sbin/start-dfs.sh啓動hadoop時,報以下錯誤'/usr/local/hadoop/logs':Operation not permitted 解決方式:檢查/usr/local/hadoop/logs宿主爲root用戶,原因:chown -Rhadoop:hadoop hadoop/ 最後沒加”/" 。 root用戶修改/usr/local/hadoop/logs宿主爲hadoop用戶(chown -R hadoop hadoop/)即可。
10. 運行示例時,一直停留在如下界面,程序運行阻塞。
解決方法:增加虛擬機內存(從1G—>2G:OK) 即可。
九. 總結
學習入手各門語言或者框架,搭建環境是個基本的過程,也是學習的第一步。搭建環境過程中可能遇到各種問題,如:版本匹配問題,權限問題,莫名其妙的報錯甚至連報錯也沒有的奇葩問題等等。
好的安裝指導或資料能給我們帶來很多方便。如果安裝過程中遇到上訴各種問題,對於不同的問題,解決方式也不同。版本匹配問題,下載對應的版本重新安裝即可。建議到官網下載版本,版本比較權威,後續搭建環境過程中因爲版本出問題的可能性較小,省去一些不必要的麻煩。有報錯的問題,根據報錯信息耐心檢查或者網上搜索資料,跟同學們一起討論,這類問題往往都可以找到解決方法。對於一些莫名其妙的問題,如果沒有具體報錯信息,把問題現象 述清楚,到各大論壇(個人習慣:百度,CSDN,stackoverflow等)去找類似問題,耐心找找,也可以找到一些線索,或者供一些idea給我們。搭建環境如此,後續學習也是如此。