基于YARN集群构建运行PySpark Application

使用Python开发spark spark 阅读详情

文章转载:https://www.tuicool.com/articles/eaYVN3v

Spark Application可以直接运行在YARN集群上,这种运行模式,会将资源的管理与协调统一交给YARN集群去处理,这样能够实现构建于YARN集群之上Application的多样性,比如可以运行MapReduc程序,可以运行HBase集群,也可以运行Storm集群,还可以运行使用Python开发机器学习应用程序,等等。

我们知道,Spark on YARN又分为client模式和cluster模式:在client模式下,Spark Application运行的Driver会在提交程序的节点上,而该节点可能是YARN集群内部节点,也可能不是,一般来说提交Spark Application的客户端节点不是YARN集群内部的节点,那么在客户端节点上可以根据自己的需要安装各种需要的软件和环境,以支撑Spark Application正常运行。在cluster模式下,Spark Application运行时的所有进程都在YARN集群的NodeManager节点上,而且具体在哪些NodeManager上运行是由YARN的调度策略所决定的。

对比这两种模式,最关键的是Spark Application运行时Driver所在的节点不同,而且,如果想要对Driver所在节点的运行环境进行配置,区别很大,但这对于PySpark Application运行来说是非常关键的。

PySpark是Spark为使用Python程序编写Spark Application而实现的客户端库,通过PySpark也可以编写Spark Application并在Spark集群上运行。Python具有非常丰富的科学计算、机器学习处理库,如numpy、pandas、scipy等等。为了能够充分利用这些高效的Python模块,很多机器学习程序都会使用Python实现,同时也希望能够在Spark集群上运行。

PySpark Application运行原理

理解PySpark Application的运行原理,有助于我们使用Python编写Spark Application,并能够对PySpark Application进行各种调优。PySpark构建于Spark的Java API之上,数据在Python脚本里面进行处理,而在JVM中缓存和Shuffle数据,数据处理流程如下图所示(来自Apache Spark Wiki):
这里写图片描述

Spark Application会在Driver中创建pyspark.SparkContext对象,后续通过pyspark.SparkContext对象来构建Job DAG并提交DAG运行。使用Python编写PySpark Application,在Python编写的Driver中也有一个pyspark.SparkContext对象,该pyspark.SparkContext对象会通过Py4J模块启动一个JVM实例,创建一个JavaSparkContext对象。PY4J只用在Driver上,后续在Python程序与JavaSparkContext对象之间的通信,都会通过PY4J模块来实现,而且都是本地通信。

PySpark Application中也有RDD,对Python RDD的Transformation操作,都会被映射到Java中的PythonRDD对象上。对于远程节点上的Python RDD操作,Java PythonRDD对象会创建一个Python子进程,并基于Pipe的方式与该Python子进程通信,将用户编写Python处理代码和数据发送到Python子进程中进行处理。

下面,我们基于Spark on YARN模式,并根据当前企业所具有的实际集群运行环境情况,来说明如何在Spark集群上运行PySpark Application,大致分为如下3种情况:

YARN集群配置Python环境
这种情况,如果是初始安装YARN、Spark集群,并考虑到了当前应用场景需要支持Python程序运行在Spark集群之上,这时可以准备好对应Python软件包、依赖模块,在YARN集群中的每个节点上进行安装。这样,YARN集群的每个NodeManager上都具有Python环境,可以编写PySpark Application并在集群上运行。目前比较流行的是直接安装Python虚拟环境,使用Anaconda等软件,可以极大地简化Python环境的管理工作。

这种方式的缺点是,如果后续使用Python编写Spark Application,需要增加新的依赖模块,那么就需要在YARN集群的每个节点上都进行该新增模块的安装。而且,如果依赖Python的版本,可能还需要管理不同版本Python环境。因为提交PySpark Application运行,具体在哪些NodeManager上运行该Application,是由YARN的调度器决定的,必须保证每个NodeManager上都具有Python环境(基础环境+依赖模块)。

YARN集群不配置Python环境
这种情况,更适合企业已经安装了规模较大的YARN集群,并在开始使用时并未考虑到后续会使用基于Python来编写Spark Application,并且不想在YARN集群的NodeManager上安装Python环境依赖依赖模块。我们参考了Benjamin Zaitlen的博文(详见后面参考链接),并基于Anaconda软件环境进行了实践和验证,具体实现思路如下所示:

在任意一个LInux OS的节点上,安装Anaconda软件
通过Anaconda创建虚拟Python环境
在创建好的Python环境中下载安装依赖的Python模块
将整个Python环境打成zip包
提交PySpark Application时,并通过–archives选项指定zip包路径
下面进行详细说明:

首先,我们在CentOS 7.2上,基于Python 2.7,下载了Anaconda2-5.0.0.1-Linux-x86_64.sh安装软件,并进行了安装。Anaconda的安装路径为/root/anaconda2。

然后,创建一个Python虚拟环境,执行如下命令:

conda create -n mlpy_env –copy -y -q python=2 numpy pandas scipy
上述命令创建了一个名称为mlpy_env的Python环境,–copy选项将对应的软件包都安装到该环境中,包括一些C的动态链接库文件。同时,下载numpy、pandas、scipy这三个依赖模块到该环境中。

接着,将该Python环境打包,执行如下命令:

cd /root/anaconda2/envs
zip -r mlpy_env.zip mlpy_env
该zip文件大概有400MB左右,将该zip压缩包拷贝到指定目录中,方便后续提交PySpark Application:

cp mlpy_env.zip /tmp/
最后,我们可以提交我们的PySpark Application,执行如下命令:

PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python spark-submit \
–conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./ANACONDA/mlpy_env/bin/python \
–master yarn-cluster \
–archives /tmp/mlpy_env.zip#ANACONDA \
/var/lib/hadoop-hdfs/pyspark/test_pyspark_dependencies.py
上面的test_pyspark_dependencies.py文件中,使用了numpy、pandas、scipy这三个依赖包的函数,通过上面提到的YARN集群的cluster模式可以运行在Spark集群上。

可以看到,上面的依赖zip压缩包将整个Python的运行环境都包含在里面,在提交PySpark Application时会将该环境zip包上传到运行Application的所在的每个节点上,并解压缩后为Python代码提供运行时环境。如果不想每次都从客户端将该环境文件上传到集群中运行PySpark Application的节点上,也可以将zip包上传到HDFS上,并修改–archives参数的值为hdfs:///tmp/mlpy_env.zip#ANACONDA,也是可以的。

另外,需要说明的是,如果我们开发的/var/lib/hadoop-hdfs/pyspark/test_pyspark_dependencies.py文件中,也依赖的一些我们自己实现的处理函数,具有多个Python依赖的文件,想要通过上面的方式运行,必须将这些依赖的Python文件拷贝到我们创建的环境中,对应的目录为mlpy_env/lib/python2.7/site-packages/下面。

基于混合编程语言环境
假如我们还是希望使用Spark on YARN模式来运行PySpark Application,但并不将Python程序提交到YARN集群上运行。这时,我们可以考虑使用混合编程语言的方式,来处理数据任务。比如,机器学习Application具有迭代计算的特性,更适合在一个高配的节点上运行;而普通的ETL数据处理具有多机并行处理的特点,适合放到集群上进行分布式处理。

一个完整的机器学习Application的设计与构建,可以将算法部分和数据准备部分分离出来,使用Scala/Java进行数据预处理,输出一个机器学习算法所需要(更便于迭代、寻优计算)的输入数据格式,这会极大地压缩算法输入数据的规模,从而使算法迭代计算充分利用单机本地的资源(内存、CPU、网络),这可能会比直接放到集群中计算要快得多。

因此,我们在对机器学习Application准备数据时,使用原生的Scala编程语言实现Spark Application来处理数据,包括转换、统计、压缩等等,将满足算法输入格式的数据输出到HDFS指定目录中。在性能方面,对数据规模较大的情况下,在Spark集群上处理数据,Scala/Java实现的Spark Application运行性能要好一些。然后,算法迭代部分,基于丰富、高性能的Python科学计算模块,使用Python语言实现,其实直接使用PySpark API实现一个机器学习PySpark Application,运行模式为YARN client模式。这时,就需要在算法运行的节点上安装好Python环境及其依赖模块(而不需要在YARN集群的节点上安装),Driver程序从HDFS中读取输入数据(缓存到本地),然后在本地进行算法的迭代计算,最后输出模型。

总结

对于重度使用PySpark的情况,比如偏向机器学习,可以考虑在整个集群中都安装好Python环境,并根据不同的需要进行依赖模块的统一管理,能够=极大地方便PySpark Application的运行。

不在YARN集群上安装Python环境的方案,会使提交的Python环境zip包在YARN集群中传输带来一定开销,而且每次提交一个PySpark Application都需要打包一个环境zip文件,如果有大量的Python实现的PySpark Application需要在Spark集群上运行,开销会越来越大。另外,如果PySpark应用程序修改,可能需要重新打包环境。但是这样做确实不在需要考虑YARN集群集群节点上的Python环境了,任何版本Python编写的PySpark Application都可以使用集群资源运行。

关于该问题,SPARK-13587(详见下面参考链接)也在讨论如果优化该问题,后续应该会有一个比较合适的解决方案。

参考链接

https://cwiki.apache.org/confluence/display/SPARK/PySpark+Internals
https://issues.apache.org/jira/browse/SPARK-13587
http://quasiben.github.io/blog/2016/4/15/conda-spark/
https://blog.cloudera.com/blog/2017/04/use-your-favorite-python-library-on-pyspark-cluster-with-cloudera-data-science-workbench/
https://repo.continuum.io/pkgs/misc/parcels/archive/
https://repo.continuum.io/pkgs/misc/parcels/
https://www.cloudera.com/documentation/enterprise/5-5-x/topics/spark_python.html
https://docs.anaconda.com/anaconda/user-guide/tasks/integration/cloudera

本文基于 署名-非商业性使用-相同方式共享 4.0 许可协议发布,欢迎转载、使用、重新发布,但务必保留文章署名时延军(包含链接:http://shiyanjun.cn),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

十亿行数据Pyspark实战:从DataFrame优化到毫秒级响应 在大数据处理中,当数据规模突破亿级,传统单机计算框架如Pandas面临性能瓶颈,而分布式计算引擎Spark成为必然选择。PySpark作为Python与Spark的桥梁,其核心优势在于DataFrame API背后的Catalyst优化器与Tungsten执行引擎,能自动完成谓词下推、列裁剪、广播连接等关键优化。理解执行计划(explain)、规避隐式shuffle、合理使用Parquet列式存储与YARN集群模式,是实现‘十亿行数据秒级响应’的技术基础。本文聚焦真实生产场景下的最小可行路径,覆盖数据源选型 阅读详情

相关推荐

PySpark十亿行数据实战:毫秒级稳定处理指南

PySpark作为基于Scala引擎的Python大数据框架,凭借其批流一体能力、Delta Lake原生支持及丰富UDF生态,在超大规模结构化数据处理中占据关键地位。其核心原理在于将Python开发效率与JVM执行性能结合,通过自适应查询执行(AQE)、智能Shuffle优化和内存分级管理,实现高吞吐与低延迟的平衡。技术价值体现在可复现的强一致性计算、复杂机器学习Pipeline嵌入能力,以及面向PB级数据的工程可控性。典型应用场景包括电商用户行为宽表构建、实时特征工程、LTV模型输入生成等需要兼顾规模、

388

PySpark yarn优化以及使用(依赖解决、python虚拟环境使用)————附带解释和代码

文章目录1 spark yarn的常见模式以及区分1.1 模式1.2 使用2 yarn模式下的自编写包依赖解决2.1 准备知识2.2 使用3 yarn模式下的jar包依赖解决3.1 spark运行时需要的包3.2 非spark运行时必要的包附录 1 spark yarn的常见模式以及区分 1.1 模式 1,client 提交方式: –master yarn –deploy-mode client 特点: 1,driver运行在提交作业的机器上(可以看到程序打印日志); 2,cluster

韩江雪de 小屋 3983

PySpark机器学习实战:构建可部署的分布式训练Pipeline

分布式机器学习是处理海量数据的核心能力,其本质是将单机算法扩展至集群环境,通过数据并行与计算调度实现性能线性提升。技术价值在于保障模型训练的稳定性、可复现性与工程可控性,支撑实时风控、用户流失预测、推荐系统等高要求场景。关键挑战包括特征工程一致性、跨环境模型部署、资源瓶颈定位及生产级监控。本文聚焦PySpark ML(pyspark.ml)这一主流接口,深入解析Pipeline设计范式与DataFrame原生API协同机制,结合Parquet优化、CrossValidator调参、MLeap模型导出等实操要

cumian9828的博客 643

PySpark实战(五)——PySpark ETL实战(包括数据的抽取、转换、加载及numpy、matplotlib、pandas的综合使用)

ETL是指 Extract、Transfrom 和 Load 的简称。用来描述将数据从数据源经过抽取、转换、加载至终端的一系列处理过程。

Stack It Up 2564

Spark环境搭建深度指南:从JVM依赖到PySpark配置

Apache Spark并非即装即用的单机库,而是一个强依赖JVM版本、Scala二进制兼容性、SLF4J日志绑定机制及多层环境变量语义的分布式计算引擎。其运行原理根植于Java类加载顺序、进程模型差异(如pyspark与spark-submit的JVM隔离机制)和Hadoop生态契约。技术价值在于规避因Java小版本Bug、GC参数失配或PYTHONPATH污染导致的隐性故障;典型应用场景涵盖本地伪分布式开发、Docker容器化交付及YARN/K8s生产预检。本文聚焦Spark 3.5环境构建中Java

weixin_30642869的博客 373

Spark:Yarn-cluster和Yarn-client区别与联系

我们都知道Spark支持在yarn上运行,但是Spark on yarn有分为两种模式yarn-cluster和yarn-client,它们究竟有什么区别与联系?阅读完本文,你将了解。   Spark支持可插拔的集群管理模式(Standalone、Mesos以及YARN ),集群管理负责启动executor进程,编写Spark application 的人根本不需要知道Spark用的是什么集群管

光于前裕于后的博客 2717

1. 运行pyspark

spark有三种运行方式: 1. 本地运行spark (单机,学习、测试用) 2. yarn运行spark (集群,主要使用) 3. spark standalone运行spark (集群不常用) 在没有hadoop的情况下实现多台计算机并行计算,需要配置,不介绍   安装好spark后 在终端输入pyspark可以进入shell命令行,(此时就是本地模式) 就可以输入python...

ant的博客 8076

硬件之光实战篇--Boost

当开关管处于关闭状态时,由于电感中的电流在短时间内不能瞬间消失,因此它会产生一个电感电动势,在电容器上加上一个高电压,从而使输出电压变高。--------------------------------------------------------分割线----------------------------------------------------------------在应用中,升压芯片需要根据负载电路的需求,选择合适的电感和电容等元器件,以达到所需要的升压倍数和输出电压。

m0_58664890的博客 2105

提交PySpark应用程序以集群模式在YARN上触发

我正在尝试测试为我工作的团队构建的大数据平台。它在YARN上运行时具有火花。 是否可以创建PySpark应用并将其提交到YARN集群上? 我能够成功提交示例SparkPi jar文件,它在YARN stdout日志中返回输出。 这是我要测试的PySpark代码; <span style="color:#333333"><code>from pyspark import SparkConf from pyspark import SparkContext HDFS_MAST

u011250186的博客 2855

【matlab】MATLAB 变量详解与应用

在 MATLAB 中,变量可以通过赋值操作进行定义。例如,要定义一个名为xx = 10;在这个例子中,我们创建了一个名为x的变量,并将其赋值为 10。需要注意的是,MATLAB 是一种动态类型语言,因此不需要显式地声明变量的类型。变量名必须以字母开头。变量名可以包含字母、数字和下划线。变量名区分大小写。不要使用 MATLAB 中的关键字(如forif等)作为变量名。

小吴同学的博客 2214

深度学习暑期科研项目(两个月发EI论文)

对本科生而言,越早接触系统的科研训练开始上手科研项目,就越能在未来的升学求职中占据很大的优势。暑假是提升个人简历、丰富科研经历的最佳时期!哈尔滨工业大学博士师兄也会在8月1日开始带大家上手科研项目,并撰写发表EI会议论文。

Magnolia_He的博客 1444

PySpark!!!

Start from wordcount 首先确保hadoop启动,hdfs可以使用 /etc/profile中设置pyspark使用miniconda中虚拟环境thjj的python export PYSPARK_PYTHON=/home/jj/miniconda3/envs/thjj/bin/python # 打印 hdfs 根目录下的所有文件 jj@JJ:~/Desktop$ hadoop dfs -l jj@JJ:~/Desktop$ pyspark Python 3.6.13 |Anac

纪大福 200

YOLOv8+BiFPN双向特征金字塔:多尺度目标检测精度提升28%的实战教程

双向特征金字塔网络(BiFPN)是一种强化多尺度特征融合支持“自顶向下+自底向上”的双向特征流动,同时保留不同尺度的细节信息;引入加权融合机制,自动学习不同特征的重要性权重;裁剪冗余节点,在轻量化的同时提升融合效率。

m0_64661770的博客 493

Spark on YARN

将Spark任务的pyspark文件,经过Py4J转换,提交到Yarn的JVM中去运行

u013076651的博客 373

【25届数字IC秋招总结】面试经验15——比特大陆-算能

25届数字ic面试记录——比特大陆-算能

lalala0635的博客 557

linux系统中实现智能家居的基本方法

使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。

嵌入式技术开发 2608

如何在yarn上运行Hello World(二)

在之前的一篇文章我们介绍了如何编写在yarn集群提交运行应用的AM的yarnClient端,现在我们来继续介绍如何编写在yarn集群控制应用app运行的核心模块 ApplicationMaster. 首先,介绍下我们要在yarn集群上运行的应用程序 HelloWorld. 这个应用很简单,就是一个主函数,启动的时候打印一句话表明应用已经启动,结束的时候打...

aikyyu26486的博客 894

CGAL 网格等高线计算

CGAL 网格等高线计算

dayuhaitang1的博客 452

在Hadoop Yarn 运行 pyspark 的一些问题

hduser@master:~$ pyspark --master local[4] Python 2.7.12 (default, Dec 4 2017, 14:50:18) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. 1...

weixin_33941350的博客 776

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3814

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

pyspark系列4-spark内核概述

文章目录一.Spark核心组件1.1 Cluster Manager(Master,ResourceManager)1.2 Worker(worker,NodeManager)1.3 Driver1.4 Executor1.5 Application二.Spark on Yarn3.1 Yarn的基本架构3.2 Spark on Yarn3.2.1 YARN-Cluster模式3.2.2 YARN-Client模式3.3 Spark Job参考: 一.Spark核心组件 SparkContext将资

只是甲的博客 4635

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Yarn application has already ended! It might have been killed or unable to launch application master

环境:ambari+hdp 2.7.3 出现背景:nodename服务器出现异常,发生重启。 出现问题:以前能跑的pyspark脚本,运行的时候Yarn application has already ended! It might have been killed or unable to launch application master的错误。 解决方法: 1.在ambari中重启y...

大数据学习笔记 2932

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

pySpark kill掉集群的任务

连接上集群,执行 yarn application -kill application_1511930647873_6100 参考: Stack Overflow

rosefun96的博客 1164

linux安装pyspark_pyspark学习笔记——安装篇

家里用的单机hadoop,公式用的集群hadoop,此安装基于家里的笔记本。所以java,hadoop都已经是可以用的。1。scala语言spark是以scala语言开发的,所以必须安装scala。去官网下载tgz包。我这里选择的是2.11.6版本。(windows可以复制下载链接到迅雷,这样会比较快)然后把tgz包放到你的linux用户目录下。然后解压,生成不带tgz后缀的文件tar xvf s...

weixin_39945915的博客 931

Spark基础入门-第七章:本机开发环境搭建

Spark是大数据体系的明星产品,是一款高性能的分布式内存迭代计算框架,可以处理海量规模的数据。下面就带大家来学习今天的内容!

黑马程序员官方博客 626
上一篇: Spark性能调优
下一篇: Apache nifi 集群安装
Ronney-Hua
博客等级 码龄10年 48粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值