java spark 运行原理_解读pyspark运行原理

PySpark在数据科学领域广泛应用,其运行原理不同于直接使用Scala或Java。本文探讨了PySpark如何在Spark核心架构外封装Python层,使Driver和Executor通过Py4J与JVM交互。在Driver端,pyspark应用通过Py4J与JVM Driver通信,而在Executor端,Python实现的UDF和lambda函数在Python worker中执行,通过socket通信。尽管这带来了性能损耗,PySpark仍提供跨语言扩展的便利。选择开发语言应综合考虑开发效率、运行效率和技术栈等因素。
摘要由CSDN通过智能技术生成

python在近几年的势头很猛,在很多的编程语言排行榜中都能占据第一第二的位置。对初学者比较友好,优雅的编程风格,较高的开发效率,这些特点让python成为很多互联网行业从业者的选择。尤其是python在数据科学领域里面丰富的生态支持,让很多软件架构师在既要做系统架构,又要做数据算法的场景中为了统一编程语言,就进入了python的怀抱。在spark支持的开发语言中,python拥有比较高的使用比例。

曾经年少的我刚接触spark时, 看到spark可以支持到python来开发,想当然的以为spark应该是把我们写的python的spark代码转换成java字节码或者是底层的机器语言然后再放到各个机器节点上去运行。当然这只是没做进一步研究的想法,那spark是怎么来运行使用pyspark开发的代码呢。

spark核心框架的逻辑架构图

当使用scala和java开发spark应用时,如上图,driver和executor都是以JVM为载体来运行和执行任务。而当使用python开发spark应用时,spark为了保证核心架构的统一性,在核心架构外围封装了一层python,spark的核心架构功能包括计算资源的申请,task的管理和分配, driver与executor之间的通信,executor之间的通信,rdd的载体等都是在基于JVM的。

在driver端,用户编写的pyspark应用通过py4j与jvm Driver通信,pyspark应用中建立的sparkcontext会映射到jvm Driver中的sparkcontext对象,程序中建立的rdd对象在执行到action操作时,同样rdd和action也会映射到jvm Driver中,在jvm Driver中执行。在executor端,通过pyspark daemon启动pyspark worker,python实现的udf和lambda函数在worker中执行,基于socket通信,executor发送数据到worker,worker返回结果到executor中。rdd的载体还是在executor中,当有udf和lambda逻辑时,executor才会需要与worker进行数据的通信。

spark的这种设计可以说是非常方便的去进行多种开发语言的扩展。但是也可以明显看出与在jvm内部运行的udf相比,在python worker中执行udf时,额外增加了数据在executor jvm和pythin worker之间序列化、反序列化、及通信IO等损耗,并且在程序运行上python相比java的具有一定的性能劣势。在计算逻辑比重比较大的spark任务中,使用自定义udf的pyspark程序会明显有更多的性能损耗。当然在spark sql 中使用内置udf会降低或除去上述描述中产生的性能差异。

最终选择哪种spark 开发语言,要从开发效率、运行效率、团队技术栈选择等多方面来考虑,来选择适合自己团队的开发语言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值