如何添加第三方java jar以在pyspark中使用

时间:2014-12-30 00:43:30

标签: python apache-spark py4j

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

访问它们
java_gateway.py

例如:通过java网关使python客户端可以使用客户端类(不是jdbc驱动程序!):

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

目前尚不清楚将第三方库添加到jvm类路径的位置。我试图添加到compute-classpath.sh,但这似乎没有用:我得到

 Py4jError: Trying to call a package

此外,与Hive进行比较时:hive jar文件不是通过compute-classpath.sh加载的,所以这让我很怀疑。似乎还有一些其他机制可以设置jvm side classpath。

9 个答案:

答案 0 :(得分:24)

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

pyspark --jars file1.jar,file2.jar

答案 1 :(得分:15)

您可以在运行时使用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)

有关详细信息,请参阅document

答案 2 :(得分:10)

使用spark-submit

时,您可以添加param($websiteName, $packOutput) $website = Get-AzureWebsite -Name $websiteName # get the scm url to use with MSDeploy. By default this will be the second in the array $msdeployurl = $website.EnabledHostNames[1] $publishProperties = @{'WebPublishMethod'='MSDeploy'; 'MSDeployServiceUrl'=$msdeployurl; 'DeployIisAppPath'=$website.Name; 'Username'=$website.PublishingUsername; 'Password'=$website.PublishingPassword} Write-Output "Stopping web app..." Stop-AzureWebsite -Name $websiteName Write-Output "Publishing web app..." $publishScript = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\default-publish.ps1" Write-Output "Starting web app..." Start-AzureWebsite -Name $websiteName . $publishScript -publishProperties $publishProperties -packOutput $packOutput
--jars xxx.jar

或设置环境变量./bin/spark-submit --jars xxx.jar your_spark_script.py

SPARK_CLASSPATH

SPARK_CLASSPATH='/path/xxx.jar:/path/xx2.jar' your_spark_script.py 由pyspark API编写

答案 3 :(得分:5)

  1. 提取下载的jar文件。
  2. 编辑系统环境变量
    • 添加名为 SPARK_CLASSPATH 的变量,并将其值设置为\ path \至\ extracted \ jar \ file。
  3. 例如:您已在名为sparkts的文件夹中解压缩C盘中的jar文件 它的值应该是: C:\ sparkts

    1. 重新启动您的群集

答案 4 :(得分:3)

除了可接受的答案,您还可以选择以下选项:

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

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

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

答案 5 :(得分:2)

以上所有答案均不适用于我

我与pyspark所做的是

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

对于Jupyter Notebook:

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:1)

我已通过将罐子放入目录驱动程序中,然后在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笔记本。

答案 8 :(得分:0)

pyspark的

java / scala库--jarsspark.jars在2.4.0及更低版本中均不起作用(我没有检查较新的版本)。我很惊讶有很多人声称它正在工作。

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

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

仅当您将jar文件复制到$ {SPARK_HOME} / jars时,此功能才有效(此功能对我有用)。

但是,当您唯一的方法是使用--jarsspark.jars时,将使用另一个在当前线程中设置的类加载器(即子类加载器)。因此,您的python代码应类似于:

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

希望它可以说明您的麻烦。如果没有,就给我喊。