spark-2.4.5的standalone的部署
1 spark的standalone的部署
Spark支持3种集群部署模式:Standalone、Yarn、Mesos;
- Standalone模式
- 独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源 管理系统。从一定程度上说,该模式是其他两种的基础
- Cluster Manager:Master
- Worker Node:Worker
- 仅支持粗粒度的资源分配方式
- Spark On Yarn模式
- Yarn拥有强大的社区支持,且逐步已经成为大数据集群资源管理系统的标准
- 在国内生产环境中运用最广泛的部署模式
- Spark on yarn 的支持两种模式:
- yarn-cluster:适用于生产环境
- yarn-client:适用于交互、调试,希望立即看到app的输出
- Cluster Manager:ResourceManager
- Worker Node:NodeManager
- 仅支持粗粒度的资源分配方式
- Spark On Mesos模式
- 官方推荐的模式。
- Spark开发之初就考虑到支持Mesos Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然
- Cluster Manager:Mesos Master
- Worker Node:Mesos Slave
- 支持粗粒度、细粒度的资源分配方式
粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和 若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task。 应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。
细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,核心思想是按需分配。
1.1 下载Spark安装包
Spark官网,选择 spark-2.4.5-bin-without-hadoop-scala-2.12.tgz
备注:不用安装scala
1.1.1上传解压
[root@gcw1 src]# ll | grep spark
-rw-r--r-- 1 root root 145961599 Sep 22 22:50 spark-2.4.5-bin-without-hadoop-scala-2.12.tgz
[root@gcw1 src]# tar -zxf spark-2.4.5-bin-without-hadoop-scala-2.12.tgz -C /opt/app/
1.1.2 设置软连接
[root@gcw1 src]# cd /opt/app/
[root@gcw1 app]# ln -s spark-2.4.5-bin-without-hadoop-scala-2.12 spark
1.1.3 设置环境变量,并使之生效
vi /etc/profile
export SPARK_HOME=/opt/app/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source /etc/profile
1.2 修改配置
1.2.1 $SPARK_HOME/conf/slaves
[root@gcw1 app]# cd $SPARK_HOME/conf
[root@gcw1 conf]# ll
total 36
-rw-r--r-- 1 gcw1 gcw1 996 Feb 3 2020 docker.properties.template
-rw-r--r-- 1 gcw1 gcw1 1105 Feb 3 2020 fairscheduler.xml.template
-rw-r--r-- 1 gcw1 gcw1 2025 Feb 3 2020 log4j.properties.template
-rw-r--r-- 1 gcw1 gcw1 7801 Feb 3 2020 metrics.properties.template
-rw-r--r-- 1 gcw1 gcw1 865 Feb 3 2020 slaves.template
-rw-r--r-- 1 gcw1 gcw1 1292 Feb 3 2020 spark-defaults.conf.template
-rwxr-xr-x 1 gcw1 gcw1 4221 Feb 3 2020 spark-env.sh.template
[root@gcw1 conf]# cp slaves.template slaves
[root@gcw1 conf]# vi slaves
[root@gcw1 conf]#
1.2.2 $SPARK_HOME/conf/spark-defaults.conf
[root@gcw1 conf]# cp spark-defaults.conf.template spark-defaults.conf
[root@gcw1 conf]# vi spark-defaults.conf
spark.master spark://gcw1:7077
spark.eventLog.enabled true
spark.eventLog.dir hdfs://gcw1:9000/spark-log
spark.serializer org.apache.spark.serializer.KryoSerializer
spark.driver.memory 512m
# spark.executor.extraJavaOptions -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"
创建 HDFS 目录
hdfs dfs -mkdir /spark-log
备注:
- spark.master。定义master节点,缺省端口号 7077
- spark.eventLog.enabled。开启eventLog
- spark.eventLog.dir。eventLog的存放位置 spark.serializer。一个高效的序列化器
- spark.driver.memory。定义driver内存的大小(缺省1G)
1.2.3 $SPARK_HOME/conf/spark-env.sh
export JAVA_HOME=/opt/app/jdk
export HADOOP_HOME=/opt/app/hadoop
export HADOOP_CONF_DIR=/opt/app/hadoop/etc/hadoop
export SPARK_DIST_CLASSPATH=$(/opt/app/hadoop/bin/hadoop classpath)
export SPARK_MASTER_HOST=gcw1
export SPARK_MASTER_PORT=7077
备注:这里使用的是 spark-2.4.5-bin-without-hadoop,所以要将 Hadoop 相关 jars 的位置告诉Spark
1.2.4 命令名称修改
解决spark的命令和hadoop的命令重名
[root@gcw1 sbin]# cd /opt/app/spark/sbin/
[root@gcw1 sbin]# mv ./start-all.sh spark-start-all.sh
[root@gcw1 sbin]# mv ./stop-all.sh spark-stop-all.sh
[root@gcw1 sbin]# mv ./start-history-server.sh spark-start-history-server.sh
[root@gcw1 sbin]# mv stop-history-server.sh spark-stop-history-server.sh
1.2 将Spark软件分发到集群;修改其他节点上的环境变量
cd /opt/app
scp -r spark-2.4.5-bin-without-hadoop-scala-2.12 gcw2:`pwd`
scp -r spark-2.4.5-bin-without-hadoop-scala-2.12 gcw3:`pwd`
配置环境变量,创建软连接
[root@gcw2 app]# cd /opt/app/
[root@gcw2 app]# ln -s spark-2.4.5-bin-without-hadoop-scala-2.12 spark
[root@gcw3 ~]# cd /opt/app/
[root@gcw3 app]# ln -s spark-2.4.5-bin-without-hadoop-scala-2.12/ spark
vi /etc/profile
export SPARK_HOME=/opt/app/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
source /etc/profile
1.3 启动测试
[root@gcw1 spark]# spark-start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /opt/app/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-gcw1.out
gcw2: starting org.apache.spark.deploy.worker.Worker, logging to /opt/app/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-gcw2.out
gcw1: starting org.apache.spark.deploy.worker.Worker, logging to /opt/app/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-gcw1.out
gcw3: starting org.apache.spark.deploy.worker.Worker, logging to /opt/app/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-gcw3.out
[root@gcw1 spark]# jps
1072 -- process information unavailable
2515 NodeManager
2296 DataNode
3224 Jps
2123 NameNode
3164 Worker
3039 Master
[root@gcw1 spark]#
gcw2
[root@gcw2 sbin]# jps
1936 Worker
1718 NodeManager
1993 Jps
1596 DataNode
前端
http://gcw1:8080
2 运行模式
2.1 运行模式(cluster / client)
最大的区别:Driver运行在哪里;client是缺省的模式,能看见返回结果,适合调 试;cluster与此相反;
- Client模式(缺省)。Driver运行在提交任务的Client,此时可以在Client模式 下,看见应用的返回结果,适合交互、调试
- Cluster模式。Driver运行在Spark集群中,看不见程序的返回结果,合适生产环 境
2.2 测试client
spark-submit --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_2.12-2.4.5.jar 1000
再次使用 jps 检查集群中的进程:
- Master进程做为cluster manager,管理集群资源
- Worker 管理节点资源
- SparkSubmit 做为Client端,运行 Driver 程序。
- Spark Application执行完成, 进程终止
- CoarseGrainedExecutorBackend,运行在Worker上,用来并发执行应用程序
2.2 测试cluster
spark-submit --class org.apache.spark.examples.SparkPi --deploy-mode cluster $SPARK_HOME/examples/jars/spark-examples_2.12-2.4.5.jar 1000
-
SparkSubmit 进程会在应用程序提交给集群之后就退出
-
Master会在集群中选择一个 Worker 进程生成一个子进程
-
DriverWrapper 来启 动 Driver 程序 Worker节点上会启动
-
CoarseGrainedExecutorBackend DriverWrapper 进程会占用 Worker 进程的一个core(缺省分配1个core,1G内 存)
-
应用程序的结果,会在执行 Driver 程序的节点的 stdout 中输出,而不是打印在 屏幕上
3 History Server配置
# spark-defaults.conf
# history server
spark.eventLog.enabled true
spark.eventLog.dir hdfs://gcw1:9000/spark-log
spark.eventLog.compress true
# spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=50 -Dspark.history.fs.logDirectory=hdfs://gcw1:9000/spark-log"