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 ======================


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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • .NET API for RabbitMQ and ActiveMQ

    .NET API for RabbitMQ and ActiveMQ

    2022年1月15日
  • opencv跟踪视频上的目标(理论分析框架)

    出处:http://hi.baidu.com/icekeydnet/blog/item/965b25154a19f3dea6ef3ffe.html如前面说到的,OpenCVVS提供了6组算法的接口,分别是:前景检测、新目标检测、目标跟踪、轨迹生成、跟踪后处理、轨迹分析,除了轨迹生成用于轨迹数据的保存以外,其他5个部分都是标准的视频监控算法体系中不可或缺的部分。      OpenC

    2022年4月16日
  • 【更新】互联网公司可投之参考[通俗易懂]

    【更新】互联网公司可投之参考[通俗易懂]【更新】互联网公司可投之参考以下内容收集于网络资料,仅供参考。如有误请指正~,未经允许,禁止转载。不介意的话,放个自己的字节内推,投递链接https://jobs.toutiao.com/s/dp5bxEK,内推码:AJCWZR2北京公司上海公司广州公司深圳公司武汉公司杭州公司成都公司成都公司长沙公司…小伙伴们觉得有用的话可以关注点赞收藏,后面持续更新~以下内容收集于网络资料,仅供参考。如有误请指正~,未经允许,禁止转载。#目前已更新:北京、上海、广州、深圳、武汉、杭州、成都、南京、长沙…不介意的

    2022年5月14日
  • C语言基础知识入门(大全)「建议收藏」

    C语言基础知识入门(大全)「建议收藏」一.C语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课!更多详细进阶教程等你领取!可以关注公众号“C和C加加”回复“ZXC”即可免费获取!二.C语言的具体结构简单来说,一个C程序就是由若干头文件和函数组成。 #include<stdio.h>就是一条预处理命..

    2022年6月7日
  • booth算法原理的简单化理解「建议收藏」

    booth算法原理的简单化理解「建议收藏」最近,在学习带符号二进制数乘法(multiplicationof signednumbers)时接触到了布思算法(boothalgorithm)。由于是第一次接触,对于其原理却一无所知,书上的解释以及网上的文章不知是自己才疏学浅还本来就是泛泛而谈,没有让我了解其本质。经过长时间的思考分析,最终找到了一种比较简单的理解方法。举一个简单的例子,比如说计算10100001×00111110,

    2022年10月23日
  • 联合索引(多列索引)[通俗易懂]

    联合索引(多列索引)[通俗易懂]联合索引是指对表上的多个列进行索引,联合索引也是一棵B+树,不同的是联合索引的键值数量不是1,而是大于等于2.最左匹配原则假定上图联合索引的为(a,b)。联合索引也是一棵B+树,不同的是B+树在对索引a排序的基础上,对索引b排序。所以数据按照(1,1),(1,2)……顺序排放。对于selete*fromtablewherea=XXandb=XX,显然是可以使用…

    2022年6月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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