美文网首页
Spark开发--Standalone模式

Spark开发--Standalone模式

作者: 无剑_君 | 来源:发表于2019-12-02 17:30 被阅读0次

一、Standalone模式

  Spark可以通过部署与Yarn的架构类似的框架来提供自己的集群模式,该集群模式的架构设计与HDFS和Yarn大相径庭,都是由一个主节点多个从节点组成,在Spark 的Standalone模式中,主,即为master;从,即为worker。
standalone运行模式:
  在cluster中,两种角色被定义分别是master和worker;slaver worker可以有一个或者多个,可以和master在同一主机也可有自己的机器,当然了这些worker都处于active状态。
  SDriver Application可以运行在Cluster之内,也可以在cluster之外运行,先从简单的讲起即Driver Application独立于Cluster。那么这样的整体框架如下图所示,由driver,master和多个slave worker来共同组成整个的运行环境。


整体框架
  1. 集群规划
服务器 IP地址 软件 服务 备注
master 192.168.247.131 JDK、Scala、Spark master 主机
slave1 192.168.247.132 JDK、Scala、Spark worker 从机
slave2 192.168.247.130 JDK、Scala、Spark worker 从机
  1. 主机配置
192.168.247.131  master
192.168.247.132  slave1
192.168.247.130  slave2

  1. 配置免密
# 生成公私钥(所有主机)
root@master:~# cd .ssh
root@master:~/.ssh# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hHzY7V1EXy+RiWPOkZhJ+BekfIZGpbNwQI8pyE8QJyQ root@master
The key's randomart image is:
+---[RSA 2048]----+
|  E.=...ooo*o++o.|
|   o * +.O++B.ooo|
|    o * B.@+o+o o|
|     o + =.*+. . |
|      . S o..    |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
root@master:~/.ssh# 
# 复制公钥到slave1
root@master:~/.ssh# ssh-copy-id slave1
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave1's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave1'"
and check to make sure that only the key(s) you wanted were added.
# 复制公钥到slave2
root@master:~/.ssh# ssh-copy-id slave2
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@slave2's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'slave2'"
and check to make sure that only the key(s) you wanted were 

# 免密测试
root@master:~/.ssh# ssh slave1
root@master:~/.ssh# ssh slave2

二、前置条件

1、Java8安装

下载地址:http://openjdk.java.net/
https://adoptopenjdk.net/releases.html

下载
root@master:~# apt install openjdk-8-jdk -y
# 验证
root@master:~# java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
# JDK路径
root@master:~# whereis java
java: /usr/bin/java /usr/share/java /usr/share/man/man1/java.1.gz
# 搜索java系统命令的位置
root@master:~# which java
/usr/bin/java

# 下载安装
root@master:~# wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u232-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u232b09.tar.gz

2、Scala scala 2.12.10

1) 下载

下载地址:https://www.scala-lang.org/download/

查看版本
信息查看
下载
# 下载
root@slave2:~# wget https://downloads.lightbend.com/scala/2.12.10/scala-2.12.10.tgz

# 解压
root@master:~# tar -zxvf scala-2.12.10.tgz -C /usr/local

2) 配置环境变量

root@master:~# vi /etc/profile
#末尾添加
# 环境变量
export SCALA_HOME=/usr/local/scala-2.12.10
export PATH=$PATH:$SCALA_HOME/bin
# 立即生效
root@master:~# source /etc/profile

# 验证
root@master:~# scala -version
Scala code runner version 2.12.10-- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.

二、下载安装Spark

  1. 下载安装
    下载地址:http://spark.apache.org/downloads.html
    下载地址
# 下载
root@master:~# wget https://www-us.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz

# 解压
root@master:~# tar -zxvf spark-2.4.4-bin-hadoop2.7.tgz -C /usr/local

  1. 配置环境变量
# 配置环境变量
export SCALA_HOME=/usr/local/scala-2.12.10
export SPARK_HOME=/usr/local/spark-2.4.4-bin-hadoop2.7
export PATH=$PATH:$SCALA_HOME/bin:$SPARK_HOME/bin:$SPARK_HOME/sbin

# 环境变量立即生效
root@master:~# source /etc/profile

三、配置spark-env.sh

  1. spark-env.sh配置
# 编辑配置
root@master:~# cp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh.template /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh
root@master:~# vi /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh
# 修改内容
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export SPARK_MASTER_IP=master
export SPARK_MASTER_PORT=7077

# 分发配置
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
spark-env.sh                                                                                                                                                     100% 4332     4.0MB/s   00:00   
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/spark-env.sh root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
spark-env.sh                                                                                                                                                     100% 4332     5.0MB/s   00:00    

  1. slaves配置
# 配置路径slaves
root@master:~# cp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves.template /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves
# 编辑slaves
root@master:~# vi /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves
# 内容
slave1
slave2
# 分发配置
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
slaves                                                                                                                                                           100%  870     1.0MB/s   00:00    
root@master:~# scp /usr/local/spark-2.4.4-bin-hadoop2.7/conf/slaves root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7/conf
slaves                                                                                                                                                           100%  870   298.2KB/s   00:00    

四、启动spark集群

  1. 启动集群
    一般来说,Standalone模式的Spark集群的启动有以下的几种方式:
    1) master,slave一起启动:
root@master:~# cd /usr/local/spark-2.4.4-bin-hadoop2.7/
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-master.out
slave1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
slave2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
45487 Master
45743 Jps

root@slave1:~# jps
61764 Jps
61256 Worker

root@slave2:~# jps
73333 Worker
73960 Jps

默认master日志路径

 $SPARK_HOME/logs/--org.apache.spark.deploy.master.Master--.out

默认worker日志路径

 $SPARK_HOME/logs/--org.apache.spark.deploy.master.Worker--.out

2)master,slave节点分开启动
首先在192.168.247.131上启动master

root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-master.sh
starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.master.Master-1-master.out
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
56579 Master
56699 Jps

其次在192.168.247.132,192.168.247.130上启动slave:

root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-slave.sh master:7077
starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave1.out
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
77300 Jps
77224 Worker

root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/start-slave.sh master:7077
starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark-2.4.4-bin-hadoop2.7/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-slave2.out
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
89673 Worker
89772 Jps

  1. 停止spark集群
    1)master,slave一起停止
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-all.sh
slave1: stopping org.apache.spark.deploy.worker.Worker
slave2: stopping org.apache.spark.deploy.worker.Worker
stopping org.apache.spark.deploy.master.Master

2)master,slave节点分开停止

root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-slave.sh master:7077
stopping org.apache.spark.deploy.worker.Worker
root@slave1:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
79915 Jps

root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-slave.sh master:7077
stopping org.apache.spark.deploy.worker.Worker
root@slave2:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
92275 Jps

root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./sbin/stop-master.sh
stopping org.apache.spark.deploy.master.Master
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# jps
66942 Jps

  1. Web测试查看
    集群启动以后,我们在浏览器输入http://masterIP:8080/,masterIP需要使用实际的master的ip来进行替代。
    Web测试查看

五、运行提交作业

运行流程
  1. 官方求PI案例
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 1G --total-executor-cores 2 ./examples/jars/spark-examples_2.11-2.4.4.jar 10
#  结果
Pi is roughly 3.142743142743143

参数:--master spark://master:7077指定要连接的集群的master

运行结果
  1. 启动spark shell
# 添加文件内容
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# vi /wordcount 
hello world
hive hadoop
hadoop world
are you ok

# local表示为本地文件。
root@master:/usr/local/spark-2.4.4-bin-hadoop2.7# ./bin/spark-shell --master local spark://master:7077 --executor-memory 1g --total-executor-cores 2
19/12/01 22:42:11 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://master:4040
Spark context available as 'sc' (master = local, app id = local-1575211350306).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.4
      /_/
         
Using Scala version 2.11.12 (OpenJDK 64-Bit Server VM, Java 1.8.0_222)
Type in expressions to have them evaluated.
Type :help for more information.

scala> sc.textFile("/wordcount").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res0: Array[(String, Int)] = Array((are,1), (you,1), (hive,1), (hadoop,2), (hello,1), (ok,1), (world,2))

scala> 

六、Spark提交作业参数

1.num-executors

参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向YARN集群管理器申请资源时,YARN集群管理器会尽可能按照你的设置来在集群的各个工作节点上,启动相应数量的Executor进程。这个参数非常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的Spark作业的运行速度是非常慢的。
参数调优建议:每个Spark作业的运行一般设置50~100个左右的Executor进程比较合适,设置太少或太多的Executor进程都不好。设置的太少,无法充分利用集群资源;设置的太多的话,大部分队列可能无法给予充分的资源。

2.executor-memory

参数说明:该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。
参数调优建议:每个Executor进程的内存设置4G8G较为合适。但是这只是一个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看自己团队的资源队列的最大内存限制是多少,num-executors乘以executor-memory,是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的内存量最好不要超过资源队列最大总内存的1/31/2,避免你自己的Spark作业占用了队列所有的资源,导致别的作业无法运行。

3.executor-cores

参数说明:该参数用于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执行完分配给自己的所有task线程。
参数调优建议:Executor的CPU core数量设置为2~4个较为合适。同样得根据不同部门的资源队列来定,可以看看自己的资源队列的最大CPU core限制是多少,再依据设置的Executor数量,来决定每个Executor进程可以分配到几个CPU core。同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他的作业运行。

4.driver-memory

参数说明:该参数用于设置Driver进程的内存。
参数调优建议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。

5.spark.default.parallelism

参数说明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
参数调优建议:Spark作业的默认task数量为500~1000个较为合适。很多同学常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。试想一下,无论你的Executor进程有多少个,内存和CPU有多大,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。

6.spark.storage.memoryFraction

参数说明:该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。根据你选择的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写入磁盘。
参数调优建议:如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。避免内存不够缓存所有的数据,导致数据只能写入磁盘中,降低了性能。但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。此外,如果发现作业由于频繁的gc导致运行缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

7.spark.shuffle.memoryFraction

参数说明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现使用的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地降低性能。
参数调优建议:如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。

8.total-executor-cores

参数说明:所有执行者的核心总数.

七、Ubuntu设置镜像源:

1.备份原来的源

root@master:~# sudo cp /etc/apt/sources.list /etc/apt/sources_init.list

2.更换源

root@master:~# vi /etc/apt/sources.list
# 阿里源
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
# 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

3.更新

root@master:~# sudo apt-get update
# 复损坏的软件包,尝试卸载出错的包,重新安装正确版本的。
root@master:~# sudo apt-get -f install
# 更新软件
root@master:~#  sudo apt-get upgrade -y

八、常见问题

  1. 无法访问Spark Web UI的解决办法

  2. spark master web ui 端口8080被占用解决办法
    spark master web ui 默认端口为8080,当系统有其它程序也在使用该接口时,启动master时也不会报错,spark自己会改用其它端口,自动端口号加1,但为了可以控制到指定的端口,我们可以自行设置,修改方法:
    1、cd SPARK_HOME/sbin
    2、vi start-master.sh
    3、mster启动脚本中,该命令用来控制WEBUI的默认端口:

if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then
  SPARK_MASTER_WEBUI_PORT=8080
fi

4、修改上面的端口为其它可用端口就行
注:如果使用默认端口无法正常登陆WEB时,可查看mster的监听端口号来确定当前使用的端口

相关文章

网友评论

      本文标题:Spark开发--Standalone模式

      本文链接:https://www.haomeiwen.com/subject/ivqzwctx.html