问题标签 [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.
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 文件有问题吗?请帮忙 !
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,但希望他能读到这篇文章。提前感谢您的帮助。
编辑
目前,我已经能够通过以下步骤解决此问题。
将包括所有外部依赖项在内的整个项目打包到一个 jar 文件
magABM-all.jar
中,并将“Main-Class”设置为UtilityReporterEntryPoint
.包括
if...else
关于存在--die-on-exit
完全一样的块GatewayServer.java
用于
subprocess.Popen
调用命令运行项目jar。
UtilityReporterEntryPoint.java
应用程序.py
这样我仍然可以gateway.shutdown
在必要时使用,如果启动 py4j 网关的 python 进程死亡或关闭,网关将被关闭。
注意我绝不会认为这是最终解决方案,因为 py4j 是由更聪明的人编写的,目的很明确,我相信有一种方法可以在 py4j 的范围内管理这个确切的工作流程。这只是权宜之计。
java - py4j 正在打开太多线程
我正在使用 py4j 从 Java 到 Python 进行通信。我将下面的 Java 代码打包到一个 Jar 中,并使用命令 java -jar file.jar 运行,但查看它我可以看到该命令在单独的线程中运行了大约 30 次,尽管我调用了一次。我怀疑它的发生是因为 py4j 的实现方式。如何设置 py4j 使用的线程数的最大值?我可以使用 Java 和 python 之间的什么通信来减少内存?
apache-spark - 如何在 Python 中从 pySpark 添加 SparkListener?
我想创建一个 Jupyter/IPython 扩展来监控 Apache Spark 作业。
Spark 提供了一个 REST API。
但是,我希望通过回调发送事件更新,而不是轮询服务器。
我正在尝试SparkListener
使用SparkContext.addSparkListener()
. SparkContext
此功能在 Python 中的 PySpark 对象中不可用。那么如何从 Python 注册一个 Python 监听器到 Scala/Java 版本的上下文。有可能做到这一点py4j
吗?我希望在侦听器中触发事件时调用 python 函数。
java - 两种方式,java <=> python,使用py4j通信
我正在使用py4j进行python和java之间的通信。我可以从java端调用python方法。但是从 python 我无法发送任何对象或调用 java 方法。这是我尝试过的代码。
我的java
代码:
我的python代码:
python - 从 Python Popen 和线程函数在后台运行 mvn
我正在使用 Py4j 模块实现网关服务器自动化。每次用户调用该功能时都需要启动网关服务器。我面临的问题是我无法在后台运行该功能。这是代码:
我在这里面临两个问题 1)如果我将 kwargs 标准输出指定为记录器(用于检查输出的日志文件),它会抛出一个错误,指出标准输出指定了多个参数。
2)如果我不指定 stdout 选项,线程的输出将显示在我不想要的 ipython 终端上。
我想要的只是在后台调用服务器,以便其他功能可以访问 java 网关服务器并访问可以从 ipython 使用的方法。
您可以放心地假设 mvn 函数在直接通过终端运行时工作正常。
谢谢
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)
我在这里找不到类似的东西,所以如果有人可以帮助我,我将不胜感激。
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 对象。谢谢
pyspark - 使用带有 pyspark 的锅炉管
我正在使用锅炉管从 html 中获取文本。但是,有一些问题我无法解决。我有一个 50k 元素的列表。我正在创建一个 1000 个元素的 rdd,然后处理它们并将生成的 rdd 保存在 hdfs 中。我遇到的错误是这样的:
在 hdfs 文件中,前 1000 个元素的结果被保存,但继续它会引发上述错误。有什么办法解决这个问题?
python - 从 Python 连接和测试 JDBC 驱动程序
我正在尝试使用 Python 对我们的 JDBC 驱动程序进行一些测试。
最初弄清楚 JPype,我最终设法连接驱动程序并像这样执行选择查询(复制一个通用片段):
但是,我未能批量插入,这是我想要测试的。即使executeBatch()
返回一个 jpype int[],它应该表明插入成功,表也没有更新。
然后我决定尝试 py4j。
我的困境 - 我很难弄清楚如何做与上述相同的事情。据说py4j不会自己启动JVM,Java代码需要预先安排一个GatewayServer(),所以我不确定它是否可行。
另一方面,有一个名为py4jdbc的库可以做到这一点。
我修改了 dbapi.py 代码,但不太了解流程,而且几乎被卡住了。
如果有人了解如何使用 py4j 从 .jar 文件加载 JDBC 驱动程序并能指出正确的方向,我将不胜感激。