我使用 docker-compose 構建了一個集群,其中一個服務是 Jupyter Lab,另一個是 Apache Spark。這是我的 docker-compose.yaml。
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 Lab 并使用以下代碼連接到我的 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 技術的新手,我不明白出了什么問題。提前致謝。
uj5u.com熱心網友回復:
TL;DR:我更新了我的 docker-compose 檔案,現在它可以找到我的檔案了。我也改變了閱讀的路徑。下面是新的 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-lab 用戶的 root 訪問權限,以便他/她可以執行任何需要的更改。
- 在 jupyter-lab 容器中設定 Spark_Master 環境變數,以確保它可以到達 spark master 容器。
- 為所有容器添加了一個公共網路,以確保它們之間的通信。
為了完成,我使用絕對路徑來讀取我的檔案,如下所示:
file = 'file:////home/jovyan/work/adult.csv'
df = spark.read.csv(file, sep=',', header=True, inferSchema=True, encoding='ISO-8859-1')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453290.html
