云平臺及監控工具的部署流程
說在前面的話
云平臺的基礎搭建流程是一項基本但又必備的技能,從大四做畢業設計到研究生在實驗室集群搭建hadoop及spark再到參與某為公司大型集群性能預測項目,可以說對于這一部分的搭建工作,真的是閉著眼不參考任何資料可以在很短時間內完成。
本篇博客將完整地介紹Hadoop+Spark+hive+Ganglia+Nagios+Nmon的搭建流程,涉及到的內容較多,因此打算分為兩部分進行總結。本次先介紹基礎的云平臺的搭建。
效果預覽
先貼上最終搭建完成后Web端的圖吧。
Hadoop HDFS界面
Hadoop NM界面
Spark界面
Hive database查看
Hive 創建表
Hive 表查詢
Ganglia整體集群監控圖(以CPU為例)
Ganglia單節點CPU監控圖
Ganglia對Hadoop的監控(以heartbeat為例)
Nagios對集群的整體預警效果
Nagios對單節點的預警效果
Nagios對各個主機服務及進程的預警效果
Nagios對各個主機健康情況的監控情況
生產環境下是需要使用各類監控工具對集群整體進行健康預警的。除此之外,其實有很多開源的項目可以集成這些工具,例如:Ambari等,國內騰訊華為也有相關的一些產品,不過貌似用于商業的,自己用的話Ambari是比較好的選擇,另外就是傳統的Ganglia和Nagios。
環境配置
我使用了實驗室的十臺DELL服務器進行搭建,配置不算太高,畢竟服務器年事已高,但10臺一起還是能夠應付了日常研究和學習的。因為需要環境的同態,所以事先全部進行CentOS6.5的重新安裝。系統安裝就不介紹啦,畢竟大家都是搞IT的。
軟件環境:
Hadoop-2.7.3
Spark-2.1.0
Hive-2.1.1
Ganglia-3.7.1
Nagios-3.5.1
10臺節點劃分:1臺master,9臺數據節點
Hadoop+Spark部署
第一步 準備安裝包
在Apache官網下載自己想要的版本,當然現在spark最新穩定版到2.2.0了,我們這里使用hadoop-2.7.3和spark-2.1.0. 下載.tgz的壓縮包,Spark下載編譯好的版本,如果自己要自己編譯,也可以使用未編譯版本,然后使用SBT或是Maven進行手動編譯即可,這里我們直接使用編譯版本spark-2.1.0-bin-hadoop2.7.tgz即可。除此之外,需要下載JDK-Linux, 1.8版本及以上都可以,還有Scala-Linux,2.11及以上都可以,同樣進行相同目錄的解壓。
下載好后可使用FTP工具將壓縮包上傳到集群主節點(先在主節點將各種配置文件修改好后可以分發到各個數據節點)
我這里在主節點root用戶下,進入/home/下創建了 /cluster 目錄,用戶安裝全部所需的包。
將hadoop和spark壓縮包解壓至/home/cluster下,解壓過后分別對應文件名:hadoop-2.7.3 和 spark-2.1.0
第二步 SSH免密碼
網上其他帖子都先安裝了ssh免密鑰服務,其實只要還沒有分發文件,什么時候配置這個都是可以的。
ssh服務提供一個各個機器之間方便訪問以及通信的功能,試想一下,假如沒有這樣一個東東,那么我們的hadoop啟動時就會彈出數次要求輸入密碼的提示,這都不算啥,你敢想象啟動后發送心跳還得手動輸密碼有多煩不,因此,需要配置一下ssh。
配置方法網上都有,不過首先先進入~/.ssh目錄下,將其內容全部清空,然后敲入 ssh-key gen -t RSA,然后一直回車即可,你會看到~/.ssh目錄下會產生id_rsa , id_rsa.pub這倆文件,同樣的操作在次節點執行一次,將次節點的id_rsa.pub通過scp命令發送到主節點(隨便間隔文件夾先存著,如果要放入主節點的/.ssh目錄下,請提前修改其他節點傳過來的id_ras.pub的名字,例如修改為id_rsa_node01.pub即可)。與此同時,請先在主節點的/.ssh目錄下手動創建一個authorized_key文件。( scp命令格式如下:)
scp ~/.ssh/id_rsa.pub root@sist01:~/sshkey/sist02_id_rsa.pub
(其中sist01是主節點,實例代碼是從sist02中遠程拷貝id_rsa.pub到主節點sist01中)
待全部拷貝到主節點后, 依次將次節點和主節點的這些id_rsa.pub的內容追加進主節點~/.ssh下的authorized_key文件中,追加內容的代碼如下所示:
cat sshkey/id_rsa.pub>> ~/.ssh/authorized_keys
此時再次使用scp遠程將我們追加后的authorized_key文件傳到各個次節點的~/.ssh目錄下
至此,你的ssh,不妨可以來測試一下,在主節點root下敲入·ssh sist02
,首次會要求輸入密碼,連接到sist02后,敲入exit退回到sist01,再次ssh sist02
此時就可以無密碼訪問啦。
第三步 配置Hadoop以及Spark
注意:
以下 配置均先在主節點下完成
3.1 Linux環境變量
我們需要配置的Linux系統文件有兩個,因為我要在root下安裝hadoop等,所以均在root下配置如下兩個文件:
/etc/profile
/etc/hosts
對文件的修改使用vim file_name
命令
hosts文件中將集群中所有所節點的主機名和ip配置進去,例如:
sist01 192.168.xxx.xxx
sist02 192.168.xxx.xxx
.....
profile文件中需要添加解壓后的JDK,Scala,spark和hadoop的路徑等信息。
可以參考我的profile文件(只需將路徑換為自己的路徑即可):
## JAVA
export JAVA_HOME=/home/hadoop/softwares/jdk1.8.0_65
export PATH=$PATH:$JAVA_HOME/bin
## HADOOP
export HADOOP_HOME=/home/hadoop/softwares/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
## scala
export SCALA_HOME=/home/hadoop/softwares/scala-2.11.7
export PATH=$PATH:$SCALA_HOME/bin
## spark
export SPARK_HOME=/home/hadoop/softwares/spark-2.1.0
export PATH=$PATH:$SPARK_HOME/bin
配置結束后,需要在root下敲入source /etc/profile
使配置立即生效。
此時分別敲入java -version
scala -version
查看是否顯示版本號,驗證是否安裝成功。
同時敲入hadoop
,如果打印出一大堆信息,那么證明成功。
3.2 配置Hadoop
我們需要配置hadoop-2.7.3/etc/hadoop/目錄下的如下幾個文件。同樣可以使用vim命令來修改,或是使用WinSCP工具來本地遠程修改。(建議還是vim吧,畢竟保持linux的熟悉度還是重要的)
core-site.xml
hdfs-site.xml
mapred-site.xml
slaves
yarn-site.xml
hadoop-env.sh
注意:如果文件夾下上述文件是.template結尾,那么就用cp file_name.template file_name
復制一份出來即可。
配置前,需要創建hadoop tmp臨時目錄以及pid的存放目錄。pid可以不配置,默認放在系統tmp下,但是一般生產集群都是有自己的pid文件夾,有利于集群的高可用。
自己找個目錄,mkdir hadooptmp
創建該文件夾,進入hadooptmp目錄,接著分別創建name、data、local、log、pid文件夾。
core-site.xml中我的配置如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://主節點ip:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/hadooptmp/tmp</value>
</property>
<property>
<name>hadoop.native.lib </name>
<value>true</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
<property>
<name>hadoop.native.lib </name>
<value>true</value>
</property>
</configuration>
hdfs-site.xml:
<configuration>
<property>
<name>dfs.namenode.http-address</name>
<value>主節點ip:50070</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>主節點ip:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop/hadooptmp/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop/hadooptmp/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.block.write.replace-datanode-on-failure.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>主節點ip:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>主節點ip:19888</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/jobhistory/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/jobhistory/done_intermediate</value>
</property>
<property>
<name>mapreduce.job.reduce.slowstart.completedmaps</name>
<value>1</value>
</property>
<property>
<name>mapreduce.jobhistory.max-age-ms</name>
<value>2419200000</value> %保存4周
<source>mapred-default.xml</source>
</property>
</configuration>
其中我們配置了日志聚合,打開了jobhistory server,并設置日志保存4周。日志聚合全部在HDFS中的目錄下,因此正如上述配置的目錄:/jobhistory/done、/jobhistory/done_intermediate,都將在啟動hadoop后手動創建好后再啟動history server。
slaves:
寫入全部的次節點的hostname,分行即可,不需要逗號,例如:
sist02
sist03
......
yarn-site.xml
<configuration>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>主機點hostname</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>主節點ip:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>主節點ip:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>主節點ip:8031</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>主節點ip:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>主節點ip:8088</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/transfered/logs</value>
</property>
<property>
<name>yarn.log.server.url</name>
<value>http://主節點ip:19888/jobhistory/logs</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.min-healthy-disks</name>
<value>0.0</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>100.0</value>
</property>
<property>
<name>yarn.nodemanager.disk-health-checker.enable</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/home/hadoop/hadooptmp/local</value>
</property>
<property>
<name>yarn.nodemanager.log-dirs</name>
<value>/home/hadoop/hadooptmp/log</value>
</property>
</configuration>
其中配置的/transfered/logs同樣是在HDFS中創建,用于日志聚合。
hadoop-env.sh:
找到如下PID配置項,修改為自己預先創建的pid路徑:
export HADOOP_SECURE_DN_PID_DIR=/home/hadoop/softwares/pid
修改java路徑為自己的JDK路徑:
export JAVA_HOME=/home/hadoop/softwares/jdk1.8.0_65
到這里,hadoop的配置文件就全部完成。
3.3 Spark文件配置
Spark需要配置的文件為/spark-2.1.0/conf/下的幾個文件:
slaves
spark-env.sh
spark-default.conf
同樣cp命令復制.template文件
slaves:
次節點的全部hostname,與hadoop中的slaves配置相同
spark-env.sh最后添加如下配置:
export SCALA_HOME=/home/hadoop/softwares/scala-2.11.7
export HADOOP_CONF_DIR=/home/hadoop/softwares/hadoop-2.7.3/etc/hadoop
export YARN_CONF_DIR=/home/hadoop/software/hadoop-2.7.3/etc/hadoop
export SPARK_MASTER_IP=主節點ip
export SPARK_MASTER_HOST=主節點hostname
export JAVA_HOME=/home/hadoop/softwares/jdk1.8.0_65
export HADOOP_HOME=/home/hadoop/softwares/hadoop-2.7.3
export SPARK_DIST_CLASSPATH=$(/home/hadoop/softwares/hadoop-2.7.3/bin/hadoop classpath)
export SPARK_LIBARY_PATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$HADOOP_HOME/lib/native
export SPARK_LOCAL_DIRS=/home/hadoop/softwares/spark-2.1.0
export MASTER=spark://主節點hostname:7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_MASTER_PORT=7077
#export SPARK_WORKER_MEMORY=5g
#export SPARK_WORKER_CORES=4
#export SPARK_WORKER_INSTANCES=1
#export SPARK_EXECUTOR_MEMORY=5g
#export SPARK_DRIVER_MEMORY=2g
上面注視調的配置可以根據自己的集群進行修改,不做配置的話會按照默認配置。
spark-default.conf最后添加如下配置:
spark.eventLog.enabled true
spark.eventLog.dir hdfs://主節點ip:9000/historyforSpark
spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
spark.yarn.historyServer.address http://主節點ip:9000:18080
spark.history.fs.logDirectory hdfs://主節點ip:9000:9000/historyforSpark
至此Spark配置完畢。
3.4 分發文件到此節點
一個個進行SCP將上述全部文件拷貝到次節點太繁瑣,所以提供一個腳本,用于批處理遠程拷貝(可兼容拷貝文件夾):
#/usr/bin/sh
SOURCEFILE=$1
TARGETDIR=$2
hosts="sist02 sist03 sist04 sist05 sist06 sist07 sist08 sist09 sist10"
for host in $hosts
do
echo $host;
scp -r $SOURCEFILE root@$host:$TARGETDIR;
done
使用上述腳本,修改腳本中的hostname即可。
使用方法:
./scptool.sh (要拷貝的文件夾或文件名) (遠程節點的目錄)
依次將 Scala/ ,JDK/, Spark-2.1.0/, Hadoop-2.7.3/, hadooptmp/,/etc/hosts, /etc/profile進行遠程拷貝,記得每臺機子都要敲入source \etc\profile
使文件生效。
每臺機子確認一下java scala hadoop都生效,按照前文所說的方法進行驗證。(此處如果節點較多也可自行寫腳本進行查看)
第四步 啟動Hadoop和Spark
4.1 hadoop啟動
主節點
hadoop namenode -format
運行結束后,在打印的日志倒數幾行如果出現了format successful,則說明格式化正確。
此時可以啟動hadoop集群啦!
使用命令:
start-all.sh
jps查看各個進程是否都正常啟動。瀏覽器登錄http://主節點ip:50070查看HDFS詳細信息,里面順便查看datanode一欄,看看自己所有的次節點是否都被正常啟動。
此時先不要開啟jobhistory server。
需要先在HDFS上創建日志聚合目錄,也就是上文所提到的那幾個目錄。使用命令:
hadoop fs -mkdir /name
以此創建好,進入hadoop-2.7.3/sbin下,敲入如下命令:
./mr-jobhistory-daemon.sh start historyserver
瀏覽器登錄http://主節點ip:19888查看historyserver是否正常啟動。
恭喜你,Hadoop部署成功!!
4.2 spark啟動
啟動前,先在HDFS創建historyforSpark目錄,用于存放spark history server的日志。
隨后,進入spark-2.1.0/sbin下輸入以下命令啟動spark
./start-all.sh
jps查看主節點下master進行是否正常。瀏覽器登錄http://主節點ip:8080查看各節點是否正常。
緊接著敲入一下命令來啟動spark的history server
./start-history-server.sh
jps查看進程是否正常,登錄http://主節點ip:18888查看是否正常啟動。
恭喜你Spark也啟動成功!!!
問題解決
1、如果啟動不成功,不管是進程啟動不全還是全部都沒起起來,先檢查防火墻是否關閉!在檢查selinux是否設置為disabled。方法如下
臨時關閉selinux:
setenforce 0 //設置SELinux 成為permissive模式
徹底禁用selinux:
使用root用戶,vim /etc/sysconfig/selinux,將SELINUX=enforcing修改成SELINUX=disabled。
重啟后才能生效。
臨時關閉防火墻:
service iptables stop
永久關閉防火墻:
chkconfig iptables off
2、如果不存在上述問題,需要視情況而定!列舉一些情況:
- 如果報錯信息透漏出時間不同步的情況,則說明各臺節點的時間不相同,如果服務器沒有聯網,則最簡單的辦法可以使用ntp來手動同步,同樣適用于聯網服務器,當然有網的話可以網上直接同步。ntp安裝及使用如下:
1、yum install -y ntpdate 安裝ntp服務
2、service ntpd stop 關閉時間服務器
3、ntpdate us.pool.ntp.org 更新時間
4、service ntpd start 開啟
5、date 查看時間
- 如果依然是時間類似的問題,上述方法未能解決的話,可能是同步后各個節點的時間戳依舊沒能同步,此時可以先停掉全部進程,然后刪除各個節點下hadooptmp下所有子目錄下的全部文件,注意不要刪除文件,只需要刪除data、name、tmp等目錄下的全部東西即可。可用如下批量刪除腳本:
/usr/bin/sh
SOURCEFILE=$1
rm -rf /home/hadoop/hadooptmp/data/*;
rm -rf /home/hadoop/hadooptmp/name/*;
rm -rf /home/hadoop/hadooptmp/tmp/*;
rm -rf /home/hadoop/softwares/hadoop-2.7.3/logs/*;
rm -rf /home/hadoop/softwares/spark-2.1.0/logs/*;
rm -rf /home/hadoop/hadooptmp/nmlocal/*
rm -rf /home/hadoop/hadooptmp/nmlog/*
刪除完后,重新format namenode,再看看是否還有問題。
- 如果出現權限問題,請注意啟動hadoop的用戶須和安裝hadoop的用戶是同一個用戶。
- 如果是文件夾權限問題,無論是本次的tmp、name等還是HDFS上的日志聚合文件,都可以手動更改權限為755來解決。
我的博客 : https://NingSM.github.io
轉載請注明原址,謝謝。