38

我有一些 Java 中的第三方数据库客户端库。我想通过

java_gateway.py

例如:使客户端类(不是 JDBC 驱动程序!)通过 Java 网关对 Python 客户端可用:

java_import(gateway.jvm, "org.mydatabase.MyDBClient")

不清楚将第三方库添加到 JVM 类路径的位置。我试图添加到文件compute-classpath.sh,但这似乎不起作用。我得到:

Py4jError:试图调用一个包

此外,与 Hive 相比:hive JAR 文件不是通过文件compute-classpath.sh加载的,所以这让我很怀疑。似乎还有一些其他机制正在设置 JVM 端类路径。

4

9 回答 9

33

您可以将外部 jar 作为参数添加到 pyspark

pyspark --jars file1.jar,file2.jar
于 2015-02-12T22:24:08.113 回答
31

您可以在运行时使用 Spark 配置添加 jar 文件的路径。

这是一个例子:

conf = SparkConf().set("spark.jars", "/path-to-jar/spark-streaming-kafka-0-8-assembly_2.11-2.2.1.jar")

sc = SparkContext( conf=conf)

有关详细信息,请参阅文档

于 2018-03-28T07:00:12.727 回答
14

您可以--jars xxx.jar在使用 spark-submit 时添加

./bin/spark-submit --jars xxx.jar your_spark_script.py

或设置环境变量SPARK_CLASSPATH

SPARK_CLASSPATH='/path/xxx.jar:/path/xx2.jar' your_spark_script.py

your_spark_script.py由 pyspark API 编写

于 2015-09-17T05:53:46.717 回答
7

以上所有答案都对我不起作用

我对 pyspark 所做的是

pyspark --py-files /path/to/jar/xxxx.jar

对于 Jupyter 笔记本:

spark = (SparkSession
    .builder
    .appName("Spark_Test")
    .master('yarn-client')
    .config("spark.sql.warehouse.dir", "/user/hive/warehouse")
    .config("spark.executor.cores", "4")
    .config("spark.executor.instances", "2")
    .config("spark.sql.shuffle.partitions","8")
    .enableHiveSupport()
    .getOrCreate())

# Do this 

spark.sparkContext.addPyFile("/path/to/jar/xxxx.jar")

链接到我找到它的来源: https ://github.com/graphframes/graphframes/issues/104

于 2019-04-26T20:41:59.377 回答
5
  1. 解压下载的jar文件。
  2. 编辑系统环境变量
    • 添加一个名为SPARK_CLASSPATH的变量并将其值设置为 \path\to\the\extracted\jar\file。

例如:您已将 C 盘中名为 sparkts 的文件夹中的 jar 文件提取出来,其值应为:C:\sparkts

  1. 重新启动集群
于 2016-12-10T22:45:57.677 回答
4

除了接受的答案外,您还有以下选择:

  1. 如果您在虚拟环境中,则可以将其放置在

    例如lib/python3.7/site-packages/pyspark/jars

  2. 如果您希望 java 发现它,那么您可以将 jre 的安装位置放在ext/目录下

于 2020-05-19T16:33:45.737 回答
3

您可以做的另一件事是将 Jar 添加到安装 pyspark 的 pyspark jar 文件夹中。通常 /python3.6/site-packages/pyspark/jars

如果你使用的是虚拟环境,jar 需要转到虚拟环境中的 pyspark 安装时要小心。

这样您就可以使用 jar 而无需在命令行中发送它或将其加载到您的代码中。

于 2018-07-26T10:55:54.603 回答
1

我通过将 jar 放入目录驱动程序然后在 conf 文件夹中创建 spark-defaults.conf 文件来解决此问题。要遵循的步骤;

To get the conf path:  
cd ${SPARK_HOME}/conf

vi spark-defaults.conf  
spark.driver.extraClassPath /Users/xxx/Documents/spark_project/drivers/*

运行你的 Jupyter 笔记本。

于 2019-12-15T12:09:16.787 回答
0

来自 pyspark 的 java/scala 库在 2.4.0--jarsspark.jars更早版本中都不起作用(我没有检查较新版本)。我很惊讶有多少人声称它有效。

主要问题是对于通过以下方式检索的类加载器:

jvm = SparkSession.builder.getOrCreate()._jvm
clazz = jvm.my.scala.class
# or
clazz = jvm.java.lang.Class.forName('my.scala.class')

它仅在您将 jar 文件复制到 ${SPARK_HOME}/jars 时才有效(这个适用于我)。

但是,当您唯一的方法是使用--jars或使用spark.jars了另一个在当前线程中设置的类加载器(即子类加载器)时。所以你的python代码需要看起来像:

clazz = jvm.java.lang.Thread.currentThread().getContextClassLoader().loadClass(f"{object_name}$")

希望它能解释你的烦恼。如果没有,请大声喊叫。

于 2020-07-30T14:27:13.753 回答