前言 1.操作系統為Centos7 2.所有操作都是使用root用戶去操作。也可以使用其他用戶,非root的話要註意操作的許可權問題。 3.安裝的Hadoop版本是2.6.5,Spark版本是2.2.0,Scala的版本是2.11.8。 如果安裝的Spark要同Hadoop搭配工作,則需註意他們之間的 ...
前言
1.操作系統:Centos7
2.安裝時使用的是root用戶。也可以用其他非root用戶,非root的話要註意操作時的許可權問題。
3.安裝的Hadoop版本是2.6.5,Spark版本是2.2.0,Scala的版本是2.11.8。
如果安裝的Spark要同Hadoop搭配工作,則需註意他們之間的版本依賴關係。可以從Spark官網上查詢到Spark運行需要的環境,如下:
4.需要的安裝包:
安裝包下載地址:
JDK: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Hadoop2.6.5:http://archive.apache.org/dist/hadoop/common/hadoop-2.6.5/
Scala2.11.8:https://www.scala-lang.org/download/all.html
Spark2.2.0:http://archive.apache.org/dist/spark/spark-2.2.0/
1.基礎環境配置
1.1集群規劃:
伺服器 |
進程 |
||||||||
Hostname |
IP |
配置 |
Namenode |
SecondaryNamenode |
Datanode |
ResourceManager |
NodeManager |
Master |
Worker |
Hadoop1 |
192.168.137.21 |
1G記憶體、1核 |
√ |
√ |
|
√ |
|
√ |
|
Hadoop2 |
192.168.137.22 |
1G記憶體、1核 |
|
|
√ |
|
√ |
|
√ |
Hadoop3 |
192.168.137.23 |
1G記憶體、1核 |
|
|
√ |
|
√ |
|
√ |
註:因為我自己的筆記本配置並不高,所以這裡給每台虛擬機分配的資源都很少,可以的話應儘量分配多一點的資源。
1.2所有節點都增加ip和機器名稱的映射關係,且3個節點可以相互ping通。
命令:
vim /etc/hosts
在文件中加入如下內容
192.168.137.21 hadoop1 192.168.137.22 hadoop2 192.168.137.23 hadoop3
如下:
1.3所有節點關閉防火牆
查看防火牆狀態:
systemctl status firewalld
關閉防火牆:
systemctl stop firewalld systemctl disable firewalld
如下:
1.4 SSH免密登錄設置
SSH免密登錄設置參考:https://www.cnblogs.com/suhaha/p/9071216.html。
通過配置,使得hadoop1、hadoop2、和hadoop3之間都可以相互免密登錄(至少要使得hadoop1可以免密登錄hadoop2和hadoop3)。
1.5配置NTP
這一步在測試環境中可有可無。生產環境的話,畢竟集群之間需要協同工作,幾個節點之間的時間同步還是比較重要的。
集群中配置NTP可參考:http://www.cnblogs.com/suhaha/p/8552897.htm
1.6配置JDK(所有節點)
JDK的配置可參考:https://blog.csdn.net/qian_feifei/article/details/75195016
如下:
註:到這一步,基礎環境算是配置好了,這時可以給各個節點做個快照,後面步驟出錯了也可以快速恢復。
2.安裝Hadoop
下麵的2.1~2.2的步驟在所有節點上都要如此操作。我們先在hadoop1上做這些操作,然後在2.3步用scp命令將配置好的hadoop文件發送到hadoop2、hadoop3節點。
2.1解壓安裝包到/usr/local/目錄下(hadoop1上操作)
命令:
cd /data/soft tar -xvf hadoop-2.6.5.tar.gz -C /usr/local/
如下:
2.2進入到/usr/local/hadoop-2.6.5/etc/hadoop目錄下,修改配置文件。(hadoop1上操作)
2.2.1配置hadoop-env.sh
命令:
vim hadoop-env.sh
在hadoop-env.sh中修改JAVA_HOME
export JAVA_HOME=/usr/local/jdk
如下:
註:需根據實際java路徑進行修改
2.2.2配置core-site.xml
命令:
vim core-site.xml
在文件中加入如下內容
<property> <name>fs.defaultFS</name> <value>hdfs://hadoop1:9000</value> </property>
如下:
2.2.3配置hdfs-site.xml
命令:
vim hdfs-site.xml
在文件中加入如下內容
<property> <name>dfs.replication</name> <value>2</value> </property>
如下:
註:該文件其實也可以保持預設,其他個性化操作比如有:
<property> <name>dfs.namenode.name.dir</name> <value> /bigdata/dfs/name</value> <description>需要創建相應的/bigdata/dfs/name目錄</description> </property> <property> <name>dfs.datanode.data.dir</name> <value> /bigdata/dfs/data</value> <description>需要創建相應的/bigdata/data/name目錄</description> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property>
2.2.4配置yarn-site.xml
命令:
vim yarn-site.xml
在文件中添加如下內容
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>hadoop1:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>hadoop1:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop1:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop1:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop1:8088</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property>
如下:
註:
可以看到上面有許多埠的配置,網上很多文章的教程中是沒有的,這是因為這些埠預設就是8032、8031這樣,感覺沒有必要顯式地再次配置。
最開始我也沒配,結果出錯了,出錯的情形表現為:通過主節點可以啟動yarn集群,子節點上有NodeManager進程,但是,在http://192.168.137.22:8088/cluster/nodes頁面卻沒有顯示子節點的信息,同時在主節點上通過yarn node -list -all命令查看也沒有子節點的信息。然後在nodemanager節點的相關日誌日誌文件里(/usr/local/hadoop-2.6.5/logs/yarn-root-nodemanager-hadoop2.log)有org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031異常,如下圖一所示。我的理解是,因為在yarn-site.xml文件中沒有顯式地將這些埠配置出來的原因,導致子節點無法向主節點註冊(Registered)——然後,從報錯的信息看貌似是只要把8031埠配置上了就可以了,其實也不是so easy的……如果不配置其他埠,則提交spark-on-yarn任務的時候會無限地卡在ACCEPTED狀態上,卡在該狀態上的日誌我看不出問題來,但是確實把上面的埠都配置了之後就好了。
因此,最好是將這些埠都顯式配置好!!!
圖一:
註:判定上圖信息是異常的原因,是因為子節點要去連接主節點,它需要連接到正確的主節點IP才行,而上圖中連接的卻是0.0.0.0——在子節點上,0.0.0.0的IP代表的是子節點自己,它連接錯了,自然無法向主節點註冊。
關於最後兩項配置
yarn.nodemanager.pmem-check-enabled:是否啟動一個線程檢查每個任務正使用的物理記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true;
yarn.nodemanager.vmem-check-enabled:是否啟動一個線程檢查每個任務正使用的虛擬記憶體量,如果任務超出分配值,則直接將其殺掉,預設是true。
因為我實驗時給3台機器分配的資源都很少,所以必須得設置它們都為false,否則運行yarn程式的時候會報如下錯誤。
報錯是因為,執行程式時,yarn對於機器能分配的資源進行了檢查,結果發現運行程式需要的資源超出了機器所能分配資源的上限,然後就粗錯了。如果把上面兩項設置為false,則運行程式時就不會去進行對應的資源檢查了,此時雖然機器能分配的資源依然不足,但是yarn不會像之前那樣立馬把container幹掉了,而是會花較長的時間才能把程式跑完。
2.2.5配置mapred-site.xml
命令:
cp mapred-site.xml.template mapred-site.xml vim mapred-site.xml
文件中加入如下內容
<property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
註:這裡指定運行mapreduce程式時使用yarn作為資源調度器。
若運行mapreduce程式時不需要以yarn作為資源調度器的話也可以不配置此項,不會出錯,也不會影響Spark以spark-on-yarn模式運行spark程式。
2.2.6配置slaves
命令:
vim slaves
在文件中加入如下內容
hadoop2 hadoop3
如下:
註:本次配置中hadoop1是管理節點,hadoop2和hadoop3是數據節點。如果如果想使得hadoop1既是管理節點又是數據節點,可以把hadoop1也寫到slaves文件中來。
2.3將hadoop1上配置好的hadoop文件分發到hadoop2和hadoop3節點上(hadoop1上操作)
命令:
scp -r /usr/local/hadoop-2.6.5 root@hadoop2:/usr/local/ scp -r /usr/local/hadoop-2.6.5 root@hadoop3:/usr/local/
2.4修改環境變數,在hadoop1上執行以下命令
命令:
vim /etc/profile
在文件中添加如下內容:
export HADOOP_HOME=/usr/local/hadoop-2.6.5 export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
用source /etc/profile命令使修改的環境變數生效,接著用which hdfs命令查看是否修改成功。
2.5配置完成,接著格式化hdfs
在主節點hadoop1上執行以下命令
hdfs namenode -format
如下:
註:命令執行完之後從結果上很難看出是否格式化成功了,這時可以緊接著通過echo $? 命令查看hdfs namenode -format命令是否執行成功。如果輸出0,則說明上一條執行成功,如上圖所示。
2.6啟動hdfs,在hadoop1上執行以下命令
cd /usr/local/hadoop-2.6.5/sbin ./start-dfs.sh
如下:
2.7驗證hdfs是否啟動成功
方法一:
在主節點hadoop1上用jps命令查看是否存在SecondaryNameNode和NameNode進程:
在任一子節點上用jps命令可以查是否存在DataNode進程
由上面兩張圖的查詢結果可知,在相應節點上可以查看到相應的SecondaryNameNode、NameNode和DataNode進程。如此,可以認為,從主節點上可以成功啟動hdfs集群了。
但是是否一定沒有問題了呢?不一定。
我們知道,hadoop集群啟動成功之後,子節點會定時向主節點發送心跳信息,主節點以此判斷子節點的狀態。所以,有時即使我們通過主節點啟動hadoop集群成功了,使用jps命令也能查詢到相應的SecondaryNameNode、NameNode和DataNode進程——但如果由於某些原因,比如某個子節點的某個配置配錯了,如我搭建時的情況是子節點的core-site.xml文件中fs.defaultFS項配置錯了,或者是由於防火牆的原因,又或者是由於前面格式化次數太多了出問題導致子節點的cluster_id跟主節點的cluster_id不一致——導致子節點無法向主節點發送心跳信息,那麼對主節點來說,該子節點就是dead的了。
於是,作為進一步驗證的方法,是在主節點上使用hdfs dfsadmin -report來觀察集群配置情況。如下:
方法二:
通過本地瀏覽器查看192.168.137.21:50070,驗證否部署成功
註:一定要在頁面看到所有子節點信息才算hdfs集群沒有問題。
2.8啟動yarn,在hadoop1上執行以下命令
cd /usr/local/hadoop-2.6.5/sbin ./start-yarn.sh
如下:
2.9驗證yarn是否啟動成功
方法一:
在主節點上用jps命令查看是否有ResourceManager進程
在子節點上用jps命令查看是否有NodeManager進程
由上面兩張圖可以看到相應的ResourceManager和NodeManager進程已經啟動起來了。
但是,同樣還不能認為yarn集群就沒有問題了,原因如2.2.4中所說的那樣(即:可能由於某些原因,導致子節點在啟動之後卻無法向主節點註冊)。
因此,保險起見,應在主節點上再通過yarn node -list -all命令查看一下。如下:
如上圖所示,說明yarn啟動成功。
如果像下圖一那樣,說明yarn集群是有問題的——這種時候如果提交了以yarn作為資源調度器的Spark任務,則任務會永遠卡在ACCEPTED狀態(如下圖二),這是因為此時yarn集群只剩下ResourceManager這個光桿司令了,沒有資源可以給它調度,所以它會一直卡在分配資源的狀態下,要命的是它會一直很頑強地不斷地努力嘗試分配資源,還不報錯......
圖一:
圖二:
方法二:
通過本地瀏覽器訪問192.168.137.21:8088,查看yarn是否正常工作
如上圖,在頁面上能看到子節點的信息,說明yarn集群沒有問題。如果像下圖這樣,說明你的yarn集群是有問題的。
2.10 hadoop集群驗證
經過前面的步驟,簡單的hadoop集群已經搭建完畢,接下來利用hadoop自帶的jar包執行一個wordcount的mapreduce程式進行驗證。
(1)首先在linux系統中有一個hello.txt文件,文件的內容如下所示
(2)接下來在hdfs中新建一個目錄input,然後將hello.txt上傳到該目錄下
命令:
hadoop fs -mkdir /input hadoop fs -put /data/my_jar/hello.txt /input
使用hadoop fs -ls -R /input命令可以看到已經將hello.txt文件放到hdfs上了
使用hadoop fs -text /input/hello.txt命令可以看到hdfs中hello.txt文件的內容
(3)輸入已經準備好了。接下來使用以下命令執行wordcount例子程式。
命令:
hadoop jar /usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar wordcount /input /output
註:
(1)由於我們前面已經配置mapred-site.xml文件使得mapreduce程式使用yarn作為資源調度器,因此在執行命令時,可以在http://192.168.137.21:8088/cluster/apps頁面上看到相應的application信息。
(2)該命令使用的是hadoop自帶的jar包:/usr/local/hadoop-2.6.5/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.5.jar
(3)註意到到命令的最後兩個參數/input和/output——程式將讀取hdfs中的/input目錄下的文件作為輸入,最後將運算結果保存在hdfs的/output目錄下。
(4)註意執行命令前需保證/output目錄不存在,否則將會報錯。
如下:
註:由上圖的Connecting to ResourceManager at hadoop1/192.168.137.21:8032可以看出此次運行的mapreduce程式使用yarn作為資源調度器。
在yarn的http://192.168.137.21:8088/cluster/apps頁面上可以看到相應的application信息(下圖的第二個application):
註:由圖中的Application Type可以看出這裡跑的是mapreduce程式,如果是以spark-on-yarn模式跑的Spark程式,則這裡的顯示會是SPARK,如上圖的第一個application所示。
(4)查看輸出
由命令我們知道,該mapreduce程式將運算結果保存在了/output目錄下
命令:
hadoop fs -ls -R /output hadoop fs -text /output/part-r-00000
如下:
(5)剛纔跑的mapreduce程式是用yarn來做資源調度的,而該程式之所以會以yarn作為資源調度器,是因為前面在第2.2.5步驟中配置了mapred-site.xml,指定mapreduce程式運行時以yarn作為資源調度器。
倘若在2.2.5步中沒有如此指定,則mapreduce程式照樣可以運行,如下圖所示。
不過此時的mapreduce程式就不是以yarn作為資源調度器了,並且這時候yarn甚至都可以不啟動。
3.安裝Spark
Spark的安裝跟hadoop(包括yarn)是相對獨立的,即使是需要以spark-on-yarn模式運行Spark程式。Spark和hadoop的關係,不像hadoop和jdk之間的關係那樣——安裝hadoop之前必須配置好jdk,但安裝Spark之前並不必須得先安裝hadoop。
Spark和hadoop的關係,更像是你和樓下飯店的關係,當你自己做飯吃的時候,樓下飯店存不存在是與你無關的;只有當你不自己做飯了,你才需要樓下有家飯店。拿Spark來說,就是:如果只是需要以local或者standalone模式運行Spark程式,那麼集群中有沒有安裝hadoop都無關緊要;只有當Spark程式需要以spark-on-yarn模式運行或者需要讀取hdfs中的文件時,它才需要hadoop的存在。所以如果沒有以spark-on-yarn模式運行Spark程式的需求的話,可以不安裝第2步中的hadoop環境,不過第1步的基礎環境還是需要配置的。——這是我初學Spark時一直迷糊的一個點,希望這裡說明清楚了。
3.1安裝Scala
關於安裝Spark之前要不要安裝scala?其實我也不確定。有教程說不用安裝,因為Spark安裝包中自帶scala了。也有的教程說需要先安裝scala。
對於我來說,首先因為安裝scala也沒多難,其次後期我還要用scala來開發Spark程式,所以也就安裝了。
不管怎樣,安裝步驟如下。
3.1.1用root用戶解壓scala安裝包到/usr/local目錄下(hadoop1上操作)
命令:
cd /data/soft tar -xvf scala-2.11.8.tgz -C /usr/local/
3.1.2將解壓後的scala目錄拷貝到hadoop2和hadoop3(hadoop1上操作)
命令:
scp -r /usr/local/scala-2.11.8 root@hadoop2:/usr/local/ scp -r /usr/local/scala-2.11.8 root@hadoop3:/usr/local/
3.1.3分別在三台虛擬機上修改環境變數:
命令:
vi /etc/profile
加入如下內容
export SCALA_HOME=/usr/local/scala-2.11.8 export PATH=$PATH:$SCALA_HOME/bin
如下:
3.1.4使修改的環境變數生效
命令:
source /etc/profile
接著用which scala命令查看scala的安裝目錄是不是我們想要的
3.1.5測試是否安裝成功
命令:
scala
或者
scala -version
3.2安裝Spark(hadoop1上操作)
3.2.1解壓Spark安裝包到/usr/local/目錄下
命令:
cd /data/soft tar -xvf spark-2.2.0-bin-hadoop2.6.tgz -C /usr/local/
3.2.2參數配置
3.2.2.1配置slaves
命令:
cd /usr/local/spark-2.2.0-bin-hadoop2.6/conf cp slaves.template slaves vim slaves
寫入如下內容
hadoop2 hadoop3
如下:
3.2.2.2配置spark-env.sh
命令:
cp spark-env.sh.template spark-env.sh vi spark-env.sh
在文件中加入以下內容:
export JAVA_HOME=/usr/local/jdk export HADOOP_HOME=/usr/local/hadoop-2.6.5 export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop export SPARK_MASTER_HOST=hadoop1 export SPARK_MASTER_PORT=7077
如下:
註:
1) JAVA_HOME是一定要配置的
2) 配置HADOOP_HOME和HADOOP_CONF_DIR是因為,之後我需要以spark-on-yarn模式運行Spark程式,配置HADOOP_CONF_DIR才能使得Spark可以找到正確的hadoop環境,否則每次以spark-on-yarn模式運行Spark程式時都需要手動export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.5/etc/hadoop才行。如果只想以local或standalone模式運行Spark程式,則這兩項可以不配置。
3) 至於SPARK_MASTER_HOST和SPARK_MASTER_PORT,感覺沒有必要顯式地配置,因為人家使用預設值也是沒有問題的,但是我還是配上了,不配置的話會不會有問題我就不知道了。
3.2.3將配置好的spark文件拷貝到hadoop2和hadoop3節點上
命令:
scp -r /usr/local/spark-2.2.0-bin-hadoop2.6 root@hadoop2:/usr/local/ scp -r /usr/local/spark-2.2.0-bin-hadoop2.6 root@hadoop3:/usr/local/
3.2.4在hadoop1節點上配置環境變數
命令:
vim /etc/profile
在文件中加入以下內容:
export SPARK_HOME=/usr/local/spark-2.2.0-bin-hadoop2.6 export PATH=$PATH: ${SPARK_HOME}/bin
如下:
註:這裡之所以沒有在PATH中加入${SPARK_HOME}/sbin,是因為該目錄和$HADOOP_HOME/sbin目錄下都存在start-all.sh和stop-all.sh腳本,如果在PATH中加入${SPARK_HOME}/sbin,當然也是沒有問題的,但是有可能會產生誤操作(有時候你想關閉Spark集群,於是在任意位置執行stop-all.sh命令,極有可能就把hadoop集群給關咯),所以為了避免這種情況,乾脆不配置了,當要執行start-all.sh和stop-all.sh時再手動切換到${SPARK_HOME}/sbin目錄下去執行即可。
使修改的環境變數生效:
source /etc/profile
3.2.5啟動spark集群
命令:
cd /usr/local/spark-2.2.0-bin-hadoop2.6/sbin ./start-all.sh
如下:
3.2.6 通過網頁192.168.137.21:8080查看是否成功
註:同樣也是要在頁面上看到所有的Woker子節點的信息才算是成功了。
3.3運行spark程式測試
安裝完Spark之後,應該測試一下安裝的Spark在local模式、standalone模式和spark-on-yarn模式下是否等能成功運行程式。
對於安裝的Spark集群,有必要測試一下Spark程式是否可以以standalone模式運行。
倘若以後需要以spark-on-yarn模式進行開發,則spark-on-yarn模式的測試也非常有必要,因為有的時候雖然yarn集群啟動成功了,但是由於yarn預設參數配置不一定適合你當時的集群硬體配置,極有可能是有問題的,只有跑一個程式測試一下才能試出問題來。
Spark中也自帶了測試例子,測試方式參考:https://blog.csdn.net/pucao_cug/article/details/72453382
至此,配置完成。