问题标签 [py4j]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3318 浏览

python - Eclipse (PyDev) 上没有名为 py4j.protocol 的模块

我配置了 Eclipse 以便使用 Spark 和 Python 进行开发。我配置了: 1. PyDev 与 Python 解释器 2. PyDev 与 Spark Python 源 3. PyDev 与 Spark 环境变量。

这是我的库配置:

在此处输入图像描述

这是我的环境配置:

在此处输入图像描述

我创建了一个名为 CompensationStudy 的项目,我想运行一个小示例并确保一切顺利。

在此处输入图像描述

这是我的代码:

但是我收到了这个错误:ImportError: No module named py4j.protocol

从逻辑上讲,当我使用 Spark Python 源配置 PyDev 时,会自动导入 PySpark 的所有库依赖项,包括 Py4J。那么,这里有什么问题?我的 log4j.properties 文件有问题吗?请帮忙 !

0 投票
1 回答
1871 浏览

java - Py4j launch_gateway 未正确连接

我正在尝试使用 py4j 打开一个网关,我可以使用该网关将对象从 java 传递到 python。当我尝试使用 py4j 函数打开网关时,launch_gateway它似乎没有正确连接到我的 Java 类。但是,当我在命令行中启动我的 java 类,然后使用 python 连接到它时,JavaGateway一切都按预期工作。我希望能够使用内置方法,因为我确信我没有考虑到 py4j 设计中已经考虑过的事情,但我只是不确定我做错了什么。

假设我想创建一个通往班级的网关sandbox.demo.solver.UtilityReporterEntryPoint.class。在命令行中,我可以通过执行以下命令来做到这一点:

这按预期启动,我可以在连接到网关后从 python 中使用我的类中的方法。到目前为止,一切都很好。

我对 py4j 文档的理解使我相信我应该执行以下操作以在 python 中启动网关:

执行这三行时我没有收到任何错误,但是当我尝试使用它访问我的 java 类方法gateway.entry_point.someMethod()时失败并出现以下错误:

Py4JError:调用 t.getReport 时发生错误。跟踪:py4j.Py4JException:此网关的目标对象 ID 不存在:t 在 py4j.commands 的 py4j.Gateway.invoke(Gateway.java:277).AbstractCommand.invokeMethod(AbstractCommand.java:132) 在 py4j.commands。 CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:214) at java.lang.Thread.run(Thread.java:745)

显然,有些东西没有被正确调用,launch_gateway或者我给它提供了错误的信息。

在 py4j 源代码中,launch_gateway您可以看到给定您提供的输入和函数构造的输入,构造一个命令,最终由subprocess.Popen. 因此,给定传递给launch_gateway上述命令的输入Popen将是:

传递此命令以Popen按预期返回侦听端口。但是,连接到这个监听端口仍然不允许访问我的类方法。

最后,将命令作为单个字符串传递给不带最终参数 ('0') 的 Popen,正确启动网关,该网关再次按预期运行。看过 py4j.GatewayServer.class 的 Java 源代码后,这是没有意义的,因为 main 方法似乎表明如果参数的长度为 0,则该类应该以状态 1 退出。

在这一点上,我有点不知所措。我可以破解一个可行的解决方案,但正如我所说,我确信这忽略了网关行为的重要方面,我不喜欢 hacky 解决方案。我很想在这篇文章中标记@Barthelemy,但希望他能读到这篇文章。提前感谢您的帮助。

编辑

目前,我已经能够通过以下步骤解决此问题。

  1. 将包括所有外部依赖项在内的整个项目打包到一个 jar 文件magABM-all.jar中,并将“Main-Class”设置为UtilityReporterEntryPoint.

  2. 包括if...else关于存在--die-on-exit完全一样的块GatewayServer.java

  3. 用于subprocess.Popen调用命令运行项目jar。

UtilityReporterEntryPoint.java

应用程序.py

这样我仍然可以gateway.shutdown在必要时使用,如果启动 py4j 网关的 python 进程死亡或关闭,网关将被关闭。

注意我绝不会认为这是最终解决方案,因为 py4j 是由更聪明的人编写的,目的很明确,我相信有一种方法可以在 py4j 的范围内管理这个确切的工作流程。这只是权宜之计。

0 投票
1 回答
290 浏览

java - py4j 正在打开太多线程

我正在使用 py4j 从 Java 到 Python 进行通信。我将下面的 Java 代码打包到一个 Jar 中,并使用命令 java -jar file.jar 运行,但查看它我可以看到该命令在单独的线程中运行了大约 30 次,尽管我调用了一次。我怀疑它的发生是因为 py4j 的实现方式。如何设置 py4j 使用的线程数的最大值?我可以使用 Java 和 python 之间的什么通信来减少内存?

0 投票
1 回答
5858 浏览

apache-spark - 如何在 Python 中从 pySpark 添加 SparkListener?

我想创建一个 Jupyter/IPython 扩展来监控 Apache Spark 作业。

Spark 提供了一个 REST API。

但是,我希望通过回调发送事件更新,而不是轮询服务器。

我正在尝试SparkListener使用SparkContext.addSparkListener(). SparkContext此功能在 Python 中的 PySpark 对象中不可用。那么如何从 Python 注册一个 Python 监听器到 Scala/Java 版本的上下文。有可能做到这一点py4j吗?我希望在侦听器中触发事件时调用 python 函数。

0 投票
1 回答
1368 浏览

java - 两种方式,java <=> python,使用py4j通信

我正在使用py4j进行python和java之间的通信。我可以从java端调用python方法。但是从 python 我无法发送任何对象或调用 java 方法。这是我尝试过的代码。

我的java代码:

我的python代码:

0 投票
1 回答
89 浏览

python - 从 Python Popen 和线程函数在后台运行 mvn

我正在使用 Py4j 模块实现网关服务器自动化。每次用户调用该功能时都需要启动网关服务器。我面临的问题是我无法在后台运行该功能。这是代码:

我在这里面临两个问题 1)如果我将 kwargs 标准输出指定为记录器(用于检查输出的日志文件),它会抛出一个错误,指出标准输出指定了多个参数。

2)如果我不指定 stdout 选项,线程的输出将显示在我不想要的 ipython 终端上。

我想要的只是在后台调用服务器,以便其他功能可以访问 java 网关服务器并访问可以从 ipython 使用的方法。

您可以放心地假设 mvn 函数在直接通过终端运行时工作正常。

谢谢

0 投票
1 回答
116 浏览

python-3.x - mllib 内核密度错误

我正在尝试以这种方式使用 pyspark.mllib.stat.KernelDensity:

但最终得到这个错误:

-------------------------------------------------- ------------------------- Py4JError Traceback (most recent call last) in () 8 9 # 查找给定值的密度估计 ---> 10 密度 = kd.estimate([-1.0, 2.0, 5.0])

/home/user10215193/anaconda3/lib/python3.6/site-packages/pyspark/mllib/stat/KernelDensity.py 估计(自我,点)56点=列表(点)57密度= callMLlibFunc(---> 58 “estimateKernelDensity”,self._sample,self._bandwidth,点)59 返回 np.asarray(密度)

/home/user10215193/anaconda3/lib/python3.6/site-packages/pyspark/mllib/common.py in callMLlibFunc(name, *args) 129 api = getattr(sc._jvm.PythonMLLibAPI(), name) 130 print( api) --> 131 返回调用JavaFunc(sc, api, *args) 132 133

/home/user10215193/anaconda3/lib/python3.6/site-packages/pyspark/mllib/common.py in callJavaFunc(sc, func, *args) 121 """ 调用 Java 函数 """ 122 args = [_py2java( sc, a) for a in args] --> 123 return _java2py(sc, func(*args)) 124 125

/home/user10215193/anaconda3/lib/python3.6/site-packages/py4j/java_gateway.py in call (self, *args) 1131 answer = self.gateway_client.send_command(command) 1132 return_value = get_return_value( -> 1133 answer , self.gateway_client, self.target_id, self.name) 1134 1135 对于 temp_args 中的 temp_arg:

/home/user10215193/anaconda3/lib/python3.6/site-packages/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name) 321 raise Py4JError( 322 "调用 {0}{1} 时出错{2}. Trace:\n{3}\n".-> 323 格式(target_id, ".", name, value)) 324 else: 325 raise Py4JError(

Py4JError:调用 o19.estimateKernelDensity 时出错。Trace: py4j.Py4JException: Method estimateKernelDensity([class org.apache.spark.api.java.JavaRDD, class java.lang.Integer, class java.util.ArrayList]) 不存在于 py4j.reflection.ReflectionEngine.getMethod( ReflectionEngine.java:318) at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326) at py4j.Gateway.invoke(Gateway.java:272) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132) at py4j.commands.CallCommand.execute(CallCommand.java:79) at py4j.GatewayConnection.run(GatewayConnection.java:214) at java.lang.Thread.run(Thread.java:748)

我在这里找不到类似的东西,所以如果有人可以帮助我,我将不胜感激。

0 投票
0 回答
238 浏览

machine-learning - 如何访问在pyspark中使用mllib构建的决策树节点?

我的代码是 from pyspark.mllib.tree import DecisionTree,DecisionTreeModel

model = DecisionTree.trainClassifier(training_data)

Node = model.call("topNode")

但我认为除了rootNode/topNode之外,没有任何方法可以访问任何节点的leftNode/rightNode。我也在尝试使用 py4j 库来访问 python 中的 java 对象。谢谢

0 投票
1 回答
226 浏览

pyspark - 使用带有 pyspark 的锅炉管

我正在使用锅炉管从 html 中获取文本。但是,有一些问题我无法解决。我有一个 50k 元素的列表。我正在创建一个 1000 个元素的 rdd,然后处理它们并将生成的 rdd 保存在 hdfs 中。我遇到的错误是这样的:

在 hdfs 文件中,前 1000 个元素的结果被保存,但继续它会引发上述错误。有什么办法解决这个问题?

0 投票
3 回答
10672 浏览

python - 从 Python 连接和测试 JDBC 驱动程序

我正在尝试使用 Python 对我们的 JDBC 驱动程序进行一些测试。

最初弄清楚 JPype,我最终设法连接驱动程序并像这样执行选择查询(复制一个通用片段):

但是,我未能批量插入,这是我想要测试的。即使executeBatch()返回一个 jpype int[],它应该表明插入成功,表也没有更新。

然后我决定尝试 py4j。

我的困境 - 我很难弄清楚如何做与上述相同的事情。据说py4j不会自己启动JVM,Java代码需要预先安排一个GatewayServer(),所以我不确定它是否可行。

另一方面,有一个名为py4jdbc的库可以做到这一点。

我修改了 dbapi.py 代码,但不太了解流程,而且几乎被卡住了。

如果有人了解如何使用 py4j 从 .jar 文件加载 JDBC 驱动程序并能指出正确的方向,我将不胜感激。