云平臺及性能監控搭建(一)

云平臺及監控工具的部署流程


說在前面的話


云平臺的基礎搭建流程是一項基本但又必備的技能,從大四做畢業設計到研究生在實驗室集群搭建hadoop及spark再到參與某為公司大型集群性能預測項目,可以說對于這一部分的搭建工作,真的是閉著眼不參考任何資料可以在很短時間內完成。

本篇博客將完整地介紹Hadoop+Spark+hive+Ganglia+Nagios+Nmon的搭建流程,涉及到的內容較多,因此打算分為兩部分進行總結。本次先介紹基礎的云平臺的搭建。


效果預覽


先貼上最終搭建完成后Web端的圖吧。

Hadoop HDFS界面

hdfs.png

Hadoop NM界面

nm.png

Spark界面

spark.png

Hive database查看

datebase.png

Hive 創建表

createtable.png

Hive 表查詢

showtable.png

Ganglia整體集群監控圖(以CPU為例)

allcpu.png

Ganglia單節點CPU監控圖

onecpu.png

Ganglia對Hadoop的監控(以heartbeat為例)

hearbeat.png

Nagios對集群的整體預警效果

nagiosall.png

Nagios對單節點的預警效果

nagioseverynode.png

Nagios對各個主機服務及進程的預警效果

nagioseveryservice.png

Nagios對各個主機健康情況的監控情況

nagioshealth.png

生產環境下是需要使用各類監控工具對集群整體進行健康預警的。除此之外,其實有很多開源的項目可以集成這些工具,例如: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、如果不存在上述問題,需要視情況而定!列舉一些情況:

  1. 如果報錯信息透漏出時間不同步的情況,則說明各臺節點的時間不相同,如果服務器沒有聯網,則最簡單的辦法可以使用ntp來手動同步,同樣適用于聯網服務器,當然有網的話可以網上直接同步。ntp安裝及使用如下:
1、yum install -y ntpdate                 安裝ntp服務
2、service ntpd stop        關閉時間服務器
3、ntpdate us.pool.ntp.org    更新時間
4、service ntpd start        開啟
5、date              查看時間
  1. 如果依然是時間類似的問題,上述方法未能解決的話,可能是同步后各個節點的時間戳依舊沒能同步,此時可以先停掉全部進程,然后刪除各個節點下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,再看看是否還有問題。

  1. 如果出現權限問題,請注意啟動hadoop的用戶須和安裝hadoop的用戶是同一個用戶。
  2. 如果是文件夾權限問題,無論是本次的tmp、name等還是HDFS上的日志聚合文件,都可以手動更改權限為755來解決。

我的博客 : https://NingSM.github.io

轉載請注明原址,謝謝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容