背景:spark的代码很多是由Java写成的,自从spark为Python开放了借口之后,Python使用者也可以轻松利用spark进行分布式存储和运算,其中的原理是什么?写一点个人理解,可能不够严谨。
- py4j-百度百科
参考py4j官网
Py4J enables Python programs running in a Python interpreter to dynamically access Java objects in a Java Virtual Machine. Methods are called as if the Java objects resided in the Python interpreter and Java collections can be accessed through standard Python collection methods. Py4J also enables Java programs to call back Python objects. Py4J is distributed under the BSD license.
Py4J 是一个用 Python 和 Java 编写的库。
通过 Py4J,Python程序 能够动态访问 Java虚拟机 中的 Java对象,Java程序 也能够回调 Python对象。
pip 安装 Py4J pip install py4j
如下代码是Py4J 的示例,通过 Python 从 JVM 上,创建 java.util.Random 实例,并调用其若干方法。
>>> from py4j.java_gateway import JavaGateway
>>> gateway = JavaGateway() # connect to the JVM
>>> random = gateway.jvm.java.util.Random() # create a java.util.Random instance
>>> number1 = random.nextInt(10) # call the Random.nextInt method
>>> number2 = random.nextInt(10)
>>> print(number1,number2)
(2, 7)
>>> addition_app = gateway.entry_point # get the AdditionApplication instance
>>> addition_app.addition(number1,number2) # call the addition method
9
上面的例子中,python程序从JVM中创建了一个java.util.Random实例,并且调用了一些方法。并且也访问了一个普通的java类。AdditionApplication,用以求产生的两个数字的和。
pyspark原理简介
简单来说
在python driver端,SparkContext利用Py4J启动一个JVM并产生一个JavaSparkContext。Py4J只使用在driver端,用于本地python与Java SparkContext objects的通信。大量数据的传输使用的是另一个机制。
RDD在python下的转换会被映射成java环境下PythonRDD。在远端worker机器上,PythonRDD对象启动一些子进程并通过pipes与这些子进程通信,以此send用户代码和数据。