阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Spark1.0.0部署指南

120次阅读
没有评论

共计 24815 个字符,预计需要花费 63 分钟才能阅读完成。

1 节点说明

 

IP

Role

192.168.1.111

ActiveNameNode

192.168.1.112

StandbyNameNode,Master,Worker

192.168.1.113

DataNode,Master,Worker

192.168.1.114

DataNode,Worker

HDFS 集群和 Spark 集群之间节点共用。

2 安装 HDFS

见 HDFS2.X 和 Hive 的安装部署文档:http://www.linuxidc.com/Linux/2014-07/104302.htm

3 Spark 部署

Spark 常用的安装部署模式有 Spark On YarnStandalone,可以同时使用。

3.1 Spark on Yarn

这种模式,借助 Yarn 资源分配的功能,使用 Spark 客户端来向 Yarn 提交任务运行。只需将 Spark 的部署包放置到 Yarn 集群的某个节点上即可 (或者是 Yarn 的客户端, 能读取到 Yarn 集群的配置文件即可)。Spark 本身的 Worker 节点、Master 节点不需要启动。

但是,Spark 的部署包须是基于对应的 Yarn 版本正确编译后的,否则会出现 Spark 和 Yarn 的兼容性问题。

on Yarn 的两种运行方式,其运行结束后的日志不能在 Yarn 的 Application 管理界面看到,目前只能在客户端通过:

yarn logs -applicationId <applicationId>

命令查看每个 Application 的日志。

3.1.1 配置

部署这种模式,需要修改 conf 目录下的 spark-env.sh 文件。在其中新增如下配置选项:

 
export Hadoop_HOME= /home/hadoop/hadoop-2.0.0-cdh4.5.0

export HADOOP_CONF_DIR= $HADOOP_HOME/etc/hadoop

SPARK_EXECUTOR_INSTANCES=2

SPARK_EXECUTOR_CORES=1

SPARK_EXECUTOR_MEMORY=400M

SPARK_DRIVER_MEMORY=400M

SPARK_YARN_APP_NAME="Spark 1.0.0"
 

 

其中:

(1) HADOOP_HOME: 当前节点中 HDFS 的部署路径,因为 Spark 需要和 HDFS 中的节点在一起;

(2) HADOOP_CONF_DIR:HDFS 节点中的 conf 配置文件路径,正常情况下此目录为 $HADOOP_HOME/etc/hadoop;

(3) SPARK_EXECUTOR_INSTANCES: 在 Yarn 集群中启动的 Worker 的数目,默认为 2 个;

(4) SPARK_EXECUTOR_CORES: 每个 Worker 所占用的 CPU 核的数目;

(5) SPARK_EXECUTOR_MEMORY: 每个 Worker 所占用的内存大小;

(6) SPARK_DRIVER_MEMORY:Spark 应用程序 Application 所占的内存大小,这里的 Driver 对应 Yarn 中的 ApplicationMaster;

(7) SPARK_YARN_APP_NAME:Spark Application 在 Yarn 中的名字;

配置完成后,将 Spark 部署文件放置到 Yarn 的节点中即可。这里,将 spark-1.0.0 整个目录 放到 Yarn 集群的一个节点 192.168.1.112 的/home/hadoop(设为 spark 的安装路径的父目录) 路径下。

 

3.1.2 测试

在 Spark 的部署路径的 bin 路径下,执行 spark-submit 脚本来运行 spark-examples 包中的例子。执行如下:

 
./bin/spark-submit --master yarn \

--class org.apache.spark.examples.JavaWordCount \

--executor-memory 400M \

--driver-memory 400M \

/home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar ./hdfs-site.xml
 

————————————– 分割线 ————————————–

CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm

Spark 简介及其在 Ubuntu 下的安装使用 http://www.linuxidc.com/Linux/2013-08/88606.htm

安装 Spark 集群(在 CentOS 上) http://www.linuxidc.com/Linux/2013-08/88599.htm

Hadoop vs Spark 性能对比 http://www.linuxidc.com/Linux/2013-08/88597.htm

Spark 安装与学习 http://www.linuxidc.com/Linux/2013-08/88596.htm

Spark 并行计算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm

————————————– 分割线 ————————————–

这个例子是计算 WordCount 的,例子被打包在 /home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar 包中,对应的 Class 为 org.apache.spark.examples.JavaWordCount./hdfs-site.xml 是 HDFS 中指定路径下的一个文件,WordCount 就是针对它来做的。而 –master yarn 就是指定运行在 Yarn 集群中,以 yarn 模式运行。

Spark On Yarn 有两种运行模式,一种是 Yarn Cluster 方式,一种是 Yarn Client 方式。

(1) Yarn Cluster: Spark Driver 程序将作为一个 ApplicationMaster 在 YARN 集群中先启动,然后再由 ApplicationMaster 向 RM 申请资源启动 executor 以运行 Task。因为 Driver 程序在 Yarn 中运行,所以程序的运行结果不能在客户端显示,所以最好将结果保存在 HDFS 上,客户端的终端显示的是作为 Yarn 的 job 的运行情况。

(2) Yarn Client: Spark Driver 程序在客户端上运行,然后向 Yarn 申请运行 exeutor 以运行 Task,本地程序负责最后的结果汇总等。客户端的 Driver 将应用提交给 Yarn 后,Yarn 会先后启动 ApplicationMaster 和 executor,另外 ApplicationMaster 和 executor 都是装载在 container 里运行,container 默认的内存是 1G,ApplicationMaster 分配的内存是 driver-memory,executor 分配的内存是 executor-memory。同时,因为 Driver 在客户端,所以程序的运行结果可以在客户端显示,Driver 以进程名为 SparkSubmit 的形式存在。

上面命令中的提交方式“yarn”就是 默认按照“Yarn Client”方式 运行。用户可自定义运行方式,通过“–master”指定程序以 yarn、yarn-cluster 或者 yarn-client 中的一种方式运行。

需要重点说明的是最后文件的路径,是相当于 HDFS 中的 /user/hadoop 而言,hadoop 是当前命令的用户。“./hdfs-site.xml”在 HDFS 中的全路径为“hdfs://namespace/user/hadoop/hdfs-site.xml”,其中 hadoop 是当前的用户,namespace 是 HDFS 的命名空间;如果写成“/hdfs-site.xml”则在 HDFS 中指的是“hdfs://namespace/hdfs-site.xml”;当然也可以直接传入“hdfs://namespace/user/hadoop/hdfs-site.xml”用于指定在 HDFS 中的要进行 WordCount 计算的文件。

另外,Spark 应用程序需要的 CPU Core 数目和内存,需要根据当前 Yarn 的 NodeManager 的硬件条件相应设置,不能超过 NodeManager 的硬件条件。

 
./bin/spark-submit --master yarn \

--class org.apache.spark.examples.JavaWordCount \

--executor-memory 400M \

--driver-memory 400M \

/home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar hdfs://namespace/user/hadoop/hdfs-site.xml
 

 

在 Yarn 的 ResourceManager 对应的 Web 界面中查看启动的 Application。

Running:

Spark1.0.0 部署指南

Success:

Spark1.0.0 部署指南

同时可以在启动脚本的客户端看到 WordCount 的运行结果:

Spark1.0.0 部署指南

 

3.2 Spark Standalone

这种模式,就是把 Spark 单独作为一个集群来进行部署。集群中有两种节点,一种是 Master,另一种是 Worker 节点。Master 负责分配任务给 Worker 节点来执行,并负责最后的结果合并,Worker 节点负责具体的任务执行。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-07/104304p2.htm

3.2.1 配置

所需修改的配置文件除了 spark-env.sh 文件以外,还有 slave 文件,都位于 conf 目录中。

slave 文件中保存的是 worker 节点 host 或者 IP,此处的配置为:

192.168.1.112

192.168.1.113

192.168.1.114

至于 spark-env.sh 文件,可以配置如下属性:

(1) SPARK_MASTER_PORT:Master 服务端口,默认为 7077;

(2) SPARK_WORKER_CORES: 每个 Worker 进程所需要的 CPU 核的数目;

(3) SPARK_WORKER_MEMORY: 每个 Worker 进程所需要的内存大小;

(4) SPARK_WORKER_INSTANCES:每个 Worker 节点上运行 Worker 进程的数目;

(5) SPARK_MASTER_WEBUI_PORT:Master 节点对应 Web 服务的端口;

(6)export SPARK_DAEMON_Java_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.1.117:2181,192.168.1.118:2181,192.168.1.119:2181 -Dspark.deploy.zookeeper.dir=/spark“: 用于指定 Master 的 HA,依赖于 zookeeper 集群;

(7) export SPARK_JAVA_OPTS=”-Dspark.cores.max=4″:用于限定每个提交的 Spark Application 的使用的 CPU 核的数目,因为 缺省情况下提交的 Application 会使用所有集群中剩余的 CPU Core

注意在 Worker 进程的 CPU 个数和内存大小的时候,要结合机器的实际硬件条件,如果一个 Worker 节点上的所有 Worker 进程需要的 CPU 总数目或者内存大小超过当前 Worker 节点的硬件条件,则 Worker 进程会 启动失败

将配置好的 Spark 文件拷贝至每个 Spark 集群的节点上的相同路径中。为方便使用spark-shell,可以在环境变量中配置上SPARK_HOME

3.2.2 启动

配置结束后,就该启动集群了。这里使用 Master 的 HA 方式,选取 192.168.1.112、192.168.1.113 节点作为 Master192.168.1.112、192.168.1.113、192.168.1.114 节点上运行两个 Worker 进程。

首先在 192.168.1.113 节点上做此操作:

Spark1.0.0 部署指南

启动之后,可以查看当前节点的进程:

Spark1.0.0 部署指南

另外,为了保证 Master 的 HA,在 192.168.1.112 节点上只启动Master

Spark1.0.0 部署指南

192.168.1.112节点的进程为:

Spark1.0.0 部署指南

启动过后,通过 Web 页面查看集群的情况,这里访问的是:

http://192.168.1.113:8090/

Spark1.0.0 部署指南

再看 standby 节点 192.168.1.112 的 web 界面 http://192.168.1.112:8090/

Spark1.0.0 部署指南

3.2.3 测试

Spark 的 bin 子目录中的 spark-submit 脚本是用于提交程序到集群中运行的工具,我们使用此工具做一个关于 pi 的计算。命令如下:

 
./bin/spark-submit --master spark://spark113:7077 \

--class org.apache.spark.examples.SparkPi 
--name Spark-Pi --executor-memory 400M 
--driver-memory 512M 
/home/Hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar
 

 

其中 –master 参数用于指定 Master 节点的 URI,但是这里 填的是 Host,不是 IP

任务启动之后,在 Spark 的 Master 的 Web 界面可以看到运行中的 Application。

Spark1.0.0 部署指南

任务运行结束之后,在 Web 界面中 Completed Applications 表格 中会看到对应的结果。

Spark1.0.0 部署指南

同时,命令行中会打印出来运行的结果,如下所示:

1 节点说明

 

IP

Role

192.168.1.111

ActiveNameNode

192.168.1.112

StandbyNameNode,Master,Worker

192.168.1.113

DataNode,Master,Worker

192.168.1.114

DataNode,Worker

HDFS 集群和 Spark 集群之间节点共用。

2 安装 HDFS

见 HDFS2.X 和 Hive 的安装部署文档:http://www.linuxidc.com/Linux/2014-07/104302.htm

3 Spark 部署

Spark 常用的安装部署模式有 Spark On YarnStandalone,可以同时使用。

3.1 Spark on Yarn

这种模式,借助 Yarn 资源分配的功能,使用 Spark 客户端来向 Yarn 提交任务运行。只需将 Spark 的部署包放置到 Yarn 集群的某个节点上即可 (或者是 Yarn 的客户端, 能读取到 Yarn 集群的配置文件即可)。Spark 本身的 Worker 节点、Master 节点不需要启动。

但是,Spark 的部署包须是基于对应的 Yarn 版本正确编译后的,否则会出现 Spark 和 Yarn 的兼容性问题。

on Yarn 的两种运行方式,其运行结束后的日志不能在 Yarn 的 Application 管理界面看到,目前只能在客户端通过:

yarn logs -applicationId <applicationId>

命令查看每个 Application 的日志。

3.1.1 配置

部署这种模式,需要修改 conf 目录下的 spark-env.sh 文件。在其中新增如下配置选项:

 
export Hadoop_HOME= /home/hadoop/hadoop-2.0.0-cdh4.5.0

export HADOOP_CONF_DIR= $HADOOP_HOME/etc/hadoop

SPARK_EXECUTOR_INSTANCES=2

SPARK_EXECUTOR_CORES=1

SPARK_EXECUTOR_MEMORY=400M

SPARK_DRIVER_MEMORY=400M

SPARK_YARN_APP_NAME="Spark 1.0.0"
 

 

其中:

(1) HADOOP_HOME: 当前节点中 HDFS 的部署路径,因为 Spark 需要和 HDFS 中的节点在一起;

(2) HADOOP_CONF_DIR:HDFS 节点中的 conf 配置文件路径,正常情况下此目录为 $HADOOP_HOME/etc/hadoop;

(3) SPARK_EXECUTOR_INSTANCES: 在 Yarn 集群中启动的 Worker 的数目,默认为 2 个;

(4) SPARK_EXECUTOR_CORES: 每个 Worker 所占用的 CPU 核的数目;

(5) SPARK_EXECUTOR_MEMORY: 每个 Worker 所占用的内存大小;

(6) SPARK_DRIVER_MEMORY:Spark 应用程序 Application 所占的内存大小,这里的 Driver 对应 Yarn 中的 ApplicationMaster;

(7) SPARK_YARN_APP_NAME:Spark Application 在 Yarn 中的名字;

配置完成后,将 Spark 部署文件放置到 Yarn 的节点中即可。这里,将 spark-1.0.0 整个目录 放到 Yarn 集群的一个节点 192.168.1.112 的/home/hadoop(设为 spark 的安装路径的父目录) 路径下。

 

3.1.2 测试

在 Spark 的部署路径的 bin 路径下,执行 spark-submit 脚本来运行 spark-examples 包中的例子。执行如下:

 
./bin/spark-submit --master yarn \

--class org.apache.spark.examples.JavaWordCount \

--executor-memory 400M \

--driver-memory 400M \

/home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar ./hdfs-site.xml
 

————————————– 分割线 ————————————–

CentOS 6.2(64 位)下安装 Spark0.8.0 详细记录 http://www.linuxidc.com/Linux/2014-06/102583.htm

Spark 简介及其在 Ubuntu 下的安装使用 http://www.linuxidc.com/Linux/2013-08/88606.htm

安装 Spark 集群(在 CentOS 上) http://www.linuxidc.com/Linux/2013-08/88599.htm

Hadoop vs Spark 性能对比 http://www.linuxidc.com/Linux/2013-08/88597.htm

Spark 安装与学习 http://www.linuxidc.com/Linux/2013-08/88596.htm

Spark 并行计算模型 http://www.linuxidc.com/Linux/2012-12/76490.htm

————————————– 分割线 ————————————–

这个例子是计算 WordCount 的,例子被打包在 /home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar 包中,对应的 Class 为 org.apache.spark.examples.JavaWordCount./hdfs-site.xml 是 HDFS 中指定路径下的一个文件,WordCount 就是针对它来做的。而 –master yarn 就是指定运行在 Yarn 集群中,以 yarn 模式运行。

Spark On Yarn 有两种运行模式,一种是 Yarn Cluster 方式,一种是 Yarn Client 方式。

(1) Yarn Cluster: Spark Driver 程序将作为一个 ApplicationMaster 在 YARN 集群中先启动,然后再由 ApplicationMaster 向 RM 申请资源启动 executor 以运行 Task。因为 Driver 程序在 Yarn 中运行,所以程序的运行结果不能在客户端显示,所以最好将结果保存在 HDFS 上,客户端的终端显示的是作为 Yarn 的 job 的运行情况。

(2) Yarn Client: Spark Driver 程序在客户端上运行,然后向 Yarn 申请运行 exeutor 以运行 Task,本地程序负责最后的结果汇总等。客户端的 Driver 将应用提交给 Yarn 后,Yarn 会先后启动 ApplicationMaster 和 executor,另外 ApplicationMaster 和 executor 都是装载在 container 里运行,container 默认的内存是 1G,ApplicationMaster 分配的内存是 driver-memory,executor 分配的内存是 executor-memory。同时,因为 Driver 在客户端,所以程序的运行结果可以在客户端显示,Driver 以进程名为 SparkSubmit 的形式存在。

上面命令中的提交方式“yarn”就是 默认按照“Yarn Client”方式 运行。用户可自定义运行方式,通过“–master”指定程序以 yarn、yarn-cluster 或者 yarn-client 中的一种方式运行。

需要重点说明的是最后文件的路径,是相当于 HDFS 中的 /user/hadoop 而言,hadoop 是当前命令的用户。“./hdfs-site.xml”在 HDFS 中的全路径为“hdfs://namespace/user/hadoop/hdfs-site.xml”,其中 hadoop 是当前的用户,namespace 是 HDFS 的命名空间;如果写成“/hdfs-site.xml”则在 HDFS 中指的是“hdfs://namespace/hdfs-site.xml”;当然也可以直接传入“hdfs://namespace/user/hadoop/hdfs-site.xml”用于指定在 HDFS 中的要进行 WordCount 计算的文件。

另外,Spark 应用程序需要的 CPU Core 数目和内存,需要根据当前 Yarn 的 NodeManager 的硬件条件相应设置,不能超过 NodeManager 的硬件条件。

 
./bin/spark-submit --master yarn \

--class org.apache.spark.examples.JavaWordCount \

--executor-memory 400M \

--driver-memory 400M \

/home/hadoop/spark-1.0.0/examples/target/scala-2.10/spark-examples-1.0.0-hadoop2.0.0-cdh4.5.0.jar hdfs://namespace/user/hadoop/hdfs-site.xml
 

 

在 Yarn 的 ResourceManager 对应的 Web 界面中查看启动的 Application。

Running:

Spark1.0.0 部署指南

Success:

Spark1.0.0 部署指南

同时可以在启动脚本的客户端看到 WordCount 的运行结果:

Spark1.0.0 部署指南

 

3.2 Spark Standalone

这种模式,就是把 Spark 单独作为一个集群来进行部署。集群中有两种节点,一种是 Master,另一种是 Worker 节点。Master 负责分配任务给 Worker 节点来执行,并负责最后的结果合并,Worker 节点负责具体的任务执行。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2014-07/104304p2.htm

4 spark-submit 工具

上面测试程序的提交都是使用的 spark-submit 脚本,其位于 $SPARK_HOME/bin 目录中,执行时需要传入的参数说明如下:

Usage: spark-submit [options] <app jar | Python file> [app options]

参数名称

含义

–master MASTER_URL

可以是 spark://host:port, mesos://host:port, yarn, yarn-cluster,yarn-client, local

–deploy-mode DEPLOY_MODE

Driver 程序运行的地方,client 或者 cluster

–class CLASS_NAME

主类名称,含包名

–name NAME

Application 名称

–jars JARS

Driver 依赖的第三方 jar 包

–py-files PY_FILES

用逗号隔开的放置在 Python 应用程序 PYTHONPATH 上的.zip, .egg, .py 文件列表

–files FILES

用逗号隔开的要放置在每个 executor 工作目录的文件列表

–properties-file FILE

设置应用程序属性的文件路径,默认是 conf/spark-defaults.conf

–driver-memory MEM

Driver 程序使用内存大小

–driver-Java-options

 

–driver-library-path

Driver 程序的库路径

–driver-class-path

Driver 程序的类路径

–executor-memory MEM

executor 内存大小,默认 1G

–driver-cores NUM

Driver 程序的使用 CPU 个数,仅限于 Spark Alone 模式

–supervise

失败后是否重启 Driver,仅限于 Spark Alone 模式

–total-executor-cores NUM

executor 使用的总核数,仅限于 Spark Alone、Spark on Mesos 模式

–executor-cores NUM

每个 executor 使用的内核数,默认为 1,仅限于 Spark on Yarn 模式

–queue QUEUE_NAME

提交应用程序给哪个 YARN 的队列,默认是 default 队列,仅限于 Spark on Yarn 模式

–num-executors NUM

启动的 executor 数量,默认是 2 个,仅限于 Spark on Yarn 模式

–archives ARCHIVES

仅限于 Spark on Yarn 模式

另外,在执行 spark-submit.sh 工具进行提交应用之前,可以使用如下方式提前定义好当前 Spark Application 所使用的 CPU Core 数目和内存大小:

 
SPARK_JAVA_OPTS="-Dspark.cores.max=2 -Dspark.executor.memory=600m" 
./bin/spark-submit --master spark://update113:7077 \

--class org.apache.spark.examples.SparkPi 
…

…
 

 

5 Spark HistoryServer

类似于 Mapreduce 的 JobHistoryServer,Spark 也有一个服务可以保存历史 Application 的运行记录。

修改 $SPARK_HOME/conf 下的 spark-defaults.conf 文件(注意, 修改后的配置文件在每个节点都要有),其中可修改的配置属性为:

 

属性名称

默认值

含义

spark.history.updateInterval

10

以秒为单位,更新日志相关信息的时间间隔

spark.history.retainedApplications

250

保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除

spark.history.ui.port

18080

HistoryServer 的 web 端口

spark.history.kerberos.enabled

False

是否使用 kerberos 方式登录访问 HistoryServer,对于持久层位于安全集群的 HDFS 上是有用的,如果设置为 true,就要配置下面的两个属性

spark.history.kerberos.principal

 

用于 HistoryServer 的 kerberos 主体名称

spark.history.kerberos.keytab

 

用于 HistoryServer 的 kerberos keytab 文件位置

spark.history.ui.acls.enable

False

授权用户查看应用程序信息的时候是否检查 acl。如果启用,只有应用程序所有者和 spark.ui.view.acls 指定的用户可以查看应用程序信息; 否则,不做任何检查

spark.eventLog.enabled

False

是否记录 Spark 事件

spark.eventLog.dir

 

保存日志相关信息的路径,可以是 hdfs:// 开头的 HDFS 路径,也可以是 file:// 开头的本地路径,都需要提前创建

spark.yarn.historyServer.address

 

Server 端的 URL:Ip:port 或者 host:port

此处的设置如下:

spark.eventLog.enabled  true

spark.eventLog.dir      hdfs://yh/user/Hadoop/sparklogs

spark.yarn.historyServer.address    update113:18080

 

设置完文件之后,进入 sbin 目录启动服务:

Spark1.0.0 部署指南

运行完成的 Application 历史记录可以通过访问上面指定的 HistoryServer 地址查看,这里是 http://192.168.1.113:18080/。

Spark1.0.0 部署指南

无论运行时是本地模式,还是yarn-client、yarn-cluster,运行��录均可在此页面查看。

并且程序运行时的环境变量、系统参数、各个阶段的耗时均可在此查看,很强大

6 Spark 可配置参数

Spark 参数的配置可通过三种方式:SparkConf 方式 > 命令行参数方式 >文件配置方式

6.1 应用属性

 

属性名

默认值

含义

spark.app.name

 

应用程序名称

spark.master

 

要连接的 Spark 集群 Master 的 URL

spark.executor.memory

512 m

每个 executor 使用的内存大小

spark.serializer

org.apache.spark

.serializer.JavaSerializer

序列化方式,官方建议使用 org.apache.spark.serializer.KryoSerializer,当然也可以任意是定义为 org.apache.spark.Serializer 子类的序化器

spark.kryo.registrator

 

如果要使用 Kryo 序化器,需要创建一个继承 KryoRegistrator 的类并设置系统属性 spark.kryo.registrator 指向该类

spark.local.dir

/tmp

用于保存 map 输出文件或者转储 RDD。可以多个目录,之间以逗号分隔。在 Spark 1.0 及更高版本此属性会被环境变量 SPARK_LOCAL_DIRS(Standalone、Mesos)或 LOCAL_DIRS(YARN)代替

spark.logConf

False

SparkContext 启动时是否记录有效 SparkConf 信息

 

6.2 运行环境变量

 

属性名

默认值

含义

spark.executor.extraJavaOptions

 

传递给 executor 的额外 JVM 选项,但是不能使用它来设置 Spark 属性或堆空间大小

spark.executor.extraClassPath

 

追加到 executor 类路径中的附加类路径

spark.executor.extraLibraryPath

 

启动 executor JVM 时要用到的特殊库路径

spark.files.userClassPathFirst

False

executor 在加载类的时候是否优先使用用户自定义的 JAR 包,而不是 Spark 带有的 JAR 包,目前,该属性只是一项试验功能

 

6.3 Shuffle 操作相关属性

属性名

默认值

含义

spark.shuffle.consolidateFiles

False

如果为 true,在 shuffle 时就合并中间文件,对于有大量 Reduce 任务的 shuffle 来说,合并文件可以提高文件系统性能,如果使用的是 ext4 或 xfs 文件系统,建议设置为 true;对于 ext3,由于文件系统的限制,设置为 true 反而会使内核 >8 的机器降低性能

spark.shuffle.spill

True

如果为 true,在 shuffle 期间通过溢出数据到磁盘来降低了内存使用总量,溢出阈值是由 spark.shuffle.memoryFraction 指定的

spark.shuffle.spill.compress

True

是否压缩在 shuffle 期间溢出的数据,如果压缩将使用 spark.io.compression.codec。

spark.shuffle.compress

True

是否压缩 map 输出文件,压缩将使用 spark.io.compression.codec。

spark.shuffle.file.buffer.kb

100

每个 shuffle 的文件输出流内存缓冲区的大小,以 KB 为单位。这些缓冲区可以减少磁盘寻道的次数,也减少创建 shuffle 中间文件时的系统调用

spark.reducer.maxMbInFlight

48

每个 reduce 任务同时获取 map 输出的最大大小(以兆字节为单位)。由于每个 map 输出都需要一个缓冲区来接收它,这代表着每个 reduce 任务有固定的内存开销,所以要设置小点,除非有很大内存

 

6.4 SparkUI 相关属性

属性名

默认值

含义

spark.ui.port

4040

应用程序 webUI 的端口

spark.ui.retainedStages

1000

在 GC 之前保留的 stage 数量

spark.ui.killEnabled

True

允许在 webUI 将 stage 和相应的 job 杀死

spark.eventLog.enabled

False

是否记录 Spark 事件,用于应用程序在完成后重构 webUI

spark.eventLog.compress

False

是否压缩记录 Spark 事件,前提 spark.eventLog.enabled 为 true

spark.eventLog.dir

file:///tmp/spark-events

如果 spark.eventLog.enabled 为 true,该属性为记录 spark 事件的根目录。在此根目录中,Spark 为每个应用程序创建分目录,并将应用程序的事件记录到在此目录中。可以将此属性设置为 HDFS 目录,以便 history server 读取历史记录文件

 

6.5 压缩和序列化相关属性

属性名

默认值

含义

spark.broadcast.compress

True

是否在发送之前压缩广播变量

spark.rdd.compress

False

是否压缩 RDD 分区

spark.io.compression.codec

org.apache.spark.io.

LZFCompressionCodec

用于压缩内部数据如 RDD 分区和 shuffle 输出的编码解码器,org.apache.spark.io.LZFCompressionCodec 和 org.apache.spark.io.SnappyCompressionCodec。其中,Snappy 提供更快速的压缩和解压缩,而 LZF 提供了更好的压缩比

spark.io.compression.snappy

.block.size

32768

使用 Snappy 编码解码器时,编码解码器使用的块大小(以字节为单位)

spark.closure.serializer

org.apache.spark.serializer.

JavaSerializer

用于闭包的序化器,目前只有支持 Java 序化器

spark.serializer.
objectStreamReset

10000

org.apache.spark.serializer.JavaSerializer 序列化时,会缓存对象以防止写入冗余数据,此时会停止这些对象的垃圾收集。通过调用重置序化器,刷新该信息就可以收集旧对象。若要关闭这重定期重置功能将其设置为 < = 0。默认情况下每 10000 个对象将重置序化器

spark.kryo.referenceTracking

True

当使用 Kryo 序化数据时,是否跟踪对同一对象的引用。如果你的对象图有回路或者同一对象有多个副本,有必要设置为 true;其他情况下可以禁用以提高性能

spark.kryoserializer.buffer.mb

2

在 Kryo 里允许的最大对象大小(Kryo 会创建一个缓冲区,至少和序化的最大单个对象一样大)。每个 worker 的每个 core 只有一个缓冲区

 

6.6 执行时相关属性

属性名

默认值

含义

spark.default.parallelism

本地模式:机器核数

Mesos:8

其他:max(executor 的 core,2)

如果用户不设置,系统使用集群中运行 shuffle 操作的默认任务数(groupByKey、reduceByKey 等)

spark.broadcast.factory

org.apache.spark.broadcast.

HttpBroadcastFactory

广播的实现类

spark.broadcast.blockSize

4096

TorrentBroadcastFactory 块大小(以 kb 为单位)。过大会降低广播速度;过小会使印象 BlockManager 性能

spark.files.overwrite

Fale

通过 SparkContext.addFile() 添加的文件在目标中已经存在并且内容不匹配时,是否覆盖目标文件

spark.files.fetchTimeout

False

在获取由 driver 通过 SparkContext.addFile() 添加的文件时,是否使用通信时间超时

spark.storage.memoryFraction

0.6

Java 堆用于 cache 的比例

spark.tachyonStore.baseDir

System.getProperty(“java.io.tmpdir”)

用于存储 RDD 的 techyon 目录,tachyon 文件系统的 URL 由 spark.tachyonStore.url 设置,也可以是逗号分隔的多个 techyon 目录

spark.storage.

memoryMapThreshold

8192

以字节为单位的块大小,用于磁盘读取一个块大小时进行内存映射。这可以防止 Spark 在内存映射时使用很小块,一般情况下,对块进行内存映射的开销接近或低于操作系统的页大小

spark.tachyonStore.url

tachyon://localhost:19998

基于 techyon 文件的 URL

spark.cleaner.ttl

 

spark 记录任何元数据(stages 生成、task 生成等)的持续时间。定期清理可以确保将超期的元数据丢弃,这在运行长时间任务是很有用的,如运行 7 *24 的 sparkstreaming 任务。RDD 持久化在内存中的超期数据也会被清理

 

6.7 网络相关属性

属性名

默认值

含义

spark.driver.host

 

运行 driver 的主机名或 IP 地址

spark.driver.port

随机

driver 侦听的端口

spark.akka.frameSize

10

以 MB 为单位的 driver 和 executor 之间通信信息的大小,设置值越大,driver 可以接受更大的计算结果

spark.akka.threads

4

用于通信的 actor 线程数,在大型集群中拥有更多 CPU 内核的 driver 可以增加 actor 线程数

spark.akka.timeout

100

以秒为单位的 Spark 节点之间超时时间

spark.akka.heartbeat.pauses

600

下面 3 个参数是用于设置 Akka 自带的故障探测器。启用的话,以秒为单位设置如下这三个参数,有助于对恶意的 executor 的定位,而对于由于 GC 暂停或网络滞后引起的情况下,不需要开启故障探测器;另外故障探测器的开启会导致由于心跳信息的频繁交换而引起的网络泛滥。

本参数是设置可接受的心跳停顿时间

spark.akka.failure-detector.threshold

300.0

对应 Akka 的 akka.remote.transport-failure-detector.threshold

spark.akka.heartbeat.interval

1000

心跳间隔时间

 

6.8 调度相关属性

属性名

默认值

含义

spark.task.cpus

1

为每个任务分配的内核数

spark.task.maxFailures

4

Task 的最大重试次数

spark.scheduler.mode

FIFO

Spark 的任务调度模式,还有一种 Fair 模式

spark.cores.max

 

当应用程序运行在 Standalone 集群或者粗粒度共享模式 Mesos 集群时,应用程序向集群请求的最大 CPU 内核总数(不是指每台机器,而是整个集群)。如果不设置,对于 Standalone 集群将使用 spark.deploy.defaultCores 中数值,而 Mesos 将使用集群中可用的内核

spark.mesos.coarse

False

如果设置为 true,在 Mesos 集群中运行时使用粗粒度共享模式

spark.speculation

False

以下几个参数是关于 Spark 推测执行机制的相关参数。此参数设定是否使用推测执行机制,如果设置为 true 则 spark 使用推测执行机制,对于 Stage 中拖后腿的 Task 在其他节点中重新启动,并将最先完成的 Task 的计算结果最为最终结果

spark.speculation.interval

100

Spark 多长时间进行检查 task 运行状态用以推测,以毫秒为单位

spark.speculation.quantile

0.75

推测启动前,Stage 必须要完成总 Task 的百分比

spark.speculation.multiplier

1.5

比已完成 Task 的运行速度中位数慢多少倍才启用推测

spark.locality.wait

3000

以下几个参数是关于 Spark 数据本地性的。本参数是以毫秒为单位启动本地数据 task 的等待时间,如果超出就启动下一本地优先级别的 task。该设置同样可以应用到各优先级别的本地性之间(本地进程 -> 本地节点 -> 本地机架 -> 任意节点),当然,也可以通过 spark.locality.wait.node 等参数设置不同优先级别的本地性

spark.locality.wait.process

spark.locality.wait

本地进程级别的本地等待时间

spark.locality.wait.node

spark.locality.wait

本地节点级别的本地等待时间

spark.locality.wait.rack

spark.locality.wait

本地机架级别的本地等待时间

spark.scheduler.revive.interval

1000

复活重新获取资源的 Task 的最长时间间隔(毫秒),发生在 Task 因为本地资源不足而将资源分配给其他 Task 运行后进入等待时间,如果这个等待时间内重新获取足够的资源就继续计算

 

6.9 安全相关属性

属性名

默认值

含义

spark.authenticate

False

是否启用内部身份验证

spark.authenticate.secret

 

设置组件之间进行身份验证的密钥。如果不是 YARN 上运行并且 spark.authenticate 为 true 时,需要设置密钥

spark.core.connection. auth.wait.timeout

30

进行身份认证的超时时间

spark.ui.filters

 

Spark web UI 要使用的以逗号分隔的筛选器名称列表。筛选器要符合 javax servlet Filter 标准,每个筛选器的参数可以通过设置 java 系统属性来指定:

spark.<class name of filter>.params=’param1=value1,param2=value2′

例如:

-Dspark.ui.filters=com.test.filter1

-Dspark.com.test.filter1.params=’param1=foo,param2=testing’

spark.ui.acls.enable

False

Spark webUI 存取权限是否启用。如果启用,在用户浏览 web 界面的时候会检查用户是否有访问权限

spark.ui.view.acls

 

以逗号分隔 Spark webUI 访问用户的列表。默认情况下只有启动 Spark job 的用户才有访问权限

 

6.10 SparkStreaming 相关属性

属性名

默认值

含义

spark.streaming.blockInterval

200

Spark Streaming 接收器将接收数据合并成数据块并存储在 Spark 里的时间间隔,毫秒

spark.streaming.unpersist

True

如果设置为 true,强迫将 SparkStreaming 持久化的 RDD 数据从 Spark 内存中清理,同样的,SparkStreaming 接收的原始输入数据也会自动被清理;如果设置为 false,则允许原始输入数据和持久化的 RDD 数据可被外部的 Streaming 应用程序访问,因为这些数据不会自动清理

6.11 Standalone 模式特有属性

可以在文件 conf/spark-env.sh 中来设置此模式的特有相关属性:

(1)SPARK_MASTER_OPTS:配置 master 使用的属性

(2)SPARK_WORKER_OPTS:配置 worker 使用的属性

(3)SPARK_DAEMON_JAVA_OPTS:配置 master 和 work 都使用的属性

配置的时候,使用类似的语句:

export SPARK_MASTER_OPTS=”-Dx1=y1 -Dx2=y2″

其中 x 代表属性,y 代表属性值。

SPARK_MASTER_OPTS所支持的属性有:

属性名

默认值

含义

spark.deploy.spreadOut

True

Standalone 集群管理器是否自由选择节点还是固定到尽可能少的节点,前者会有更好的数据本地性,后者对于计算密集型工作负载更有效

spark.worker.timeout

60

master 因为没有收到心跳信息而认为 worker 丢失的时间(秒)

spark.deploy.defaultCores

 

如果没有设置 spark.cores.max,该参数设置 Standalone 集群分配给应用程序的最大内核数,如果不设置,应用程序获取所有的有效内核。注意在一个共享的集群中,设置一个低值防止攫取了所有的内核,影响他人的使用

 

SPARK_WORKER_OPTS所支持的属性有

属性名

默认值

含义

spark.worker.cleanup.enabled

False

是否定期清理 worker 的应用程序工作目录,只适用于 Standalone 模式,清理的时候将无视应用程序是否在运行

spark.worker.cleanup.interval

1800

清理 worker 本地过期的应用程序工作目录的时间间隔(秒)

spark.worker.cleanup.appDataTtl

7*24*3600

worker 保留应用程序工作目录的有效时间。该时间由磁盘空间、应用程序日志、应用程序的 jar 包以及应用程序的提交频率来设定

 

SPARK_DAEMON_JAVA_OPTS所支持的属性有:

属性名

含义

spark.deploy.recoveryMode

下面 3 个参数是用于配置 zookeeper 模式的 master HA。设置为 ZOOKEEPER 表示启用 master 备用恢复模式,默认为 NONE

spark.deploy.zookeeper.url

zookeeper 集群 URL

spark.deploy.zookeeper.dir

zooKeeper 保存恢复状态的目录,缺省为 /spark

spark.deploy.recoveryMode

设成 FILESYSTEM 启用 master 单节点恢复模式,缺省值为 NONE

spark.deploy.recoveryDirectory

Spark 保存恢复状态的目录

 

6.12 Spark on Yarn 特有属性

属性名

默认值

含义

spark.yarn.applicationMaster.waitTries

10

RM 等待 Spark AppMaster 启动重试次数,也就是 SparkContext 初始化次数。超过这个数值,启动失败

spark.yarn.submit.file.replication

3

应用程序上传到 HDFS 的文件的副本数

spark.yarn.preserve.staging.files

False

若为 true,在 job 结束后,将 stage 相关的文件保留而不是删除

spark.yarn.scheduler.heartbeat.interval-ms

5000

Spark AppMaster 发送心跳信息给 YARN RM 的时间间隔

spark.yarn.max.executor.failures

2 倍于 executor 数

导致应用程序宣告失败的最大 executor 失败次数

spark.yarn.historyServer.address

 

Spark history server 的地址(不要加 http://)。这个地址会在 Spark 应用程序完成后提交给 YARN RM,然后 RM 将信息从 RM UI 写到 history server UI 上。

7 示例配置

主要的配置文件均位于 $SPARK_HOME/conf 中,包括 slave、spark-env.sh、spark-defaults.conf 文件等。

7.1 slave 文件

192.168.1.112

192.168.1.113

192.168.1.114

 

7.2 spark-env.sh 文件

 
export Java_HOME="/export/servers/jdk1.6.0_25" 

#yarn

export Hadoop_HOME=/home/hadoop/hadoop-2.0.0-cdh4.5.0

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

SPARK_EXECUTOR_INSTANCES=2

SPARK_EXECUTOR_CORES=1

SPARK_EXECUTOR_MEMORY=400M

SPARK_DRIVER_MEMORY=400M

SPARK_YARN_APP_NAME="Spark 1.0.0"


#alone

SPARK_MASTER_WEBUI_PORT=8090

SPARK_WORKER_MEMORY=400M

SPARK_WORKER_CORES=1

SPARK_WORKER_INSTANCES=2

#Master HA

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.1.117:2181,192.168.1.118:2181,192.168.1.119:2181 -Dspark.deploy.zookeeper.dir=/spark"
 

 

7.3 spark-defaults.conf 文件

 
#history server

spark.eventLog.enabled  true

spark.eventLog.dir      hdfs://namespace/user/hadoop/sparklogs

spark.yarn.historyServer.address    spark113:18080

#shuffle

spark.shuffle.consolidateFiles true

#task

spark.task.cpus 1

spark.task.maxFailures 3

#scheduler type

spark.scheduler.mode FAIR

#security

park.authenticate true

spark.authenticate.secret hadoop

spark.core.connection.auth.wait.timeout 1500

spark.ui.acls.enable true

spark.ui.view.acls root,hadoop

#each executor used max memory

spark.executor.memory 400m

#spark on yarn

spark.yarn.applicationMaster.waitTries 5

spark.yarn.submit.file.replication 3

spark.yarn.preserve.staging.files false

spark.yarn.scheduler.heartbeat.interval-ms 5000

#park standalone and on mesos

spark.cores.max 4
 

 

8 Spark SQL

Spark 支持 Scala、Python 等语言写的脚本直接在 Spark 环境执行,更重要的是支持对 Hive 语句进行包装后在 Spark 上运行。这就是 Spark SQL。

8.1 相关配置

配置的步骤比较简单,把 Hive 的配置文件 hive-site.xml 直接放置到 $SPARK_HOME 的 conf 路径 下即可。如果是想在 Spark 集群本地执行 SQL 的话,每个对应的节点都要做同样的配置。

8.2 运行 SQL

启动 bin 目录下的 spark-shell 脚本,依次执行如下语句:

 
val sc: SparkContext

val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)

import hiveContext._

hql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")

hql("LOAD DATA LOCAL INPATH'/examples /data.txt'INTO TABLE src")

hql("FROM src SELECT key, value").collect().foreach(println)
 

 

上面的命令,分别是声明 SparkContext 对象,利用 hql 方法执行 Hive 的 SQL 语句,在执行 SQL 语句的过程中,可以通过 Hive 的 Cli 客户端进行查看相应操作的结果。

8.3 on yarn 模式

由于 spark-shell 脚本是在本地执行的,如果想放到 Yarn 上去执行的话,可以使用上面第 4 节中的 spark-submit 工具,这时候需要对需要输入的 sql 语句进行包装,将包装类打包成 jar 文件,再提交。

包装类的代码如下:

 
 1 package spark;
 2 
 3 import java.util.List;
 4 
 5 import org.apache.spark.SparkConf;
 6 import org.apache.spark.api.java.JavaSparkContext;
 7 import org.apache.spark.sql.api.java.Row;
 8 import org.apache.spark.sql.hive.api.java.JavaHiveContext;
 9 
10 /**
11  * Description:
12  * Author: ITScott@163.com
13  * Date: 2014/7/15
14  */
15 public class SparkSQL {16 
17     public static void main(String[] args) {18         if(args.length != 2){19             System.out.println("usage: <applicationName> <sql statments>");
20             System.exit(1);
21         }
22 
23         String applicationName = args[0];
24         String sql = args[1];
25 
26         SparkConf conf = new SparkConf().setAppName(applicationName);
27         JavaSparkContext sc = new JavaSparkContext(conf);
28         JavaHiveContext hiveContext = new JavaHiveContext(sc);
29         List<Row> results = hiveContext.hql(sql).collect();
30 
31         System.out.println("Sql is:" + sql + ", has been executed over.");
32         System.out.println("The result size is" + results.size() + ", they are:");
33         for(int i=0; i<results.size(); i++){34             System.out.println(results.get(i).toString());
35         }
36 
37         System.out.println("Execute over ...");
38         sc.stop();
39         System.out.println("Stop over ...");
40     }
41 
42 }
 

 

将其打包成 jar 文件 spark-0.0.1-SNAPSHOT.jar,再使用spark-submit 工具进行任务的提交,命令如下:

 
./spark-submit 
--class spark.SparkSQL 
--master yarn-cluster 
--num-executors 3 
--driver-memory 400m --executor-memory 400m --executor-cores 1 
--jars /home/hadoop/spark-1.0.0/examples/libs/spark-core_2.10-1.0.0.jar,/home/hadoop/spark-1.0.0/examples/libs/spark-hive_2.10-1.0.0.jar,/home/hadoop/spark-1.0.0/lib_managed/jars/datanucleus-api-jdo-3.2.1.jar,/home/hadoop/spark-1.0.0/lib_managed/jars/datanucleus-core-3.2.2.jar,/home/hadoop/spark-1.0.0/lib_managed/jars/datanucleus-rdbms-3.2.1.jar,/home/hadoop/hive-0.12.0/lib/MySQL-connector-java-5.1.27-bin.jar

--files /home/hadoop/spark-1.0.0/conf/hive-site.xml 
/home/hadoop/spark-1.0.0/examples/libs/spark-0.0.1-SNAPSHOT.jar "hiveTest" "CREATE TABLE IF NOT EXISTS test4 (key INT, value STRING)"
 

 

其中,–master参数指定的是 yarn-cluster 模式,当然也可以使用 yarn-client 模式,至于区别,已经在上文说了;–class 指定的是我们包装类的主类,见上文源码;–jars是依赖的四个 jar 包;–files是指定的 hive-site.xml 配置文件,提交到 Yarn 中的 Application 在执行的时候,需要把此配置文件分发到每个 Executor 上;最后的两个参数,一个是 Application 的名称,一个是运行的 SQL 语句

运行结束后,可以到 Spark HistoryServer 中查看运行结果。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计24815字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中