py4j.java gateway_py4j入门(官方文档消化)

这里只列写关键代码,源码与文档中有对应。

py4j:

入门:

what:允许python编译器动态的访问JVM中的java对象,或者反过来

简单用例,Python使用GatewayServer访问JVM:

Python端:

gateway =JavaGateway()

java_app=gateway.entry_point

java_app.addition(number1, number2)) //根据入口点调用stack = gateway.entry_point.getStack() //根据get方法获取对象java_list = gateway.jvm.java.util.ArrayList() //获取java的list

Java端:

//它允许 Python 程序通过本地网络套接字与 JVM 通信。

GatewayServer server = newGatewayServer(app); 实例化entry_point

server.start();

Python里对JVM集合的切片:操作不会影响原集合,因为切片是在JVM中也做了一次拷贝,链接出的的python对象。

进阶:

1 2.支持数组与collection的直接创建:

gateway = JavaGateway()

int_class = gatew

int_array = gateway.new_array(int_class,2)ay.jvm.int

arrayList = gateway.jvm.java.util.ArrayList()

set = gateway.jvm.java.util.HashSet()

map = gateway.jvm.java.util.HashMap()

3 通过callback实现Java接口

//接口实现类在初始化时将gateway赋值def __init__(self, gateway):

self.gateway=gateway

class Java:

implements = ["Java接口全限定名"]if __name__ == "__main__"://使用Callback参数

gateway=JavaGateway(

callback_server_parameters=CallbackServerParameters())

listener= PythonListener(gateway)

4 线程模型

多线程模型:JavaGateway和CallbackServer,Py4j会每次创建一个线程

单线程模型:

gateway =ClientServer(

java_parameters=JavaParameters(),

python_parameters=PythonParameters())

Clientserver科欧

5 从java端创建一个会话

需要:

1.启动python进程,新建一个JavaGateway或ClientServer

2.创建一Python实例实现Java接口,作为python_server_entry_point参数

3.在java侧启动JavaGateway或ClientServer

4.调用getPythonServerEntryPoint获取python的entry point,得到java接口实现

使用JavaGateway:

gateway =JavaGateway(

callback_server_parameters=CallbackServerParameters(),

python_server_entry_point=simple_hello)

使用ClientServer:

//java

ClientServer clientServer=new ClientServer(null);// We get an entry point fromthe Python side

IHello hello= (IHello) clientServer.getPythonServerEntryPoint(new Class[] { IHello.class});//Python

gateway=ClientServer(

java_parameters=JavaParameters(),

python_parameters=PythonParameters(),

python_server_entry_point=simple_hello)

6.使用动态端口:launch_gateway

7.python集合转换为java集合

gateway = JavaGateway(gateway_parameters=GatewayParameters(auto_convert=True))

python集合可以使用方法,但是作为拷贝不会被java方法修改

8监听events:

//Java

GatewayServer.addListener//Python

server_started.connect(started)

gateway=JavaGateway(

gateway_parameters=GatewayParameters(),

callback_server_parameters=CallbackServerParameters())

9 内存模型

Java对象在Python侧:Java对象发送给python侧,一个对象引用会维护在java侧(Gateway中)。一旦对象在PVM被回收,则引用也会在JVM中回收。如果gateway被关闭,剩余的对象也会被回收。

Python对象在Java端,对此对象的引用会保留在python端。直到被JVM回收。

API:

py4j.clientserver

clientServer是JavaGateway的子类,完全兼容给JavaGateway的代码

JavaParameters

当你在Python环境中使用Pyspark,特别是尝试启动SparkContext或者PySparkSession的时候遇到`ModuleNotFoundError: No module named 'py4j.java_gateway'`错误,这通常意味着Python解释器无法找到Py4J库,而Py4J是连接Apache Spark Java API的关键组件。 以下是几个可能导致这个问题的原因以及解决方案: 1. **缺少库安装**:首先确认是否已安装了Py4J。你可以通过pip来安装它: ```bash pip install py4j ``` 2. **环境变量问题**:如果你是在Docker或其他隔离环境中,确保你的Python环境包含了Py4J。检查你的requirements.txt文件或pip freeze的输出,确保Py4J已经包含在内。 3. **Spark版本兼容性**:Py4J需要与你的Spark版本匹配。确保你使用的Spark和Py4J版本是兼容的。例如,Spark 3.x通常需要Py4J 0.10以上版本。 4. **Spark配置问题**:在某些集成工具如Jupyter Notebook、Databricks或SparkSubmit中,可能需要额外设置来指定Py4J的路径。确保你的配置正确无误。 5. **模块加载顺序**:有时候,如果其他库干扰了Py4J的导入,可以在启动时手动导入解决,如: ```python import sys sys.path.append('/path/to/py4j') from py4j.java_gateway import java_import java_import("org.apache.spark.SparkConf", "SparkConf") ``` 一旦安装并解决了这个问题,你应该能够正常创建SparkContext或PySparkSession了。如果有其他问题,可以提供更多的错误日志信息以便进一步分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值