它的py4j gatewayServer在spark中的切入点是什么?

时间:2016-03-03 14:05:07

标签: apache-spark pyspark py4j

我试图使用py4j在pyspark中运行java函数。 Py4j支持访问JVM中的java对象。我创建了另一个JVM实例,并且能够成功运行java函数。

py4j通过GatewayServer实例启用此通信。

我想知道我们是否能以某种方式访问​​spark的内部JVM来运行我的java函数? py4j网关服务器在spark中的切入点是什么?如何将我的功能添加到入口点?

2 个答案:

答案 0 :(得分:2)

我不确定这是否是您需要的,但我看到过两个地方:

sc._gateway.jvm

可以用于java_import或直接用于

sc._jvm

因此,要访问包a.b.c中的类X,您可以执行以下操作之一:

jvm = sc._gateway.jvm
java_import(jvm,"a.b.c.X")
instance = a.b.c.X()

或更直接:

instance = sc._jvm.a.b.c.X()

要添加java函数,您需要确保它在类路径中,如果您想在worker中使用它(例如在UDF中),那么您需要将它发送给worker。要实现这一点,您可以使用--driver-class-path开关来spark-submit(或pyspark)添加到驱动程序和-jars以发送给worker。

答案 1 :(得分:1)

看看

$SPARK_HOME/python/pyspark/java_gateway.py

您将看到用于与Java / Scala后端进行交互的机制。

您需要更新一个或多个Java文件,如下所示:

java_import(gateway.jvm, "org.apache.spark.SparkConf")
java_import(gateway.jvm, "org.apache.spark.api.java.*")
java_import(gateway.jvm, "org.apache.spark.api.python.*")
java_import(gateway.jvm, "org.apache.spark.mllib.api.python.*")
# TODO(davies): move into sql
java_import(gateway.jvm, "org.apache.spark.sql.*")
java_import(gateway.jvm, "org.apache.spark.sql.hive.*")
java_import(gateway.jvm, "scala.Tuple2")

这些代表Spark-Java个入口点。

Pyspark使用Spark-Java入口点,而不是直接转到Scala。你需要   - (a)使用那些API类中的现有类或   - (b)在这些类中添加新的入口点并构建您自己的Spark版本