對於spark前來圍觀的小伙伴應該都有所了解,也是現在比較流行的計算框架,基本上是有點規模的公司標配,所以如果有時間也可以補一下短板。
簡單來說Spark作為准實時大數據計算引擎,Spark的運行需要依賴資源調度和任務管理,Spark自帶了standalone模式資源調度和任務管理工具,運行在其他資源管理和任務調度平台上,如Yarn、Mesos、Kubernates容器等。
spark的搭建和Hadoop差不多,稍微簡單點,本文針對下面幾種部署方式進行詳細描述:
-
Local:多用於本地測試,如在eclipse,idea中寫程序測試等。
-
Standalone:Standalone是Spark自帶的一個資源調度框架,它支持完全分布式。
-
Yarn:Hadoop生態圈里面的一個資源調度框架,Spark也是可以基於Yarn來計算的。
了解一個框架最直接的方式首先要拿來玩玩,玩之前要先搭建,廢話少說,進入正題,搭建spark集群。
一、環境准備
搭建環境:CentOS7+jdk8+Hadoop2.10.1+Spark3.0.1
- 機器准備,由於已經搭建過Hadoop,spark集群也是使用相同集群(個人電腦資源有限),可以參照Hadoop搭建博客:centos7中搭建hadoop2.10高可用集群
- 需要安裝jdk1.8、Scala2.12.12、hadoop2.10.1、spark3.0.1,其中jdk1.8和Hadoop2.10也都已經安裝完成,這里只介紹Scala和spark環境配置
- 機器免密登錄,也在Hadoop部署時做過,可以參照Hadoop搭建博客:centos7中搭建hadoop2.10高可用集群
- 下載Scala2.12.12(https://www.scala-lang.org/download/2.12.12.html)、下載spark3.0.1(http://spark.apache.org/downloads.html)
二、配置環境變量
1.配置Scala環境
tar -zxvf scala-2.12.12.tgz -C /opt/soft/ cd /opt/soft ln -s scala-2.12.12 scala
vim /etc/profile
添加環境變量
#SCALA
export SCALA_HOME=/opt/soft/scala
export PATH=$PATH:$SCALA_HOME/bin
source /etc/profile
測試是否正常
正常
2.配置spark環境變量
由於各個部署方式都需要該步驟,在此單獨配置,各個部署方式不再配置
tar -zxvf spark-3.0.1-bin-hadoop2.7.tgz -C /opt/soft cd /opt/soft ln -s spark-3.0.1-bin-hadoop2.7 spark
vim /etc/profile
添加環境變量
#spark
export SPARK_HOME=/opt/soft/spark
export PATH=$PATH:$SPARK_HOME/bin
source /etc/profile
三、搭建步驟
1.本地Local模式
上述已經解壓配置好spark環境變量,本地模式不需要配置其他配置文件,可以直接使用,很簡單吧,先測試一下運行樣例:
cd /opt/soft/spark/binrun-example SparkPi 10
可以計算出結果
測試spark-shell
spark-shell
啟動成功,說明Local模式部署成功
2.Standalone模式
1>修改Spark的配置文件spark-env.sh
cd /opt/soft/spark/conf cp spark-env.sh.template spark-env.sh vim spark-env.sh
添加如下配置:
# 主節點機器名稱 export SPARK_MASTER_HOST=s141 # 默認端口號為7077 export SPARK_MASTER_PORT=7077
2>修改配置文件slaves(從節點配置)
cd /opt/soft/spark/conf
cp slaves.template slaves
vim slaves
刪除原有節點,添加從節點主機如下配置:
s142
s143
s144
s145
3>將spark目錄發送到其他機器,可以使用scp一個一個機器復制,這里使用的是自己寫的批量復制腳本xrsync.sh(hadoop批量命令腳本xrsync.sh傳輸腳本)
xrsync.sh spark-3.0.1-bin-hadoop2.7
4>在各個機器中建立spark軟連接,可以進入各個機器的/opt/soft目錄
ln -s /opt/soft/spark-3.0.1-bin-hadoop2.7 /opt/soft/spark
這里使用的是批量執行命令腳本xcall.sh(hadoop批量命令腳本xcall.sh及jps找不到命令解決)
xcall.sh ln -s /opt/soft/spark-3.0.1-bin-hadoop2.7 /opt/soft/spark
5>啟動spark集群
cd /opt/soft/spark/sbin 可以單獨啟動master和slave ./start-master.sh ./start-slaves.sh spark://s141:7077 也可以一鍵啟動master和slave ./start-all.sh
可以看到master和worker進程已經啟動成功
6>查看集群資源頁面(webUI:http://192.168.30.141:8080/),如果8080端口查不到可以看一下master啟動日志,可能是8081端口
7>進入集群shell驗證
cd /opt/soft/spark/bin
./spark-shell –master spark://s141:7077
也是正常的,說明Standalone模式部署成功
3.yarn集群模式
1>修改配置文件spark-env.sh
在Standalone模式下搭建yarn集群模式很簡單,只需要在spark-env.sh
配置文件加入如下內容即可。
# 添加hadoop的配置目錄
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
將spark-env.sh分發到各個機器
4>啟動spark集群
先啟動Hadoop的yarn集群
start-yarn.sh
再啟動spark集群,和Standalone模式一樣有兩種方式
cd /opt/soft/spark/sbin 可以單獨啟動master和slave ./start-master.sh ./start-slaves.sh spark://s141:7077 也可以一鍵啟動master和slave ./start-all.sh
查看master和worker進程正常
5>查看集群資源頁面(webUI:http://192.168.30.141:8080/),如果8080端口查不到可以看一下master啟動日志,可能是8081端口
6>進入集群shell驗證
cd /opt/soft/spark/bin
./spark-shell –master yarn
啟動也正常
7>spark的歷史服務器集成yarn
修改Hadoop的mapred-site.xml,將下面配置直接追加到最后,s141改成自己的機器即可
<!--Spark Yarn--> <property> <name>mapreduce.jobhistory.address</name> <value>s141:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>s141:19888</value> </property>
由於虛擬機資源有限,在運行時會因為使用內存超出分配值殺死而失敗,需要修改hadoop的/hadoop/etc/hadoop/yarn-site.xml配置文件,然后分發
<!--是否啟動一個線程檢查每個任務正使用的物理內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<!--是否啟動一個線程檢查每個任務正使用的虛擬內存量,如果任務超出分配值,則直接將其殺掉,默認是true -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<!-- 是否開啟聚合日志 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!--允許第三方程序,例如spark將Job的日志,提交給Hadoop的歷史服務 -->
<property>
<name>yarn.log.server.url</name>
<value>http://s141:19888/jobhistory/logs</value>
</property>
<!-- 配置日志過期時間,單位秒 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>86400</value>
</property>
將上述修改的配置文件分發到其他機器
另外在spark conf目錄下建立對Hadoop配置文件core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml的軟連接,這里使用的是批量創建軟連接
xcall.sh ln -s /opt/soft/hadoop/etc/hadoop/core-site.xml /opt/soft/spark/conf/core-site.xml
xcall.sh ln -s /opt/soft/hadoop/etc/hadoop/hdfs-site.xml /opt/soft/spark/conf/hdfs-site.xml xcall.sh ln -s /opt/soft/hadoop/etc/hadoop/yarn-site.xml /opt/soft/spark/conf/yarn-site.xml xcall.sh ln -s /opt/soft/hadoop/etc/hadoop/mapred-site.xml /opt/soft/spark/conf/mapred-site.xml
啟動Hadoop歷史服務器
# 啟動Hadoop 歷史服務器
mr-jobhistory-daemon.sh start historyserver
修改spark-defaults.conf.template文件名為spark-defaults.conf
spark.eventLog.enabled true #HDFS的節點和端口和目錄(HDFS上的目錄需要提前存在) spark.eventLog.dir hdfs://mycluster/spark/logs #spark的歷史服務器,在spark所在節點,端口18080 spark.yarn.historyServer.address=192.168.30.141:18080 spark.history.ui.port=18080
修改spark-env.sh文件,配置日志存儲路徑
#spark的歷史服務器 export SPARK_HISTORY_OPTS=" -Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://mycluster/spark/logs -Dspark.history.retainedApplications=30"
啟動spark歷史服務器,在s141集群上執行如下命令:
sbin/start-history-server.sh
8>測試官方demo
bin/spark-submit \ --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode client \ ./examples/jars/spark-examples_2.12-3.0.1.jar \ 10
查看yarn調度UI界面:http://192.168.30.141:8088/
spark任務
spark各階段執行耗時詳情
spark執行狀態及日志查看
日志信息
啟動流程:
# 啟動HDFS start-all.sh # 啟動Hadoop 歷史服務器 mr-jobhistory-daemon.sh start historyserver # 啟動Spark 集群 sbin/start-all.sh # 啟動Spark 歷史服務器 sbin/start-history-server.sh