Что такое Spark Job?
Я уже сделал установку с помощью spark и выполнил несколько тестовых сценариев, настраивая главный и рабочий узлы. Тем не менее, у меня очень жирная путаница в том, что именно означает работа в контексте Spark (не SparkContext). У меня есть ниже вопросы
- Насколько отличается работа от программы водителя.
- Само приложение является частью программы Driver?
- Подать искру в пути это работа?
Я прочитал документацию Spark, но мне все еще не ясно, что это.
Тем не менее, моя реализация состоит в том, чтобы написать искровые задания {программно}, которые были бы для spark-submit.
Пожалуйста, помогите с некоторыми примерами, если это возможно. Это было бы очень полезно.
Примечание: Пожалуйста, не публикуйте ссылки, потому что я уже пробовал. Хотя вопросы звучат наивно, но все же мне нужно больше ясности в понимании.
2 ответа
Ну, терминология всегда может быть сложной, поскольку она зависит от контекста. Во многих случаях вы можете быть использованы для "отправки задания в кластер", что для spark будет представлять программу драйвера.
Тем не менее, у Spark есть собственное определение "работа", прямо из глоссария:
Задание Параллельное вычисление, состоящее из нескольких задач, которые создаются в ответ на действие Spark (например, сохранение, сбор); Вы увидите этот термин в журналах водителя.
Итак, в этом контексте, скажем, вам нужно сделать следующее:
- Загрузите файл с именами и адресами людей в RDD1
- Загрузите файл с именами людей и телефонами в RDD2
- Соедините RDD1 и RDD2 по имени, чтобы получить RDD3
- Карта на RDD3, чтобы получить красивую HTML-презентацию для каждого человека, как RDD4
- Сохраните RDD4 в файл.
- Карта RDD1 для извлечения почтовых индексов из адресов, чтобы получить RDD5
- Объединитесь на RDD5, чтобы подсчитать, сколько людей живет на каждый почтовый индекс как RDD6
- Соберите RDD6 и напечатайте эту статистику на стандартный вывод.
Так,
- Программа драйвера - это весь кусок кода, выполняющий все 8 шагов.
- Создание всей HTML-карты, установленной на шаге 5, является задачей (ясно, потому что мы используем действие сохранения, а не преобразование). То же самое с собирать на шаге 8
- Другие этапы будут организованы по этапам, причем каждая работа будет являться результатом последовательности этапов. Для простых вещей работа может иметь один этап, но необходимость перераспределения данных (например, объединение на шаге 3) или что-либо, что нарушает локальность данных, обычно вызывает появление дополнительных этапов. Вы можете думать о этапах как о вычислениях, которые дают промежуточные результаты, которые на самом деле могут быть сохранены. Например, мы можем сохранить RDD1, поскольку будем использовать его более одного раза, избегая повторного вычисления.
- Все 3 выше в основном говорят о том, как логика данного алгоритма будет нарушена. Напротив, задача - это определенный фрагмент данных, который будет проходить определенный этап на данном исполнителе.
Надеюсь, это прояснит ситуацию;-)
Эй, вот что я делал раньше, надеюсь, это работает для вас:
#!/bin/bash
# Hadoop and Server Variables
HADOOP="hadoop fs"
HDFS_HOME="hdfs://ha-edge-group/user/max"
LOCAL_HOME="/home/max"
# Cluster Variables
DRIVER_MEM="10G"
EXECUTOR_MEM="10G"
CORES="5"
EXECUTORS="15"
# Script Arguments
SCRIPT="availability_report.py" # Arg[0]
APPNAME="Availability Report" # arg[1]
DAY=`date -d yesterday +%Y%m%d`
for HOUR in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23
do
#local directory to getmerge to
LOCAL_OUTFILE="$LOCAL_HOME/availability_report/data/$DAY/$HOUR.txt"
# Script arguments
HDFS_SOURCE="webhdfs://1.2.3.4:0000/data/lbs_ndc/raw_$DAY'_'$HOUR" # arg[2]
HDFS_CELLS="webhdfs://1.2.3.4:0000/data/cells/CELLID_$DAY.txt" # arg[3]
HDFS_OUT_DIR="$HDFS_HOME/availability/$DAY/$HOUR" # arg[4]
spark-submit \
--master yarn-cluster \
--driver-memory $DRIVER_MEM \
--executor-memory $EXECUTOR_MEM \
--executor-cores $CORES \
--num-executors $EXECUTORS \
--conf spark.scheduler.mode=FAIR \
$SCRIPT $APPNAME $HDFS_SOURCE $HDFS_CELLS $HDFS_OUT_DIR
$HADOOP -getmerge $HDFS_OUT_DIR $LOCAL_OUTFILE
done