美文网首页
Pyspark架构原理

Pyspark架构原理

作者: fat32jin | 来源:发表于2020-10-23 12:58 被阅读0次

原文地址 :
https://mp.weixin.qq.com/s/qgfcqKMyTOC-AlQYGmk6VQ

Spark运行时架构

首先我们先回顾下Spark的基本运行时架构,如下图所示,其中橙色部分表示为JVM,Spark应用程序运行时主要分为Driver和Executor,Driver负载总体调度及UI展示,Executor负责Task运行,Spark可以部署在多种资源管理系统中,例如Yarn、Mesos等,同时Spark自身也实现了一种简单的Standalone(独立部署)资源管理系统,可以不用借助其他资源管理系统即可运行。

image

用户的Spark应用程序运行在Driver上(某种程度上说,用户的程序就是Spark Driver程序),经过Spark调度封装成一个个Task,再将这些Task信息发给Executor执行,Task信息包括代码逻辑以及数据信息,Executor不直接运行用户的代码。

PySpark运行时架构

为了不破坏Spark已有的运行时架构,Spark在外围包装一层Python API,借助Py4j实现Python和Java的交互,进而实现通过Python编写Spark应用程序,其运行时架构如下图所示。

image.png

其中白色部分是新增的Python进程,在Driver端,通过Py4j实现在Python中调用Java的方法,即将用户写的PySpark程序”映射”到JVM中,例如,用户在PySpark中实例化一个Python的SparkContext对象,最终会在JVM中实例化Scala的SparkContext对象;在Executor端,则不需要借助Py4j,因为Executor端运行的Task逻辑是由Driver发过来的,那是序列化后的字节码,虽然里面可能包含有用户定义的Python函数或Lambda表达式,Py4j并不能实现在Java里调用Python的方法,为了能在Executor端运行用户定义的Python函数或Lambda表达式,则需要为每个Task单独启一个Python进程,通过socket通信方式将Python函数或Lambda表达式发给Python进程执行。语言层面的交互总体流程如下图所示,实线表示方法调用,虚线表示结果返回。

image

下面分别详细剖析PySpark的Driver是如何运行起来的以及Executor是如何运行Task的。

image.png

Executor端运行原理

为了方便阐述,以Spark On Yarn为例,当Driver申请到Executor资源时,会通过CoarseGrainedExecutorBackend(其中有main方法)拉起JVM,启动一些必要的服务后等待Driver的Task下发,在还没有Task下发过来时,Executor端是没有Python进程的。当收到Driver下发过来的Task后,Executor的内部运行过程如下图所示。

image.png

Executor端收到Task后,会通过launchTask运行Task,最后会调用到PythonRDD的compute方法,来处理一个分区的数据,PythonRDD的compute方法的计算流程大致分三步走:

如果不存在pyspark.deamon后台Python进程,那么通过Java Process的方式启动pyspark.deamon后台进程,注意每个Executor上只会有一个pyspark.deamon后台进程,否则,直接通过Socket连接pyspark.deamon,请求开启一个pyspark.worker进程运行用户定义的Python函数或Lambda表达式。pyspark.deamon是一个典型的多进程服务器,来一个Socket请求,fork一个pyspark.worker进程处理,一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。
紧接着会单独开一个线程,给pyspark.worker进程喂数据,pyspark.worker则会调用用户定义的Python函数或Lambda表达式处理计算。在一边喂数据的过程中,另一边则通过Socket去拉取pyspark.worker的计算结果。把前面运行时架构图中Executor部分单独拉出来,如下图所示,橙色部分为JVM进程,白色部分为Python进程,每个Executor上有一个公共的pyspark.deamon进程,负责接收Task请求,并fork pyspark.worker进程单独处理每个Task,实际数据处理过程中,pyspark.worker进程和JVM Task会较频繁地进行本地Socket数据通信。

image.png

总结

总体上来说,PySpark是借助Py4j实现Python调用Java,来驱动Spark应用程序,本质上主要还是JVM runtime,Java到Python的结果返回是通过本地Socket完成。虽然这种架构保证了Spark核心代码的独立性,但是在大数据场景下,JVM和Python进程间频繁的数据通信导致其性能损耗较多,恶劣时还可能会直接卡死,所以建议对于大规模机器学习或者Streaming应用场景还是慎用PySpark,尽量使用原生的Scala/Java编写应用程序,对于中小规模数据量下的简单离线任务,可以使用PySpark快速部署提交。

相关文章

  • Pyspark架构原理

    原文地址 :https://mp.weixin.qq.com/s/qgfcqKMyTOC-AlQYGmk6VQ[h...

  • PySpark运行原理

    背景:spark的代码很多是由Java写成的,自从spark为Python开放了借口之后,Python使用者也可以...

  • Spark Python API Docs(part one)

    pyspark package subpackages pyspark.sql module pyspark.st...

  • 系统架构基本概要

    架构原理图 应用架构 业务架构 系统架构 数据架构 技术架构

  • pyspark整理

    pyspark入门资料 公众号回复:pyspark (会有pyspark资料大礼包:Learning PySpar...

  • Flink On Yarn 集群原理

    Yarn 架构原理 - 总览 Yarn 架构原理- 组件Yarn 集群中的组件包括:● ResourceManag...

  • PySpark初见

    PySpark PySpark 是 Spark 为 Python 开发者提供的 API。 子模块pyspark.s...

  • Jupyter配置教程

    将jupyter notebook作为pyspark的默认编辑器 安装pyspark通过拷贝pyspark包安装源...

  • 框架学习:Volley

    Volley 原理 架构

  • SVD 代码实践

    本文主要介绍tensorflow和pyspark对svd的实现,具体原理可见上篇-SVD在协同过滤推荐系统中的应用...

网友评论

      本文标题:Pyspark架构原理

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