PySpark任务提交spark-submit参数设置一文详解

news2024/11/23 4:05:21

目录

前言

一、PySpark集群运行原理

二、spark-submit参数详解

1.指定运行目录

2.--deploy-mode

 3.--master

 4.驱动程序和执行器资源

 5.--files和--verbose

 6.Spark提交配置

三.PySpark程序提交配置选项

1.构建一套虚拟环境

2. 模块依赖问题原因

参阅


前言

之前我们已经进行了pyspark环境的搭建以及经过jupyter notebook进行过开发以及实现了一系列的函数功能.

PySpark数据分析基础:Spark本地环境部署搭建

 但是一般我们跑spark都是在集群上面跑,只有测试一般在本地上测试,而且每个公司配置的spark集群的端口和设置的参数都有很大出入,故每种情况都有可能发生。所以一般任务提交的参数最好都需要能够清楚的明白对应功能。很多spark任务都会吃大量的内存以及队列资源,合理的安排spark资源十分重要,这些都需要我们在spark-submit指令上面配置。本篇文章将会将spark-submit的各类参数以及参数对应选项和其功能都会列举出来,并且写有对应场景的pyspark任务提交时参数配置,希望能够帮助到大家,还请点赞支持一下博主。


一、PySpark集群运行原理

我在之前的文章中对pyspark集群运行原理有过比较详细的解答:

PySpark数据分析基础:PySpark原理详解

 主节点的Python通过Py4j通信传递SparkContext,最后在JVM Driver上面生成SparkContxt。主节点JVM Driver与其他从节点的JVM Executor通信传输SparkContext,JVM Executor通过分解SparkContext为许多Task,给pyspark.daemon调用pyspark.work 从socket中读取要执行的python函数和数据,开始真正的数据处理逻辑。数据处理完成之后将处理结果写回socket,jvm中通过PythonRDD的read方法读取,并返回结果。最终executor将PythonRDD的执行结果上报到drive上,返回给用户。

总体而言也就是spark和python程序的一种转换,可以理解为将python程序转换成了scala的spark任务去执行,本质上还是spark任务的提交。故配置是和spark任务应该是一致的,从官方文档也能够了解:

Submitting Applications

二、spark-submit参数详解

在运行spark-submit指令的时候一般还是直接提交shell命令,或是在dolphinscheduler上,总之在集群上都可提交。spark的bin目录中的spark-submit脚本用于在集群上启动应用程序。它可以通过统一的接口使用Spark支持的所有集群管理器,因此不必为每个集群管理器配置应用程序。

对于Python,可以使用spark-submit的--py-files参数来添加.py、.zip或.egg文件,以便随应用程序一起分发。如果依赖多个Python文件,可以将它们打包成.zip或.egg文件。

1.指定运行目录

一旦绑定了用户应用程序,就可以使用bin/spark提交脚本启动它。该脚本负责使用Spark及其依赖项设置类路径,并可以支持Spark支持的不同集群管理器和部署模式:

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

其中指定Hadoop配置可以通过HADOOP_CONF_DIR 指定conf目录。

2.--deploy-mode

使用--deploy-mode,指定运行Spark应用程序驱动程序的位置。Spark支持集群和客户端部署模式。

可选参数有两种:

选项说明
cluster在集群模式下,驱动程序在其中一个工作节点上运行,该节点在应用程序的Spark Web UI上显示为驱动程序。集群模式用于运行生产作业。逻辑运算与任务执行均在cluster上。
client在客户端模式下,驱动程序在提交应用程序的本地运行。客户端模式主要用于交互和调试目的。注意,在客户端模式下,只有驱动程序在本地运行,所有其他执行器在集群上的不同节点上运行。这样逻辑运算在client上执行,任务执行在cluster上

 3.--master

使用--master选项,可以指定要使用哪个集群管理器来运行应用程序。Spark目前支持Yarn、Mesos、Kubernetes、Stand-alone和local。这些的用途如下所述。

集群管理器选项参数说明
Yarnyarn提交到yarn模式部署的集群中,前提是集群是使用yarn管理的
Mesosmesos://HOST:PORT提交到mesos模式部署的集群中,并指定主节点的IP与端口
Standalonespark://HOST:PORT提交到standalone模式部署的spark集群中,并指定主节点的IP与端口
Kubernetesk8s://HOST:PORT
k8s://https://HOST:PORT
提交到Kubernetes模式部署的spark集群中,并指定主节点的IP与端口
locallocal
local[k]
local[K,F]

local:提交到本地服务器执行,并分配单个线程

local[k]:提交到本地服务器执行,并分配k个线程

使用local[k,F]并指定F及其失败时应运行的尝试次数。

 如果我们想要提交一个jar包使用,就可以这样写:

./bin/spark-submit \
    --deploy-mode cluster \
    --master yarn \
    --class org.apache.spark.examples.SparkPi \
    /spark-home/examples/jars/spark-examples_versionxx.jar 80

 4.驱动程序和执行器资源

在提交应用程序时,还可以指定要为驱动程序和执行程序提供多少内存和内核。

选项说明
--driver-memorySpark驱动程序使用的内存。
--driver-coresSpark驱动程序使用的CPU内核
--num-executors要使用的执行器总数。
--executor-memory用于执行器进程的内存量。
--executor-cores用于执行器进程的CPU内核数。
--total-executor-cores要使用的执行器颜色总数。

使用案例仍旧和上述差不多:

./bin/spark2-submit \
   --master yarn \
   --deploy-mode cluster \
   --driver-memory 8g \
   --executor-memory 16g \
   --executor-cores 2  \
   --class org.apache.spark.examples.SparkPi \
   /spark-home/examples/jars/spark-examples_versionxx.jar 80

 5.--files和--verbose

这两个是经常使用到的选项:

选项说明
--file使用要使用的逗号分隔文件。
通常,这些文件可以是资源文件夹中的文件。
使用此选项,Spark将所有这些文件提交到集群。
--verbose显示详细信息。例如,将spark应用程序使用的所有配置写入日志文件。

 示例:下面的示例使用集群部署模式将应用程序提交给yarn集群管理器,每个执行器具有8g驱动程序内存、16g和2个内核。

./bin/spark2-submit \
   --verbose
   --master yarn \
   --deploy-mode cluster \
   --driver-memory 8g \
   --executor-memory 16g \
   --executor-cores 2  \
   --files /path/log4j.properties,/path/file2.conf,/path/file3.json
   --class org.apache.spark.examples.SparkPi \
   /spark-home/examples/jars/spark-examples_versionxx.jar 80

 6.Spark提交配置

Spark提交支持使用--config的几种配置,这些配置用于指定应用程序配置、洗牌参数和运行时配置。

大多数这些配置对于用Java、Scala和Python(PySpark)编写的Spark应用程序是相同的

配置参数配置说明
spark.sql.shuffle.partitions为更广泛的无序转换(联接和聚合)创建的分区数。
spark.executor.memoryOverhead集群模式下每个执行器进程要分配的额外内存量,通常是JVM开销的内存。(PySpark不支持)
spark.serializer

org.apache.spark.serializer.<br>JavaSerializer(默认)

org.apache.spark.serializer.KryoSerializer

spark.sql.files.maxPartitionBytes读取文件时每个分区使用的最大字节数。默认128MB。
spark.dynamicAllocation.enabled指定是根据工作负载动态增加还是减少执行者的数量。默认为true。
spark.dynamicAllocation
.minExecutors
启用动态分配时要使用的最小执行器数。
spark.dynamicAllocation
.maxExecutors
启用动态分配时要使用的最大执行器数。
spark.executor.extraJavaOptions指定JVM选项(请参见下面的示例)

 


./bin/spark2-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.sql.shuffle.partitions=20000" \
--conf "spark.executor.memoryOverhead=5244" \
--conf "spark.memory.fraction=0.8" \
--conf "spark.memory.storageFraction=0.2" \
--conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
--conf "spark.sql.files.maxPartitionBytes=168435456" \
--conf "spark.dynamicAllocation.minExecutors=1" \
--conf "spark.dynamicAllocation.maxExecutors=200" \
--conf "spark.dynamicAllocation.enabled=true" \
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \ 
--files /path/log4j.properties,/path/file2.conf,/path/file3.json \
--class org.apache.spark.examples.SparkPi \
/spark-home/examples/jars/spark-examples_repace-spark-version.jar 80

 或者,也可以将这些全局@$SPARK_HOME/conf/SPARK-defaults.conf设置为适用于每个SPARK应用程序。还可以通过编程方式使用SparkConf进行设置。Pyspark的配置我已经在另一篇文章有写:

PySpark数据分析基础:pyspark.sql.SparkSession类方法详解及操作+代码展示

三.PySpark程序提交配置选项

一般跑这种带有pyspark的python程序会有两种情况:

1.集群中没有安装python环境。

2.集群中没有程序依赖的第三方库。

下面将对于上面这两种情况提供解决方案:

对于已经安装了python环境的话,只要加入--py-file .py文件就好。当想要提交PySpark应用程序时,需要指定要运行的.py文件,并为依赖库指定.egg文件或.zip文件。这里有一下四个参数需要编辑:

PYSPARK特定配置说明
--py-files使用--py文件添加.py、.zip或.egg文件。
--config spark.executor.pyspark.memoryPySpark为每个执行器使用的内存量。
--config spark.pyspark.driver.pythonPython二进制可执行文件,用于驱动程序中的PySpark。
--config spark.pyspark.pythonPython二进制可执行文件,用于驱动程序和执行器中的PySpark。

对于没有加入第三方库采取上述参数直接配置就好了,若是需要加入简单的第三方库(例如jieba库)时,也只需要打包成zip,然后spark-submit命令中动态加载该模块即可。但是如果要使用复杂的第三方库(含.dll,.so文件,即动态加载库,如numpy、pandas),则处理起来就比较特殊,需要将整个python环境都打包,这有点像Pyinstaller。

解决方法如下:

1.构建一套虚拟环境

我们可以通过anaconda生成虚拟环境也可以通过pipenv来打包,总之我们需要包含提交的任务所包含所以依赖的环境,关于pipenv打包我认为是最简单的,大家可以参考这篇文章:

Pipenv使用指南:轻量级虚拟环境管理工具详解

anaconda的打包可以使用可视化UI这样比较便捷,我们可以创建一个新的虚拟环境,只打上我们需要的依赖包,再将整个虚拟Python环境打包为zip,或tar.gz包
进入到虚拟环境下,如/home/hadoop/anaconda3/envs,使用以下命令将虚拟环境进行打包:

zip -r conda_env.zip conda_env	  # 虚拟环境为conda_env, 打包为conda_env.zip 文件

 提交Pyspark Application,通过 --archives 选项指定 zip 包路径(可以将虚拟环境zip上传到HDFS或某个节点下 ),然后是在cluster、client模式下提交application,示例如下

HADOOP_CONF_DIR=/etc/hadoop/conf  /data/anaconda3/envs/py3.6.13/bin/spark-submit 
--master yarn \
--queue default \
--deploy-mode client \
--conf spark.yarn.dist.archives=hdfs:/py3-6-13.zip#python \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=python/py3.6.13/bin/python3.6\
--conf spark.pyspark.python=python/py3.6.13/bin/python3.6\
--conf spark.pyspark.driver.python=/data/anaconda3/envs/py3.6.13/bin/python3.6\
--conf spark.sql.catalogImplementation=hive\  
--py-files hdfs:/.py.zip ./.py 

2. 模块依赖问题原因

1.Driver 负责把本地的资源分发给 Container。

2.在 client 模式下,Driver 就找在 Client 端,可以把 client 端的资源分发,而 cluster 模式下,Driver 可在集群任一节点,该节点是没有资源的。

普通依赖:

在 client 模式下,Driver 可以自动收集资源,分发,无需上传依赖;

在 cluster 模式下,Driver 无法收集资源,必须上传依赖;

复杂依赖:

在工业环境中,使用的多是 cluster 模式,cluster 模式必须上传依赖。

在调试环节,多使用 client 模式,client 只需上传复杂依赖即可。


参阅

Spark Submit Command Explained with Examples

pyspark 中使用集群未安装的python三方库:加载虚拟python环境

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 笔记

文章目录安装MySQL 语法格式MySQL数据类型命令操作数据库CRUD查询创建表删除表修改表操作数据增改删查基础查询条件查询模糊查询排序查询分组查询分页查询聚合函数约束约束分类安装 软件安装&#xff5c;macOS下超详细的MySQL安装 MySQL 语法格式 每条语句以分号;结尾&#…

LeetCode150.逆波兰表达式

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意 有效的算符为 、-、* 和/。…

如何mock当前类的私有方法

背景 基础知识 mockito单元测试&#xff1a;它的做法是mock掉当前类的所有外部依赖&#xff0c;保障自己的代码没有问题。举个例子&#xff0c;如果数据库查询的语句出了问题&#xff0c;单元测试不会测试出来。因为它直接mock掉了&#xff0c;不会去真的去查数据库。从这点来…

电压放大器在大功率脉冲电能源研究中的应用

实验名称&#xff1a;大功率脉冲电能源高精度测试技术研究 研究方向&#xff1a;仪器仪表测试 测试目的&#xff1a; 传统的测量精度校准的方法是对传感器单一频率下的刻度因子进行校准&#xff0c;校准方法通常选用同轴分流器串联于放电回路中&#xff0c;通过测量同轴分流器两…

Ubuntu18.04下安装mysql并使用QT成功编译驱动方法

开发环境&#xff1a;Ubuntu18.04QT5.14.2MySQL5.7.240 编译步骤&#xff1a; 1、安装mysql软件和驱动&#xff1a; 打开终端命令&#xff0c;执行安装语句如下&#xff1a; sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib…

MyBatisPlus(MP)学习记录(分页查询的开启+日志打印配置)

MP介绍&#xff08;官网链接&#xff09; MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 前言 本篇文章展示的MP教学中涉及到的版本如下&#xff1a; IDE…

使用Xshell 将Linux文件下载到本地或者将本地的文件上传到Linux

第一步&#xff1a;在Linux中安装上传下载功能的软件 sudo apt install lrzsz第二步&#xff1a;将Linux文件下载到本地&#xff1a;此时我的Linux桌面上有一个叫test.c的文件&#xff0c;我要将它下载到windows桌面上。 在Linux终端输入&#xff1a; sz test.c这里使用的是…

座舱显示的未来到底是什么?宝马供应商给出了答案

“显示器是汽车的核心人机界面&#xff0c;”业内人士表示&#xff0c;与此同时更智能化、体验更好的显示解决方案在驾驶舱的设计中起着核心作用。 屏幕及其增强驾驶体验的巨大潜力正迅速成为未来智能网联汽车DNA的一部分。高分辨率、大尺寸以及曲面屏、OLED屏等等新元素&…

【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

一&#xff0c;前言 上篇&#xff0c;根据 render 函数&#xff0c;生成 vnode&#xff0c;主要涉及以下几点&#xff1a; 封装 vm._render 返回虚拟节点_s&#xff0c;_v&#xff0c;_c的实现 本篇&#xff0c;根据 vnode 虚拟节点渲染真实节点 二&#xff0c;根据 vnode 创…

SpringCloud项目实例3--Nacos整合

然后新建一个Module&#xff0c;命名为nacos-provider-demo&#xff0c;Java代码的包名为ltd.newbee.cloud。在该Module的pom.xml配置文件中增加parent标签&#xff0c;与上层Maven建立好关系。之后&#xff0c;在这个子模块的 pom.xml 文件中加入Nacos的依赖项 spring-cloud-s…

谈一谈暴露偏差

文章由参考文章重新组合而来。 暴露偏差又叫Exposure Bias&#xff0c;是由Teacher Forcing 导致的。 Teacher Forcing Teacher Forcing 是一种用于序列生成任务的训练技巧&#xff0c;与Autoregressive模式相对应&#xff0c;这里阐述下两者的区别&#xff1a; Autoregres…

【Flink系列】部署篇(一):Flink集群部署

主要回答以下问题&#xff1a; Flink集群是由哪些组件组成的&#xff1f;它们彼此之间如何协调工作的&#xff1f;在Flink中job, task, slots,parallelism是什么意思&#xff1f;集群中的资源是如何调度和分配的&#xff1f;如何搭建一个Flink集群&#xff1f;如何配置高可用服…

目标检测再升级!YOLOv8模型训练和部署

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.12 Last edited: 2023.1.12 目录 目标检测再升级&#xff01;YOLOv8模型训练和部署 简介 YOLOv8创新改进点 区别 1、C2f模块是什么&…

探索与创新:低代码助力金融数字化转型发展

“十四五”规划和 2035 年远景目标纲要提出“加快数字化发展&#xff0c;建设数字中国”&#xff0c;并就打造数字经济新优势、加快数字社会建设步伐、提高数字政府建设水平、营造良好数字生态作出战略部署。这为数字中国的下一步发展指明了方向&#xff0c;提供了指引。可以说…

CentOS环境下Rabbit集群部署

前言本次Rabbit集群部署所使用的的软件版本erlang&#xff1a;erlang-23.3.3-1.el7.x86_64.rpm &#xff0c;rabbitmq&#xff1a;rabbitmq-server-3.8.23-1.el7.noarch.rpm本次Rabbit集群部署需要安装在两台CentOS服务器分别为svr-app-rabbitmq01、svr-app-rabbitmq02&#xf…

Trime同文输入法JNI加载过程

Trime同文输入法JNI加载过程JNI初始化顺序第一步、加载librime_jni.so库第二步、自动注册机制第三步、正式加载librime_jni.so库插入一个话题、简化打印记录第四步、执行Rime.java中的init()方法LoadModules()LoadModule()rime_core_initialize()调用顺序Class不是class关键字&…

3D应用无需下载即点即用,云应用带来更轻量的元宇宙

最近一个程序员朋友告诉我&#xff0c;公司市场部想做一个元宇宙相关的互动游戏&#xff0c;于是给技术团队提了一个带用户线上沉浸式环游园区的H5开发需求。他摸着所剩无几的头发据理力争&#xff1a;这个需求真的做不了&#xff01;我听了很疑惑&#xff0c;现在许多品牌都在…

工作流引擎架构设计

原文链接&#xff1a; 工作流引擎架构设计 最近开发的安全管理平台新增了很多工单申请流程需求&#xff0c;比如加白申请&#xff0c;开通申请等等。最开始的两个需求&#xff0c;为了方便&#xff0c;也没多想&#xff0c;就直接开发了对应的业务代码。 但随着同类需求不断增…

深度学习PyTorch 之 网络结构可视化

深度学习&PyTorch 之 DNN-回归 深度学习&PyTorch 之 DNN-回归&#xff08;多变量&#xff09; 分别介绍了DNN回归的方法和代码&#xff0c;但是模型建立好了&#xff0c;他到底是个什么样子呢&#xff1f; 我们这节给大家介绍一个查看模型结构的方法 可视化介绍 我们…

【信管8.1】项目人力资源管理概念及过程

项目人力资源管理概念及过程不管你做什么事&#xff0c;要成就什么事业&#xff0c;要做什么项目&#xff0c;这一切&#xff0c;都是由人来完成的。因此&#xff0c;人力资源对于项目管理来说&#xff0c;是非常重要的一个管理过程。同时&#xff0c;人力资源管理也是整个管理…