Azure HDInsight中Jupyter PySpark Notebook导入Git克隆模块失败求助
解决HDInsight Jupyter PySpark Notebook中Git克隆模块无法导入的问题
这个问题我之前在HDInsight环境里也碰到过,核心原因是Jupyter里的%%sh和PySpark单元格运行在完全隔离的环境里:%%sh是跑在集群的边缘节点本地文件系统,而PySpark的Python代码是跑在Spark的Driver/Executor节点上,两边的本地文件系统根本不共享,所以你克隆到~/code的内容PySpark完全看不到。下面给你几个可行的解决方法:
方案1:克隆到集群的分布式存储(最推荐)
HDInsight集群默认会把Azure存储(ADLS Gen2/WASB)挂载到所有节点的本地路径(比如/mnt/hdinsight),所有节点都能访问这个路径下的内容。你只需要把仓库克隆到这个分布式挂载路径即可:
步骤1:修改%%sh单元格克隆到分布式存储
%%sh # 创建分布式存储下的目录(如果不存在) mkdir -p /mnt/hdinsight/code cd /mnt/hdinsight/code # 克隆仓库到这个路径 git clone https://path-to-my-repo/MyRepo
步骤2:在PySpark单元格中导入模块
现在所有Spark节点都能访问这个路径,直接添加到sys.path即可:
import sys # 添加分布式存储下的仓库路径 sys.path.append('/mnt/hdinsight/code/MyRepo') import mymodule
方案2:在PySpark单元格中直接克隆并分发模块
如果你的Driver节点能访问外网,可以直接在PySpark单元格里用subprocess执行Git克隆,同时把模块打包分发到所有Executor节点(确保分布式任务也能使用):
import subprocess import sys from pyspark import SparkContext # 克隆仓库到Driver的临时目录 subprocess.run(["git", "clone", "https://path-to-my-repo/MyRepo", "/tmp/MyRepo"], check=True) # 添加Driver本地路径到sys.path sys.path.append("/tmp/MyRepo") # 把仓库打包成zip,分发给所有Executor节点 subprocess.run(["zip", "-r", "/tmp/MyRepo.zip", "/tmp/MyRepo"], check=True) sc.addPyFile("/tmp/MyRepo.zip") # 现在可以正常导入模块 import mymodule
方案3:集群创建时通过Bootstrap脚本预克隆仓库(长期使用)
如果这个模块是集群长期需要的,可以在创建HDInsight集群时,使用Bootstrap脚本自动在所有节点的本地路径克隆仓库。脚本示例如下:
#!/bin/bash mkdir -p /usr/local/mycode cd /usr/local/mycode git clone https://path-to-my-repo/MyRepo
创建集群时指定这个脚本,之后所有节点都会有这个仓库,你只需要在PySpark单元格里添加sys.path.append('/usr/local/mycode/MyRepo')即可导入。
排查小技巧
可以在PySpark单元格里用!直接执行shell命令,快速验证文件是否存在:
# 查看分布式存储下的文件 !ls /mnt/hdinsight/code # 查看Driver本地临时目录的文件 !ls /tmp
内容的提问来源于stack exchange,提问作者David Taub
相关产品推荐
相关产品推荐

