如何阻止PySpark使用内存会话并连接WSL本地Spark集群?
本地Spark+Jupyter Notebook连接问题解决方案
环境背景
目标是搭建模拟Azure Synapse Analytics的本地开发沙箱:
- WSL(Ubuntu)部署Spark 3.3.0
- Windows端Anaconda Jupyter Notebook作为开发工具
- 需对接Azure Data Lake Storage Gen2
问题核心
Spark与Notebook单独运行正常,但Notebook无法连接WSL中的Spark集群:
- 测试代码创建的SparkSession显示
master local[1] - Spark UI指向
http://host.docker.internal:4040/jobs/ - WSL端Spark UI无任何连接记录
解决步骤
1. 区分本地模式与集群模式
你当前代码使用的master("local[1]")是本地单机模式,会在Notebook进程内启动Spark,而非连接WSL中的独立Spark集群。若要连接WSL的集群,需:
- 在WSL中启动独立Spark集群:
$SPARK_HOME/sbin/start-master.sh $SPARK_HOME/sbin/start-worker.sh spark://<WSL_IP>:7077 - 修改SparkSession的master参数为WSL集群地址:
from pyspark.sql import SparkSession spark = SparkSession \ .builder \ .master("spark://192.168.x.x:7077") # 替换为你的WSL实际IP(可通过WSL内`hostname -I`获取) .appName("Python Spark SQL basic example") \ .getOrCreate()
2. 配置跨环境的Spark环境变量
Windows端Anaconda环境需正确指向WSL中的Spark:
- 安装
findspark库简化配置:conda install findspark - 在Notebook中初始化Spark环境:
import findspark # 替换为WSL中Spark的实际安装路径 findspark.init("/home/your-user/spark-3.3.0-bin-hadoop3") - 或直接在Windows系统环境变量中添加:
SPARK_HOME: 指向WSL中Spark的路径(例如\\wsl$\Ubuntu\home\your-user\spark-3.3.0-bin-hadoop3)PYSPARK_PYTHON: 指向Windows端Anaconda的Python路径(例如C:\Users\your-user\anaconda3\python.exe)
3. 修复网络与端口问题
- 端口开放: 在Windows防火墙中开放7077(Spark Master)、4040(Spark UI)、8080(Spark Master UI)端口
- Spark UI地址修正: 在WSL的
spark-env.sh(位于$SPARK_HOME/conf)中添加:
重启Spark集群后,UI地址会指向WSL的实际IP,而非export SPARK_LOCAL_IP=$(hostname -I | awk '{print $1}') export SPARK_MASTER_HOST=$(hostname -I | awk '{print $1}')host.docker.internal
4. 验证连接
- 在WSL中访问
http://<WSL_IP>:8080,查看Worker节点状态 - 在Notebook中执行
spark.sparkContext.master,确认输出为spark://<WSL_IP>:7077 - 运行简单Spark任务(如读取本地文件),检查WSL的Spark UI是否显示Job记录
额外:对接Azure Data Lake Storage Gen2
连接ADLS Gen2需在SparkSession中添加相关配置:
spark = SparkSession \ .builder \ .master("spark://<WSL_IP>:7077") \ .appName("ADLS Gen2 Test") \ .config("fs.azure.account.auth.type.<storage-account-name>.dfs.core.windows.net", "OAuth") \ .config("fs.azure.account.oauth.provider.type.<storage-account-name>.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider") \ .config("fs.azure.account.oauth2.client.id.<storage-account-name>.dfs.core.windows.net", "<client-id>") \ .config("fs.azure.account.oauth2.client.secret.<storage-account-name>.dfs.core.windows.net", "<client-secret>") \ .config("fs.azure.account.oauth2.client.endpoint.<storage-account-name>.dfs.core.windows.net", "https://login.microsoftonline.com/<tenant-id>/oauth2/token") \ .getOrCreate() # 测试读取ADLS Gen2文件 df = spark.read.csv("abfss://<container-name>@<storage-account-name>.dfs.core.windows.net/path/to/file.csv") df.show()
内容的提问来源于stack exchange,提问作者Andreas Sundström
相关产品推荐
相关产品推荐

