Spark调研笔记第4篇 – PySpark Internals

Spark调研笔记第4篇 – PySpark Internals

大家好,又见面了,我是全栈君。

事实上。有两个名为PySpark的概念。一个是指Sparkclient内置的pyspark脚本。而还有一个是指Spark Python API中的名为pyspark的package。

本文仅仅对第1个pyspark概念做介绍。

1. Sparkclient内置的pyspark”命令”
Sparkclient支持交互模式以方便应用调试。通过调用pyspark能够进入交互环境:
cd /path/to/spark/ && ./bin/pyspark
用编辑器查看可知,pyspark事实上是个shell脚本,部分内容摘出例如以下:
Spark调研笔记第4篇 - PySpark Internals
从上面的脚本片段可知,若调用./bin/pyspark时传入要运行的python脚本路径,则pyspark是直接调用spark-submit脚本向spark集群提交任务的;若调用./bin/pyspark时未带不论什么參数,则会通过调起Python解释器($PYSPARK_DRIVER_PYTHON)进入交互模式。当中调起Python解释器前,pyspark脚本会通过export PYTHONPATH将与Spark Python API相关的库增加Python解释器的载入路径,以便交互环境中能正确import与Spark相关的库。

2. PySpark Internals
通过上面的介绍。我们已经清楚Sparkclient内置pyspark脚本的用处。那么,当通过./bin/pyspark进入交互模式后,本地的Python driver进程(即Python解释器进程)和Spark集群worker节点的executor(s)进程是怎么交互的呢?以下来回答这个问题。
其实。当我们在本地机器通过./bin/pyspark进入交互模式并向Spark集群提交任务时。本地会在运行pyspark脚本时先启动一个被称为driver program的Python进程并创建SparkContext对象,而后者会通过Py4J启动一个JVM进程并创建JavaSparkContext对象,该JVM进程负责与集群的worker节点传输代码或数据。

从Spark Wiki关于PySpark Internals的说明可知,PySpark建立在Spark Java API之上,数据按Python的语法行为被处理,运行结果由JVM负责cache或shuffle。数据流交互结构例如以下图所看到的:
Spark调研笔记第4篇 - PySpark Internals
由上图可知,用户提交的Python脚本中实现的RDD transformations操作会在本地转换为Java的PythonRDD对象。后者由本地的JVM发往Spark集群节点。

在远程的worker节点上,PythonRDD对象所在的JVM进程会调起Python子进程并通过pipe进行进程间通信(如向Python子进程发送用户提交的Python脚本或待处理的数据)。

以上就是当我们调用./bin/pyspark时,sparkclient和集群节点之间的内部结构。

理解这些内容有助于我们从整体上加深对Spark这个分布式计算平台的认识。

比如,当调用rdd.collect()时。这个action操作会把数据从集群节点拉到本地driver进程。

假设数据集比較大。则可能报出类似于”spark java.lang.OutOfMemoryError: Java heap space”的错误。

而由本文的介绍可知,提交任务时,本地driver进程启动了一个JVM进程,默认的JVM是有最大内存限制的。假设数据集的大小超过driver默认的最大内存限制。就会报出OOM的错误。解决的方法是在spark-defaults.conf中添加配置项spark.driver.memory,将其值设置到较大值。

【參考资料】
1. Spark Wiki Homepage: PySpark Internals

========================== EOF ======================


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115349.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pycharm的库安装不成功_pip安装第三方库拒绝访问

    pycharm的库安装不成功_pip安装第三方库拒绝访问我首先使用GUI的方法安装pandas,十几分钟了吧依然显示Installing,最后提示失败,我就在AvailablePackage窗口点击Managerepositories,然后更换了国内的库,但是依然不能安装成功,错误提示如下:Lookinginindexes:http://pypi.douban.com/simple/WARNING:Therepositorylocatedatpypi.douban.comisnotatrustedorsecurehost

  • vscode服务器浏览器打开html_vscode实时预览HTML

    vscode服务器浏览器打开html_vscode实时预览HTMLVscode默认是在控制台下查看html文件,对于我们查看和调试都很不方便,那如何在浏览器中打开呢?1.新建一个HTML文件2.点击左侧的扩展,打开扩展栏3.在扩展栏的搜索栏中输入openinbrowser,找到openinbrowser这款插件,点击右下角“安装”字样即可安装。因为我已经安装了,所以再搜索不会显示安装字样4.安装完成后可以看一下这款插件的扩展文档,里面有插…

  • Vue3快速入门教程「建议收藏」

    Vue3快速入门教程「建议收藏」DataProperty模板在<>内的,属于HTMLattribute普通的Mustache语法:双大括号->{{number}}的文本v-bind和v-on的使用创建vm实例时对常用的几个钩子函数的使用方法created(){}mounted(){}以下示例:每秒改变1次msg<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”U..

  • 如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)

    如何利用C/C++逐行读取txt文件中的字符串(可以顺便实现文本文件的复制)本文代码都在Windows/VC++6.0下测试过,在linux/g++下也没有问题。但是,请一定注意linux和Windows文件格式的区别,比如:1.当linux上的代码读取Windows文件格式时,读取结果的每行都会多一个\r,想想为什么。2.当Windows上的代码读取linux格式文件时,读取的结果会显示只有一行,想想为什么。

  • java 字符串和整型的相互转换_整型数组转换成字符串

    java 字符串和整型的相互转换_整型数组转换成字符串JAVA的整型与字符串相互转换1字串String转换成整数int1).inti=Integer.parseInt([String]);或i=Integer.parseInt([String],[intradix]);2).inti=Integer.valueOf(my_str).intValue();2整数int转换成字串String1.)Strings…

    2022年10月19日
  • onclick与addEventListener区别

    onclick与addEventListener区别这次做项目遇到了这个问题,本来习惯性的每次都写的是addEventListener绑定click事件。但是当用addEventListener绑定了多次click事件的时候,引发了我的思考,这两者有区别吗?具体的事件分析可查看另一篇文章结论:1.onclick事件在同一时间只能指向唯一对象2.addEventListener给一个事件注册多个listener3.addEventLi…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号