我使用docker compose构建了一个集群,其中一个服务是Jupyter Lab,另一个服务则是Apache Spark。这是我的码头组合
version: '3'
services:
jupyter-base-notebook:
image: docker.io/jupyter/pyspark-notebook
ports:
- 8888:8888
volumes:
- ./data:/home/jovyan/work
spark:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=master
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
ports:
- '8080:8080'
spark-worker:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://spark:7077
- SPARK_WORKER_MEMORY=4G
- SPARK_WORKER_CORES=1
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
我想服务还可以。我在浏览器中打开了Jupyter实验室,并使用以下代码连接到我的apache spark:
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, when, regexp_replace
import os
spark = SparkSession.builder.master('spark://2833c5f3ee45:7077').getOrCreate()
我的连接成功,如下消息所示:
SparkSession - in-memory
SparkContext
Spark UI
Version
v3.2.1
Master
spark://2833c5f3ee45:7077
AppName
pyspark-shell
然而,当我试图在我安装的卷中加载任何文件时,我会得到以下错误:
df = spark.read.csv('adult.csv', sep=',', header=True, inferSchema=True, encoding='ISO-8859-1')
File file:/home/jovyan/work/adult.csv does not exist
问题是当我在那里测试我的路径和文件时。。。没关系:
print(os.getcwd()) # /home/jovyan/work
print(os.listdir()) # ['.ipynb_checkpoints', 'Python_AP.ipynb', 'Datasets', 'adult.csv']
我错过了什么?我对docker技术相对来说是个新手,我不知道出了什么问题。提前谢谢。
TL;DR:我更新了我的docker撰写文件,现在它可以找到我的文件了。我也改变了阅读的方式。下面是新的docker-compose.yaml和解释。
version: '3'
services:
jupyter-base-notebook:
image: docker.io/jupyter/pyspark-notebook
ports:
- 8888:8888
volumes:
- ./data:/home/jovyan/work:rw
networks:
- spark-network
user: root
environment:
- GRANT_SUDO=yes
- JUPYTER_TOKEN=tad
- SPARK_MASTER=spark://spark:7077
spark:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=master
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
ports:
- '8080:8080'
networks:
- spark-network
volumes:
- ./data:/home/jovyan/work:rw
spark-worker:
image: docker.io/bitnami/spark:3
environment:
- SPARK_MODE=worker
- SPARK_MASTER_URL=spark://spark:7077
- SPARK_WORKER_MEMORY=4G
- SPARK_WORKER_CORES=1
- SPARK_RPC_AUTHENTICATION_ENABLED=no
- SPARK_RPC_ENCRYPTION_ENABLED=no
- SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
- SPARK_SSL_ENABLED=no
networks:
- spark-network
volumes:
- ./data:/home/jovyan/work:rw
networks:
spark-network:
driver: bridge
以下是所做的改进:
- 与所有容器共享卷,并确保有读写选项
- 授予jupyter实验室用户root访问权限,以便他/她可以执行任何需要的更改
- 在jupyter实验室容器中设置Spark_Master环境变量,以确保它可以到达Spark主容器
- 为所有容器添加了一个公共网络,以确保它们之间的通信
为了完成,我使用绝对路径读取我的文件,如下所示:
file = 'file:////home/jovyan/work/adult.csv'
df = spark.read.csv(file, sep=',', header=True, inferSchema=True, encoding='ISO-8859-1')