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
相关产品推荐
相关产品推荐

