飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • AngularJS教程
  • UEditor使用文档
  • ThinkPHP5.0教程

Spark 安装部署与快速上手

时间:2021-12-04  作者:uiuing  
两万字总结,包括各部署模式介绍,Spark交互式执行、提交应用程序,yarn上运行,配置与调优等内容

Spark 介绍

核心概念

Spark 是 UC Berkeley AMP lab 开发的一个集群计算的框架,类似于 Hadoop,但有很多的区别。

最大的优化是让计算任务的中间结果可以存储在内存中,不需要每次都写入 HDFS,更适用于需要迭代的 MapReduce 算法场景中,可以获得更好的性能提升。

例如一次排序测试中,对 100TB 数据进行排序,Spark 比 Hadoop 快三倍,并且只需要十分之一的机器。

Spark 集群目前最大的可以达到 8000 节点,处理的数据达到 PB 级别,在互联网企业中应用非常广泛。

Spark 的特性

Hadoop 的核心是分布式文件系统 HDFS 和计算框架 MapReduces。Spark 可以替代 MapReduce,并且兼容 HDFS、Hive 等分布式存储层,良好的融入 Hadoop 的生态系统。

Spark 执行的特点

  • 中间结果输出:Spark 将执行工作流抽象为通用的有向无环图执行计划(DAG),可以将多 Stage 的任务串联或者并行执行。
  • 数据格式和内存布局:Spark 抽象出分布式内存存储结构弹性分布式数据集 RDD,能够控制数据在不同节点的分区,用户可以自定义分区策略。
  • 任务调度的开销:Spark 采用了事件驱动的类库 AKKA 来启动任务,通过线程池的复用线程来避免系统启动和切换开销。

Spark 的优势

  • 速度快,运行工作负载快 100 倍。Apache Spark 使用最先进的 DAG 调度器、查询优化器和物理执行引擎,实现了批处理和流数据的高性能。
  • 易于使用,支持用 Java、Scala、Python、R 和 SQL 快速编写应用程序。Spark 提供了超过 80 个算子,可以轻松构建并行应用程序。您可以从 Scala、Python、R 和 SQL shell 中交互式地使用它。
  • 普遍性,结合 SQL、流处理和复杂分析。Spark 提供了大量的库,包括 SQLDataFrames、用于机器学习的 MLlib、GraphXSpark 流。您可以在同一个应用程序中无缝地组合这些库。
  • 各种环境都可以运行,Spark 在 Hadoop、Apache Mesos、Kubernetes、单机或云主机中运行。它可以访问不同的数据源。您可以使用它的独立集群模式在 EC2、Hadoop YARN、Mesos 或 Kubernetes 上运行 Spark。访问 HDFS、Apache Cassandra、Apache HBase、Apache Hive 和数百个其他数据源中的数据。

哪些公司在使用 Spark

日常为我们所熟知的,在国外就有 IBM Almaden(IBM 研究实验室)、Amazon(亚马逊)等,而在国内有 baidu(百度)、Tencent(腾讯)等等,包括一些其它的公司大部分都使用 Spark 来处理生产过程中产生的大量数据。更多详情可以参考链接: 谁在使用 Spark?

2.3 Spark 生态系统 BDAS

目前,Spark 已经发展成为包含众多子项目的大数据计算平台。

BDAS 是伯克利大学提出的基于 Spark 的数据分析栈(BDAS)。

其核心框架是 Spark,同时涵盖支持结构化数据 SQL 查询与分析的查询引擎 Spark SQL,提供机器学习功能的系统 MLBase 及底层的分布式机器学习库 MLlib,并行图计算框架 GraphX,流计算框架 Spark Streaming,近似查询引擎 BlinkDB,内存分布式文件系统 Tachyon,资源管理框架 Mesos 等子项目。这些子项目在 Spark 上层提供了更高层、更丰富的计算范式

image-20211020112105076


部署前准备

Spark 安装非常简单,简单到只需要下载 binary 包解压即可

安装 Spark 之前需要先安装 Java,Scala 及 Python。

  • java 1.8.0
  • scala 域名.8
  • python 2.7

安装Java

下载

参考清华软件源:https://域名域名/AdoptOpenJDK/

wget wget https://域名域名/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_openj9_linuxXL_8u282b08_openj9-0.域名.gz --no-check-certificate

按需求下载之后记得修改环境变量

image-20211020144350213

记得配置环境变量,添加 bin 目录即可


安装Scala

下载

wget https://域名/scala/域名.8/scala-2.域名

image-20211020144410232

记得配置环境变量,添加 bin 目录即可


安装Python

一般系统自带 Python2

python --version

如果需要 Python3 可以自行下载

yum -y install python3

image-20211020144327257


Spark 下载

此处使用的是:Spark 2.4.8

官网上下载已经预编译好的 Spark binary,直接解压即可。

Spark 官方下载链接:http://域名/域名

下载

参考

  • 清华软件源:https://域名域名/apache/spark/
  • 华为软件源:https://域名/apache/spark/
wget https://域名/apache/spark/spark-2.4.4/spark-2.4.4-bin-域名

记得配置环境变量,添加 bin 目录即可

image-20211020144631459


部署模式介绍

Spark on Mesos未尝试过,大家可以自行尝试

本文仅介绍 Standalone 模式和 Spark on Yarn模式

按照自己需求配合!

本地模式

Spark单机运行,直接解压执行start-域名即可,一般用于开发测试


Standalone 模式

构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。

独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统。

从一定程度上说,该模式是其他两种的基础。借鉴 Spark 开发模式,我们可以得到一种开发新型计算框架的一般思路:先设计出它的 standalone 模式,为了快速开发,起初不需要考虑服务(比如 master/slave)的容错性,之后再开发相应的 wrapper,将 stanlone 模式下的服务原封不动的部署到资源管理系统 yarn 或者 mesos 上,由资源管理系统负责服务本身的容错。目前 Spark 在 standalone 模式下是没有任何单点故障问题的,这是借助 zookeeper 实现的,思想类似于 Hbase master 单点故障解决方案。将 Spark standalone 与 MapReduce 比较,会发现它们两个在架构上是完全一致的:

  1. 都是由 master/slaves 服务组成的,且起初 master 均存在单点故障,后来均通过 zookeeper 解决(Apache MRv1 的 JobTracker 仍存在单点问题,但 CDH 版本得到了解决);
  2. 各个节点上的资源被抽象成粗粒度的 slot,有多少 slot 就能同时运行多少 task。不同的是,MapReduce 将 slot 分为 map slot 和 reduce slot,它们分别只能供 Map Task 和 Reduce Task 使用,而不能共享,这是 MapReduce 资源利率低效的原因之一,而 Spark 则更优化一些,它不区分 slot 类型,只有一种 slot,可以供各种类型的 Task 使用,这种方式可以提高资源利用率,但是不够灵活,不能为不同类型的 Task 定制 slot 资源。总之,这两种方式各有优缺点。

Spark on Yarn 模式

Spark客户端直接连接Yarn。不需要额外构建Spark集群。

这是一种很有前景的部署模式。但限于 YARN 自身的发展,目前仅支持粗粒度模式(Coarse-grained Mode)。

这是由于 YARN 上的 Container 资源是不可以动态伸缩的,一旦 Container 启动之后,可使用的资源不能再发生变化,不过这个已经在 YARN 计划中了。

spark on yarn 的支持两种模式:

  1. yarn-cluster:适用于生产环境
  2. yarn-client:适用于交互、调试,希望立即看到 app 的输出

yarn-cluster 和 yarn-client 的区别在于 yarn appMaster,每个 yarn app 实例有一个 appMaster 进程,是为 app 启动的第一个 container;负责从 ResourceManager 请求资源,获取到资源后,告诉 NodeManager 为其启动 container。

yarn-cluster 和 yarn-client 模式内部实现还是有很大的区别。

如果你需要用于生产环境,那么请选择 yarn-cluster;而如果你仅仅是 Debug 程序,可以选择 yarn-client。


Spark on Mesos 模式

Spark客户端直接连接Mesos。不需要额外构建Spark集群。

这是很多公司采用的模式,官方推荐这种模式(当然,原因之一是血缘关系)。

正是由于 Spark 开发之初就考虑到支持 Mesos,因此,目前而言,Spark 运行在 Mesos 上会比运行在 YARN 上更加灵活,更加自然。

目前在 Spark On Mesos 环境中,用户可选择两种调度模式之一运行自己的应用程序(可参考 Andrew Xia 的“Mesos Scheduling Mode on Spark”):

  1. 粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个 Dirver 和若干个 Executor 组成,其中,每个 Executor 占用若干资源,内部可运行多个 Task(对应多少个“slot”)。

    应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。举个例子,比如你提交应用程序时,指定使用 5 个 executor 运行你的应用程序,每个 executor 占用 5GB 内存和 5 个 CPU,每个 executor 内部设置了 5 个 slot,则 Mesos 需要先为 executor 分配资源并启动它们,之后开始调度任务。

    另外,在程序运行过程中,mesos 的 master 和 slave 并不知道 executor 内部各个 task 的运行情况,executor 直接将任务状态通过内部的通信机制汇报给 Driver,从一定程度上可以认为,每个应用程序利用 mesos 搭建了一个虚拟集群自己使用。

  2. 细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos 还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。

    与粗粒度模式一样,应用程序启动时,先会启动 executor,但每个 executor 占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,之后,mesos 会为每个 executor 动态分配资源,每分配一些,便可以运行一个新任务,单个 Task 运行完之后可以马上释放对应的资源。

    每个 Task 会汇报状态给 Mesos slave 和 Mesos Master,便于更加细粒度管理和容错,这种调度模式类似于 MapReduce 调度模式,每个 Task 完全独立,优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大。


总结

这三种分布式部署方式各有利弊,通常需要根据实际情况决定采用哪种方案。

进行方案选择时,往往要考虑公司的技术路线(采用 Hadoop 生态系统还是其他生态系统)、相关技术人才储备等。上面涉及到 Spark 的许多部署模式,究竟哪种模式好这个很难说,需要根据你的需求,如果你只是测试 Spark Application,你可以选择 local 模式。而如果你数据量不是很多,Standalone 是个不错的选择。当你需要统一管理集群资源(Hadoop、Spark 等),那么你可以选择 Yarn 或者 mesos,但是这样维护成本就会变高。

  • 从对比上看,mesos 似乎是 Spark 更好的选择,也是被官方推荐的
  • 但如果你同时运行 hadoop 和 Spark,从兼容性上考虑,Yarn 是更好的选择。
  • 如果你不仅运行了 hadoop,spark。还在资源管理上运行了 docker,Mesos 更加通用。
  • Standalone 对于小规模计算集群更适合!

Standalone 模式

Standalone 另可分两种子模式:

  • 单机
  • 集群

当然,集群部署的前提是单机的部署完成,根据自己的需求调整即可

单机部署

Spark 虽然是大规模的计算框架,但也支持在单机上运行

修改配置文件

进入 Spark 配置目录

cd $SPARK_HOME/conf

日志配置

创建/复制

cp 域名late 域名erties

我们修改 域名Category 的 「INFO」修改为「WARN」,这一步是修改日志等级,可避免测试中输出太多信息

image-20211020144932483


spark-域名

创建/复制

 cp spark-域名late spark-域名

添加HOME 变量:JAVA_HOME、SPARK_HOME、SCALA_HOME

考虑我们已经添加至环境变量文件里了,所以我们刷新配置的环境文件即可

image-20211020145303859

spark-域名脚本会在启动 Spark 时加载,内容包含很多配置选项及说明,在以后会用到少部分,感兴趣可以仔细阅读这个文件的注释内容。


启动Spark 服务

这一节将启动 Spark 的 master 主节点和 slave 从节点

也会介绍 spark 单机模式和集群模式的部署区别

启动主节点

前往sbin 目录

cd $SPARK_HOME/sbin

启动

./start-域名

image-20211020153210847

没有报错的话表示 master 已经启动成功

master 默认可以通过 web 访问http://localhost:8080

image-20211020153335079

图中所示,master 中暂时还没有一个 worker ,我们启动 worker 时需要 master 的参数,该参数已经在上图中标志出来:spark://master:7077,请在执行后续命令时替换成你自己的参数。


启动从节点

启动 slave

./start-域名 spark://master:7077

image-20211020153601603

没有报错表示启动成功,再次刷新浏览器页面可以看到下图所示新的 worker 已经添加

也可以用jps命令查看启动的服务,应该会列出MasterWorker

image-20211020153725807


测试实例

使用 spark-shell 连接 master ,注意把 MASTER 参数替换成你实验环境中的实际参数

MASTER=spark://master:7077 spark-shell

image-20211020154059684

刷新 master 的 web 页面,可以看到新的Running Applications,如下图所示:

image-20211020154046855

当退出 spark-shell 时,这个 application 会移动到Completed Applications一栏。

image-20211020154219423

可以自己点击页面中的 Application 和 Workers 的链接查看并了解相关信息。


停止服务

停止服务的脚本为./sbin/stop-域名

./stop-域名

但我建议依次关闭

./stop-域名
./stop-域名

image-20211020154523357

通过 jps 可以看到,master 与 worker 进程都已经停止


集群部署

修改配置

在 「单机模式」小节下的「修改配置文件」的基础上进行添加/修改

进入 Spark 配置目录

cd $SPARK_HOME/conf

spark-域名

参数解读:

  • SPARK_MASTER_HOST = Master的主机名
  • SPARK_MASTER_PORT = 提交Application的端口,默认7077,可更改
  • SPARK_WORKER_CORES = 每一个Worker最多可以使用的cpu核个数
  • SPARK_WORKER_MEMORY = 每个Worker最多可以使用的内存

其实你完全可以参考spark-域名内的注释

编辑

vim spark-域名

做出如下修改(位置非固定):

image-20211020164337172


slaves

修改 slaves 配置文件,添加 Worker 的主机列表

复制/创建

cp 域名late slaves

修改localhost 为你需要的机器的 HostName

你可以参考我的:

image-20211020164928409

注意需要先把所有主机名输入到 /etc/hosts 避免无法解析


同步

此处不进行赘述,具体操作大家自行搜索,或者查看我关于 「HADOOP部署」的相关文章

大致操作如下:

  • ssh-keygen 命令配合 ssh-copy-id 命令实现ssh免密
  • scp 命令同步所有设置(指Spark 下的 conf 文件下,或者同步 Spark 文件)

启动集群

前往 master 机器下执行

前往sbin 目录

cd $SPARK_HOME/sbin

在这台机启动集群

./start-域名

启动的步骤和「单机部署」下的「启动 Spark 服务」一致,关闭也一致

start-域名 和 start-域名、start-域名 和 Hadoop 里的 start-域名、start-域名、start-域名关系大致一样

image-20211020171129076

Web:

image-20211020171210590


Spark 交互式执行

Spark-Shell

Spark-Shell是 Spark 自带的一个 Scala 交互 Shell ,可以以脚本方式进行交互式执行,类似直接用 Python 及其他脚本语言的 Shell 。

进入Spark-Shell只需要执行spark-shell即可:

spark-shell

(前提是你配置好了 Spark 的环境变量)

image-20211020150911321

进入到Spark-Shell后可以使用Ctrl D组合键退出 Shell。

Spark-Shell中我们可以使用 Scala 的语法进行简单的测试,比如我们运行下面几个语句获得文件/etc/protocols的行数以及第一行的内容:

var f = 域名File("/etc/protocols")
域名t()
域名t()

image-20211020151401362

上面的操作中创建了一个 RDD file,执行了两个简单的操作:

  • count()获取 RDD 的行数
  • first()获取第一行的内容

我们继续执行其他操作,比如查找有多少行含有tcpudp字符串:

域名er(line => 域名ains("tcp")).count()
域名er(line => 域名ains("udp")).count()

image-20211020151514149

查看一共有多少个不同单词的方法,这里用到 Mapreduce 的思路:

var wordcount = 域名Map(line => 域名t(" ")).map(word => (word,1)).reduceByKey(_+_)

域名t()

image-20211020151832475

上面两步骤我们发现,/etc/protocols中各有一行含有tcpudp字符串,并且一共有 442 个不同的单词。

上面每个语句的具体含义这里不展开,可以结合你阅读的文章进行理解,这里仅仅提供一个简单的例子让大家对 Spark 运算有基本认识。

操作完成后,Ctrl D组合键退出 Shell。


Pyspark

Pyspark 类似 Spark-Shell ,是一个 Python 的交互 Shell 。

执行pyspark启动进入 Pyspark:

pyspark

image-20211020152102799

退出方法仍然是Ctrl D组合键。

在 Pyspark 中,我们可以用 Python 语法执行 Spark-Shell 中的操作,比如下面的语句获得文件/etc/protocols 的行数以及第一行的内容:

file = 域名File("/etc/protocols")
域名t()
域名t()

image-20211020152146802

操作完成后,Ctrl D组合键退出 Shell。

对于 Pyspark 大家可以自行学习拓展,可以参考官方文档Spark Python API


提交应用程序

在Spark bin目录下的spark-submit可以用来在集群上启动应用程序。它可以通过统一的接口使用Spark支持的所有集群管理器 ,所有你不必为每一个管理器做相应的配置。

用spark-submit启动应用程序

bin/spark-submit脚本负责建立包含Spark以及其依赖的类路径(classpath),它支持不同的集群管理器以及Spark支持的加载模式。

./bin/spark-submit \
  --class <main-class>
  --master <master-url> \
  --deploy-mode <deploy-mode> \
  --conf <key>=<value> \
  ... # other options
  <application-jar> \
  [application-arguments]

一些常用的选项是:

  • --class:你的应用程序的入口点(如域名域名kPi)
  • --master:集群的master URL(如spark://域名.187:7077)
  • --deploy-mode:在worker节点部署你的driver(cluster)或者本地作为外部客户端(client)。默认是client。
  • --conf:任意的Spark配置属性,格式是key=value。
  • application-jar:包含应用程序以及其依赖的jar包的路径。这个URL必须在集群中全局可见,例如,存在于所有节点的hdfs://路径或file://路径
  • application-arguments:传递给主类的主方法的参数

一个通用的部署策略是从网关集群提交你的应用程序,这个网关机器和你的worker集群物理上协作。在这种设置下,client模式是适合的。在client模式下,driver直接在spark-submit进程 中启动,而这个进程直接作为集群的客户端。应用程序的输入和输出都和控制台相连接。因此,这种模式特别适合涉及REPL的应用程序。

另一种选择,如果你的应用程序从一个和worker机器相距很远的机器上提交,通常情况下用cluster模式减少drivers和executors的网络迟延。注意,cluster模式目前不支持独立集群、 mesos集群以及python应用程序。

有几个我们使用的集群管理器特有的可用选项。例如,在Spark独立集群的cluster模式下,你也可以指定--supervise用来确保driver自动重启(如果它因为非零退出码失败)。 为了列举spark-submit所有的可用选项,用--help运行它。

# Run application locally on 8 cores
./bin/spark-submit \
  --class 域名域名kPi \
  --master local[8] \
  /path/to/域名 \
  100

# Run on a Spark Standalone cluster in client deploy mode
./bin/spark-submit \
  --class 域名域名kPi \
  --master spark://master:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/域名 \
  1000

# Run on a Spark Standalone cluster in cluster deploy mode with supervise
./bin/spark-submit \
  --class 域名域名kPi \
  --master spark://master:7077 \
  --deploy-mode cluster
  --supervise
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/域名 \
  1000

# Run on a YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
  --class 域名域名kPi \
  --master yarn-cluster \  # can also be `yarn-client` for client mode
  --executor-memory 20G \
  --num-executors 50 \
  /path/to/域名 \
  1000

# Run a Python application on a Spark Standalone cluster
./bin/spark-submit \
  --master spark://master:7077 \
  examples/src/main/python/域名 \
  1000

Master URLs

传递给Spark的url可以用下面的模式

Master URL Meaning
local 用一个worker线程本地运行Spark
local[K] 用k个worker线程本地运行Spark(理想情况下,设置这个值为你的机器的核数)
local[*] 用尽可能多的worker线程本地运行Spark
spark://HOST:PORT 连接到给定的Spark独立部署集群master。端口必须是master配置的端口,默认是7077
mesos://HOST:PORT 连接到给定的mesos集群
yarn-client client模式连接到Yarn集群。群集位置将基于通过HADOOP_CONF_DIR变量找到
yarn-cluster cluster模式连接到Yarn集群。群集位置将基于通过HADOOP_CONF_DIR变量找到

Spark Standalone扩展

手动启动集群

你能够通过下面的方式启动独立的master服务器。

./sbin/start-域名

一旦启动,master将会为自己打印出spark://HOST:PORT URL,你能够用它连接到workers或者作为"master"参数传递给SparkContext。你也可以在master web UI上发现这个URL, master web UI默认的地址是http://localhost:8080

相同的,你也可以启动一个或者多个workers或者将它们连接到master。

./bin/spark-class 域名域名域名er spark://IP:PORT

一旦你启动了一个worker,查看master web UI。你可以看到新的节点列表以及节点的CPU数以及内存。

下面的配置参数可以传递给master和worker。

Argument Meaning
-h HOST, --host HOST 监听的主机名
-i HOST, --ip HOST 同上,已经被淘汰
-p PORT, --port PORT 监听的服务的端口(master默认是7077,worker随机)
--webui-port PORT web UI的端口(master默认是8080,worker默认是8081)
-c CORES, --cores CORES Spark应用程序可以使用的CPU核数(默认是所有可用);这个选项仅在worker上可用
-m MEM, --memory MEM Spark应用程序可以使用的内存数(默认情况是你的机器内存数减去1g);这个选项仅在worker上可用
-d DIR, --work-dir DIR 用于暂存空间和工作输出日志的目录(默认是SPARK_HOME/work);这个选项仅在worker上可用
--properties-file FILE 自定义的Spark配置文件的加载目录(默认是conf/spark-域名)

集群启动脚本

为了用启动脚本启动Spark独立集群,你应该在你的Spark目录下建立一个名为conf/slaves的文件,这个文件必须包含所有你要启动的Spark worker所在机器的主机名,一行一个。如果 conf/slaves不存在,启动脚本默认为单个机器(localhost),这台机器对于测试是有用的。注意,master机器通过ssh访问所有的worker。在默认情况下,SSH是并行运行,需要设置无密码(采用私有密钥)的访问。 如果你没有设置为无密码访问,你可以设置环境变量SPARK_SSH_FOREGROUND,为每个worker提供密码。

一旦你设置了这个文件,你就可以通过下面的shell脚本启动或者停止你的集群。

  • sbin/start-域名:在机器上启动一个master实例
  • sbin/start-域名:在每台机器上启动一个slave实例
  • sbin/start-域名:同时启动一个master实例和所有slave实例
  • sbin/stop-域名:停止master实例
  • sbin/stop-域名:停止所有slave实例
  • sbin/stop-域名:停止master实例和所有slave实例

注意,这些脚本必须在你的Spark master运行的机器上执行,而不是在你的本地机器上面。

你可以在conf/spark-域名中设置环境变量进一步配置集群。利用conf/spark-域名late创建这个文件,然后将它复制到所有的worker机器上使设置有效。下面的设置可以起作用:

Environment Variable Meaning
SPARK_MASTER_IP 绑定master到一个指定的ip地址
SPARK_MASTER_PORT 在不同的端口上启动master(默认是7077)
SPARK_MASTER_WEBUI_PORT master web UI的端口(默认是8080)
SPARK_MASTER_OPTS 应用到master的配置属性,格式是 "-Dx=y"(默认是none),查看下面的表格的选项以组成一个可能的列表
SPARK_LOCAL_DIRS Spark中暂存空间的目录。包括map的输出文件和存储在磁盘上的RDDs(including map output files and RDDs that get stored on disk)。这必须在一个快速的、你的系统的本地磁盘上。它可以是一个逗号分隔的列表,代表不同磁盘的多个目录
SPARK_WORKER_CORES Spark应用程序可以用到的核心数(默认是所有可用)
SPARK_WORKER_MEMORY Spark应用程序用到的内存总数(默认是内存总数减去1G)。注意,每个应用程序个体的内存通过域名ry设置
SPARK_WORKER_PORT 在指定的端口上启动Spark worker(默认是随机)
SPARK_WORKER_WEBUI_PORT worker UI的端口(默认是8081)
SPARK_WORKER_INSTANCES 每台机器运行的worker实例数,默认是1。如果你有一台非常大的机器并且希望运行多个worker,你可以设置这个数大于1。如果你设置了这个环境变量,确保你也设置了SPARK_WORKER_CORES环境变量用于限制每个worker的核数或者每个worker尝试使用所有的核。
SPARK_WORKER_DIR Spark worker运行目录,该目录包括日志和暂存空间(默认是SPARK_HOME/work)
SPARK_WORKER_OPTS 应用到worker的配置属性,格式是 "-Dx=y"(默认是none),查看下面表格的选项以组成一个可能的列表
SPARK_DAEMON_MEMORY 分配给Spark master和worker守护进程的内存(默认是512m)
SPARK_DAEMON_JAVA_OPTS Spark master和worker守护进程的JVM选项,格式是"-Dx=y"(默认为none)
SPARK_PUBLIC_DNS Spark master和worker公共的DNS名(默认是none)

注意,启动脚本还不支持windows。为了在windows上启动Spark集群,需要手动启动master和workers。

SPARK_MASTER_OPTS支持一下的系统属性:

Property Name Default Meaning
域名inedApplications 200 展示完成的应用程序的最大数目。老的应用程序会被删除以满足该限制
域名inedDrivers 200 展示完成的drivers的最大数目。老的应用程序会被删除以满足该限制
域名adOut true 这个选项控制独立的集群管理器是应该跨节点传递应用程序还是应努力将程序整合到尽可能少的节点上。在HDFS中,传递程序是数据本地化更好的选择,但是,对于计算密集型的负载,整合会更有效率。
域名ultCores (infinite) 在Spark独立模式下,给应用程序的默认核数(如果没有设置域名)。如果没有设置,应用程序总数获得所有可用的核,除非设置了域名。在共享集群上设置较低的核数,可用防止用户默认抓住整个集群。
域名out 60 独立部署的master认为worker失败(没有收到心跳信息)的间隔时间。

SPARK_WORKER_OPTS支持的系统属性:

Property Name Default Meaning
域名域名led false 周期性的清空worker/应用程序目录。注意,这仅仅影响独立部署模式。不管应用程序是否还在执行,用于程序目录都会被清空
域名域名rval 1800 (30分) 在本地机器上,worker清空老的应用程序工作目录的时间间隔
域名域名ataTtl 7 24 3600 (7天) 每个worker中应用程序工作目录的保留时间。这个时间依赖于你可用磁盘空间的大小。应用程序日志和jar包上传到每个应用程序的工作目录。随着时间的推移,工作目录会很快的填满磁盘空间,特别是如果你运行的作业很频繁。

连接一个应用程序到集群中

为了在Spark集群中运行一个应用程序,简单地传递spark://IP:PORT URL到SparkContext

为了在集群上运行一个交互式的Spark shell,运行一下命令:

./bin/spark-shell --master spark://IP:PORT

你也可以传递一个选项--total-executor-cores <numcores>去控制spark-shell的核数。


启动Spark应用程序

spark-submit脚本支持最直接的提交一个Spark应用程序到集群。对于独立部署的集群,Spark目前支持两种部署模式。在client模式中,driver启动进程与 客户端提交应用程序所在的进程是同一个进程。然而,在cluster模式中,driver在集群的某个worker进程中启动,只有客户端进程完成了提交任务,它不会等到应用程序完成就会退出。

如果你的应用程序通过Spark submit启动,你的应用程序jar包将会自动分发到所有的worker节点。对于你的应用程序依赖的其它jar包,你应该用--jars符号指定(如--jars jar1,jar2)。

另外,cluster模式支持自动的重启你的应用程序(如果程序一非零的退出码退出)。为了用这个特征,当启动应用程序时,你可以传递--supervise符号到spark-submit。如果你想杀死反复失败的应用, 你可以通过如下的方式:

./bin/spark-class 域名域名nt kill <master url=""> <driver id="">

你可以在独立部署的Master web UI(http://:8080)中找到driver ID。


资源调度

独立部署的集群模式仅仅支持简单的FIFO调度器。然而,为了允许多个并行的用户,你能够控制每个应用程序能用的最大资源数。在默认情况下,它将获得集群的所有核,这只有在某一时刻只 允许一个应用程序才有意义。你可以通过域名在SparkConf中设置核数。

val conf = new SparkConf()
             .setMaster(...)
             .setAppName(...)
             .set("域名", "10")
val sc = new SparkContext(conf)

另外,你可以在集群的master进程中配置域名ultCores来改变默认的值。在conf/spark-域名添加下面的行:

export SPARK_MASTER_OPTS="-域名ultCores=<value>"

这在用户没有配置最大核数的共享集群中是有用的。


高可用

默认情况下,独立的调度集群对worker失败是有弹性的(在Spark本身的范围内是有弹性的,对丢失的工作通过转移它到另外的worker来解决)。然而,调度器通过master去执行调度决定, 这会造成单点故障:如果master死了,新的应用程序就无法创建。为了避免这个,我们有两个高可用的模式。

用ZooKeeper的备用master

利用ZooKeeper去支持领导选举以及一些状态存储,你能够在你的集群中启动多个master,这些master连接到同一个ZooKeeper实例上。一个被选为“领导”,其它的保持备用模式。如果当前 的领导死了,另一个master将会被选中,恢复老master的状态,然后恢复调度。整个的恢复过程大概需要1到2分钟。注意,这个恢复时间仅仅会影响调度新的应用程序-运行在失败master中的 应用程序不受影响。

配置

为了开启这个恢复模式,你可以用下面的属性在spark-env中设置SPARK_DAEMON_JAVA_OPTS

System property Meaning
域名veryMode 设置ZOOKEEPER去启动备用master模式(默认为none)
域名域名 zookeeper集群url(如192.域名:2181,192.域名:2181)
域名域名 zookeeper保存恢复状态的目录(默认是/spark)

可能的陷阱:如果你在集群中有多个masters,但是没有用zookeeper正确的配置这些masters,这些masters不会发现彼此,会认为它们都是leaders。这将会造成一个不健康的集群状态(因为所有的master都会独立的调度)。

细节

zookeeper集群启动之后,开启高可用是简单的。在相同的zookeeper配置(zookeeper URL和目录)下,在不同的节点上简单地启动多个master进程。master可以随时添加和删除。

为了调度新的应用程序或者添加worker到集群,它需要知道当前leader的IP地址。这可以通过简单的传递一个master列表来完成。例如,你可能启动你的SparkContext指向spark://host1:port1,host2:port2。 这将造成你的SparkContext同时注册这两个master-如果host1死了,这个配置文件将一直是正确的,因为我们将找到新的leader-host2

"registering with a Master"和正常操作之间有重要的区别。当启动时,一个应用程序或者worker需要能够发现和注册当前的leader master。一旦它成功注册,它就在系统中了。如果 错误发生,新的leader将会接触所有之前注册的应用程序和worker,通知他们领导关系的变化,所以它们甚至不需要事先知道新启动的leader的存在。

由于这个属性的存在,新的master可以在任何时候创建。你唯一需要担心的问题是新的应用程序和workers能够发现它并将它注册进来以防它成为leader master。


用本地文件系统做单节点恢复

zookeeper是生产环境下最好的选择,但是如果你想在master死掉后重启它,FILESYSTEM模式可以解决。当应用程序和worker注册,它们拥有足够的状态写入提供的目录,以至于在重启master 进程时它们能够恢复。

配置

为了开启这个恢复模式,你可以用下面的属性在spark-env中设置SPARK_DAEMON_JAVA_OPTS

System property Meaning
域名veryMode 设置为FILESYSTEM开启单节点恢复模式(默认为none)
域名veryDirectory 用来恢复状态的目录

细节

  • 这个解决方案可以和监控器/管理器(如monit)相配合,或者仅仅通过重启开启手动恢复。
  • 虽然文件系统的恢复似乎比没有做任何恢复要好,但对于特定的开发或实验目的,这种模式可能是次优的。特别是,通过stop-域名杀掉master不会清除它的恢复状态,所以,不管你何时启动一个新的master,它都将进入恢复模式。这可能使启动时间增加到1分钟。
  • 虽然它不是官方支持的方式,你也可以创建一个NFS目录作为恢复目录。如果原始的master节点完全死掉,你可以在不同的节点启动master,它可以正确的恢复之前注册的所有应用程序和workers。未来的应用程序会发现这个新的master。

在YARN上运行Spark

配置

大部分为Spark on YARN模式提供的配置与其它部署模式提供的配置相同。下面这些是为Spark on YARN模式提供的配置。

Hadoop 配置

记得到yarn-site-xml下添加:

vim  $HADOOP_HOME/etc/hadoop/yarn-域名
<property>
    <name>域名-check-enabled</name>
    <value>false</value>
</property>

<property>
    <name>域名-check-enabled</name>
    <value>false</value>
</property> 

Spark属性

Property Name Default Meaning
域名域名Tries 10 ApplicationMaster等待Spark master的次数以及SparkContext初始化尝试的次数
域名域名ication HDFS默认的复制次数(3) 上传到HDFS的文件的HDFS复制水平。这些文件包括Spark jar、app jar以及任何分布式缓存文件/档案
域名域名s false 设置为true,则在作业结束时保留阶段性文件(Spark jar、app jar以及任何分布式缓存文件)而不是删除它们
域名域名rval-ms 5000 Spark application master给YARN ResourceManager发送心跳的时间间隔(ms)
域名.域名ures numExecutors * 2,最小为3 失败应用程序之前最大的执行失败数
域名域名ess (none) Spark历史服务器(如域名:18080)的地址。这个地址不应该包含一个模式(http://)。默认情况下没有设置值,这是因为该选项是一个可选选项。当Spark应用程序完成从域名--%2C-域名--sparkresourcemanager-0w75an08pwqoodr0t8owxt5j2u2a/) UI到Spark历史服务器UI的连接时,这个地址从YARN ResourceManager得到
域名.archives (none) 提取逗号分隔的档案列表到每个执行器的工作目录
域名.files (none) 放置逗号分隔的文件列表到每个执行器的工作目录
域名域名ryOverhead executorMemory * 域名,最小384 分配给每个执行器的堆内存大小(以MB为单位)。它是VM开销、interned字符串或者其它本地开销占用的内存。这往往随着执行器大小而增长。(典型情况下是6%-10%)
域名域名ryOverhead driverMemory * 域名,最小384 分配给每个driver的堆内存大小(以MB为单位)。它是VM开销、interned字符串或者其它本地开销占用的内存。这往往随着执行器大小而增长。(典型情况下是6%-10%)
域名e default 应用程序被提交到的YARN队列的名称
域名 (none) Spark jar文件的位置,覆盖默认的位置。默认情况下,Spark on YARN将会用到本地安装的Spark jar。但是Spark jar也可以HDFS中的一个公共位置。这允许YARN缓存它到节点上,而不用在每次运行应用程序时都需要分配。指向HDFS中的jar包,可以这个参数为"hdfs:///some/path"
域名域名nodes (none) 你的Spark应用程序访问的HDFS namenode列表。例如,域名域名nodes=hdfs://域名:8032,hdfs://域名:8032,Spark应用程序必须访问namenode列表,Kerberos必须正确配置来访问它们。Spark获得namenode的安全令牌,这样Spark应用程序就能够访问这些远程的HDFS集群。
域名ainerLauncherMaxThreads 25 为了启动执行者容器,应用程序master用到的最大线程数
域名asterEnv.[EnvironmentVariableName] (none) 添加通过EnvironmentVariableName指定的环境变量到Application Master处理YARN上的启动。用户可以指定多个该设置,从而设置多个环境变量。在ya
标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。