You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure新手求助:如何在Databricks Notebook单元格中运行Jar包?

在Databricks Notebook里调用Jar文件的实用方法

先说明白:Databricks里不能直接照搬本地那套subprocess的写法,因为Notebook运行在集群节点上,得适配集群的环境。下面给你几种可行的方案,按需选:

方案一:用%sh魔法命令直接跑Shell命令

这是最直接的方式,Databricks Notebook支持用%sh开头的魔法命令,直接在集群节点上执行Shell命令,和你本地终端操作逻辑一致。

  • 先确认Jar文件的集群可访问路径:如果是上传到Workspace的库,Jar一般存在/dbfs/FileStore/jars/xxx.jar(你可以在库的详情页复制这个路径);如果是存在ADLS这类存储,得先挂载集群,用挂载后的路径。
  • 直接在单元格里写命令:
java -jar /dbfs/FileStore/jars/your_jar_file.jar javaClass configFile=/dbfs/FileStore/params/params.properties aParam1=True aParam2=Field1,Field2,Field3 aParam3=output.csv

要是需要动态拼接命令,用Python生成字符串再传给Shell也可以:

# 动态定义参数
jar_path = "/dbfs/FileStore/jars/your_jar_file.jar"
main_class = "javaClass"
config_file = "/dbfs/FileStore/params/params.properties"
a_param1 = "True"
a_param2 = "Field1,Field2,Field3"
a_param3 = "output.csv"

# 拼接成完整命令
command = f"java -jar {jar_path} {main_class} configFile={config_file} aParam1={a_param1} aParam2={a_param2} aParam3={a_param3}"

# 用%sh执行,把Python变量传给Shell
%sh $command

方案二:修改Python的subprocess函数适配集群

不是不能用subprocess,但得改几点:

  • 集群里的Java路径可能和本地不一样,别直接写java,先跑%sh which java查绝对路径(比如/usr/bin/java)
  • Jar、配置文件的路径必须是集群能访问的,比如/dbfs开头的路径(DBFS是集群共享存储,不能用本地的C:\路径)
  • 修改你的函数适配:
import subprocess
from datetime import datetime

def date_format_str():
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

def java_run_command(command):
    try:
        print(f'尝试执行命令:{command}')
        # 集群里别用shell=True,容易出权限问题,把命令拆成列表更稳妥
        cmd_list = command.split()
        result = subprocess.run(cmd_list, capture_output=True, text=True, check=True)
        output = result.stdout
        error = result.stderr
        if error:
            print(f"{date_format_str()} - 发现错误:\n{error}")
        print(f"{date_format_str()} - 命令执行成功:\n{output}")
    except subprocess.CalledProcessError as e:
        print(f"{date_format_str()} - 执行Java命令出错:\n{e}")
        print(f"错误输出:{e.stderr}")

# 调用示例
jar_path = "/dbfs/FileStore/jars/your_jar_file.jar"
main_class = "javaClass"
config_file = "/dbfs/FileStore/params/params.properties"
command = f"/usr/bin/java -jar {jar_path} {main_class} configFile={config_file} aParam1=True aParam2=Field1,Field2,Field3 aParam3=output.csv"
java_run_command(command)

方案三:用spark-submit(如果Jar是Spark应用)

要是你的Jar是Spark应用,更推荐用Spark自带的spark-submit,能适配Databricks的集群资源调度:

spark-submit --class javaClass /dbfs/FileStore/jars/your_jar_file.jar configFile=/dbfs/FileStore/params/params.properties aParam1=True aParam2=Field1,Field2,Field3 aParam3=output.csv

或者用上面修改后的subprocess函数调用:

command = "spark-submit --class javaClass /dbfs/FileStore/jars/your_jar_file.jar configFile=/dbfs/FileStore/params/params.properties aParam1=True aParam2=Field1,Field2,Field3 aParam3=output.csv"
java_run_command(command)

关键注意点

  • 所有文件(Jar、配置、输出)都得放在集群能访问的路径:比如DBFS、挂载的ADLS,绝对不能用本地Windows的C:\路径
  • 确保集群节点装了Java:Databricks默认集群都有,自定义集群的话要检查下
  • 如果Jar依赖其他库,得把依赖也上传到集群库,或者在命令里指定classpath

内容的提问来源于stack exchange,提问作者diguex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:25:19