pyspark原理简介

简介:

概述

这是前段时间在看spark的python支持的时候,简单过了一下pyspark里的python代码,整理了一个大致流程。虽然几乎不会python,但基本上能看懂pyspark是怎么让不同虚拟机之间传输数据的、如何在python环境调用java类的、pyspark SDK的丰富程度取决于什么、需要做些什么流程和封装等。

我看了下,应该只有Pyspark Internals这篇wiki里介绍了pyspark的实现机制,大体是下面这张图就可以表示:


在python driver端,SparkContext利用Py4J启动一个JVM并产生一个JavaSparkContext。Py4J只使用在driver端,用于本地python与java SparkContext objects的通信。大量数据的传输使用的是另一个机制。

RDD在python下的转换会被映射成java环境下PythonRDD。在远端worker机器上,PythonRDD对象启动一些子进程并通过pipes与这些子进程通信,以此send用户代码和数据。


大致流程

java_gateway.py里启动了py4j.JavaGateWay,并从java里导入了所需要的主要类,


python能通过py4j访问jvm的前提是,jvm开启了GatewayServer,而在core工程的deploy工程下,PythonRunner单例里启动了GatewayServer。可能可以理解为py4j是基于socket的一套简单封装了调用java类和方法的协议吧,而且走的本地不同端口。

py4j的包为$SPARK_HOME/python/lib/py4j-0.8.1-src.zip,里面是py4j源码的几个类。


上述java_gateway的launch_gateway()方法是在context.py初始化的时候调用。

context.py初始化的时候,把SparkContext和其部分主要方法加入到了python环境中,所以大多数的调用都是通过py4j直接调用java的类。java的类主要是指core项目里的java api里的内容。序列化采用了cPickle库的PickleSerializer。

 

像python下使用spark sql的话,在sql.py里,从jvm里获取了SQLContext/HiveContext类,从而得到spark sql里的关键方法。

 

另一方面,worker.py里,worker启动的时候会起一个socket,从socket里,可以获取工作目录名字;可以获取PYTHONPATH下的其他要引入的.zip或.egg文件,将其加到file_dir里,这里的反序列化使用的是UTF8Deserializer;可以获取广播的变量,这里的反序列化使用的是PickleSerializer。

在daemon.py里,通过分配socket端口,启动POOLSIZE个worker,(里面还有很多其他细节),使用os.fork的方式创建子进程来启动。

 

在rdd.py里,声明了rdd的很多action和transformations,有些操作会触发数据在python worker上的传输。

传输大量数据的时候,Py4J很慢,因为socket.readline()很低效。传输的时候,把数据(序列化后)dump成一个文件。后续把这个文件反序列化回来后,可以转成python的类型和结构进行查看和输出(如collect),也可以调用PythonRDD的asJavaRDD方法(如PipelinedRDD计算时),在各个worker上启动python进程执行反序列化之后的函数,通过管道与python进程进行通信,最后得到JavaRDD。

 

管道传输利用的是Popen,这样做标准输入



总结

过了一下pyspark是怎么让不同虚拟机之间传输数据并在python环境调用java类的,两者使用的是不同的网络实现方式。


全文完 :)

目录
相关文章
Grafana实现图表双Y坐标轴展示
Grafana实现图表双Y坐标轴展示
|
Java Linux Shell
Gradle下载和配置教程:Windows、Mac和Linux系统安装指南
Gradle下载和配置教程:Windows、Mac和Linux系统安装指南
2269 0
|
7月前
|
人工智能 中间件 API
别让创意卡在工具链!MiniMax MCP Server:MiniMax 开源 MCP 服务打通多模态生成能力,视频语音图像一键全搞定
MiniMax MCP Server 是基于模型上下文协议的多模态生成中间件,支持通过文本指令调用视频生成、图像创作、语音合成及声音克隆等能力,兼容主流客户端实现跨平台调用,采用检索增强生成技术保障内容准确性。
616 3
别让创意卡在工具链!MiniMax MCP Server:MiniMax 开源 MCP 服务打通多模态生成能力,视频语音图像一键全搞定
【Azure 环境】连接到微软云Azure中国区 By VS 2019, VS Code, Powershell
【Azure 环境】连接到微软云Azure中国区 By VS 2019, VS Code, Powershell
370 0
【Azure 环境】连接到微软云Azure中国区 By VS 2019, VS Code, Powershell
|
缓存 负载均衡 应用服务中间件
nginx.conf 配置解析及常用配置
nginx.conf 配置解析及常用配置
385 6
|
XML 关系型数据库 PostgreSQL
Pandas 2.2 中文官方教程和指南(一)(2)
Pandas 2.2 中文官方教程和指南(一)
477 0
|
存储 弹性计算 安全
OSS的网盘之路,最小化实现网盘分享
其实很多用户都知道OSS是非常适合用于作为网盘、附件系统的底层设施的,但是很多企业用户在沟通的过程中,其实没有很好的系统来支持OSS作为一个网盘去分发一些文件,例如企业像将介绍视频通过微信发布给有购买记录的客户,但是视频比较大也不方便直接通过微信发送视频,也不方便放到B站、优酷等视频平台中。 那么本文就介绍利用最小化资源实现OSS的网盘分享,让 ECS + OSS = 网盘。
1637 1
OSS的网盘之路,最小化实现网盘分享
|
XML JSON 前端开发
详解Http的Content-Type
1.概述 HTTP(HyperText Transfer Protocol),超文本传输协议。超文本(Hypertext)是一种结构化的文本,其中包含了超链接(Hyperlink)的能力,通过超链接可以在不同文档之间创建关联和跳转。 传统的文本是线性的,按照一定的顺序排列的,而超文本则打破了线性结构,允许文本中的某些词、短语或图像与其他文档或资源之间建立关联。这些关联通过超链接来实现,用户可以点击超链接来跳转到其他相关的文档、网页、图片、视频或其他媒体资源。
701 1
STM32控制蜂鸣器间隔发出声音(响1s,关闭1s)
STM32控制蜂鸣器间隔发出声音(响1s,关闭1s)
805 1
Axure快速入门(09) -变量和表达式(计算商品总价例子)
Axure快速入门(09) -变量和表达式(计算商品总价例子)
354 0

热门文章

最新文章