Я работаю над проектом с pyspark, который требует большего количества исполнителей. В настоящее время я использую этот очень удобный образ (jupyter/pyspark-notebook), который автоматически создает блокнот Jypyter с pyspark. Это действительно легко использовать.
Моя проблема в том, что этот образ создает только одного исполнителя - память для хранения всего 434,4 МБ.
Есть ли способ создать больше исполнителей для этого образа докера?
Я нашел в Интернете много docker-compose, которые создают больше исполнителей, но они как бы делают все с нуля. Я думаю, что делать все с нуля выглядит как переутомление, поскольку этот образ прекрасно работает, но я открыт для этого, если нет быстрого обходного пути.
Это мой файл для создания докеров:
jupyter:
container_name: jupyter_pyspark
build: .
ports:
- "8888:8888"
- "4040:4040"
- "4041:4041"
environment:
- JUPYTER_ENABLE_LAB=yes
volumes:
- ./work:/home/jovyan/work
hostname: localhost
command: "start-notebook.sh --NotebookApp.token='' --NotebookApp.password=''"
А это мой Dockerfile:
FROM jupyter/pyspark-notebook
# Change to root user to install java 8
USER root
# Install requirements
# COPY requirements.txt ./
# RUN pip3 install -r requirements.txt
# RUN rm -rf requirements.txt
EXPOSE 8088 8042 4040
USER $NB_UID
OBS: я пытался изменить переменные конфигурации, но безуспешно. Я думаю, мне придется создать больше приложений в docker-compose, но я не знаю, как подключить их к этому образу.
from pyspark.sql import SparkSession
import pyspark.sql.functions as f
from pyspark.sql.types import *
spark = SparkSession \
.builder \
.config(conf=sparkConf) \
.master("local[*]") \
.appName("appYou") \
.getOrCreate()
Поскольку вы работаете с master local[*]
, вы запускаете только одну JVM, которая будет содержать функции драйвера и исполнителя. Это означает, что понятие драйвера/исполнителя в данном случае несколько расплывчато. Вы не сможете запустить несколько экзекьюторов: все будет происходить внутри одного драйвера.
Но вы все еще можете увеличить свою память! Чтобы увеличить его память, вам нужно изменить параметры конфигурации spark.driver.memory
.
Вы можете сделать это несколькими способами, как описано в этом ответе SO.
Кстати, @Koedlt, я думаю, что конфигурация («spark.driver.memory») должна идти до определения SparkSession. Я получил ошибку из-за этого. Просто добавьте это перед conf: conf = SparkConf()
и conf.set("spark.driver.memory", '4g')
Аааа да это действительно так! Некоторые конфигурации нельзя изменить после запуска сеанса Spark. Я отредактирую свой ответ :) Спасибо, что сообщили мне!
Чтобы ответить на ваш вопрос о 4 г памяти против 2 г каждый: это будет зависеть от вашего случая, но если у вас одинаковое общее количество ядер, у вас будет меньше накладных расходов на связь с меньшим количеством исполнителей. Если вы работаете на одной машине (то есть не в физических кластерах), я бы просто рекомендовал использовать мастер local[*]
, и тогда все находится внутри 1 JVM (опять же, меньше затрат на связь).
Очень красивое объяснение. Спасибо. Кстати, есть ли разница в использовании спарка с 4г памяти против спарка с двумя рабочими по 2г? Просто чтобы лучше понять, стоит ли мне попробовать один из форматов искр, которые я нашел у рабочих. Я узнал, что разделение работы с рабочими ускоряет работу. Но я не уверен, предполагается ли использовать эту концепцию только с несколькими машинами или разделение локальной памяти на несколько рабочих облегчит задачу.