Отправьте и повторно запустите пакетное приложение Spark

Биг датаBeginner
Практиковаться сейчас

Введение

Полезное пакетное приложение должно запускаться из сохранённой программы с явными входами и выходами, а не зависеть от DataFrame или временного представления прежнего сеанса. Вы отправите подготовленную программу ежедневных продаж отдельными процессами и проверите сохранённые результаты и свидетельства выполнения.

spark-submit — средство запуска приложений Spark. Вы зададите ему master выполнения, программу Python и её входные и выходные аргументы. Скрипт намеренно позволяет внешней настройке master управлять выполнением. Логика отчёта повторяет изученные типизированное чтение, фильтр paid, десятичную сумму и группировку; разбор аргументов предоставлен, чтобы вы сосредоточились на отправке и безопасном повторе.

Независимая работа предоставляет две корректные порции CSV и полную программу. Вы изучите журналы и коды завершения, измените входной путь и отличите отсутствующий вход от конфликта существующего выхода. Удалённый кластер, упаковка, планировщик, Hive и состояние прежнего процесса не нужны. Используйте терминал.

Отправьте подготовленную программу с явными аргументами

На этом шаге вы обработаете первую порцию отдельным приложением. Изучите источник и предоставленную программу:

cd /home/labex/project
cat /home/labex/project/data/orders.csv
cat /home/labex/project/sales_batch.py

Разборщик уже принимает input_path, output_path и необязательный --overwrite. Реализовывать argparse не нужно. Первый позиционный путь всегда входной, второй — выходной. Построитель SparkSession не вызывает master, поэтому выполнением управляет настройка --master средства запуска.

Прочитайте команду слева направо: параметры spark-submit предшествуют имени Python-файла; аргументы после имени передаются приложению. Заключите local[2] в кавычки, чтобы оболочка воспринимала скобки буквально. > сохраняет обычный вывод, а 2>&1 отправляет поток ошибок в тот же журнал:

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/orders.csv /home/labex/project/output/run-1 > /home/labex/project/output/run-1-job.log 2>&1

Сразу сохраните код завершения перед выполнением любой другой команды терминала. $? — код предыдущей команды: ноль означает успех, ненулевое значение — ошибку. printf записывает значение и перенос строки в локальный файл статуса:

printf '%s\n' "$?" > /home/labex/project/output/run-1-exit-status.txt
cat /home/labex/project/output/run-1-exit-status.txt

Ожидается 0. Прочитайте конец журнала драйвера:

tail -n 30 /home/labex/project/output/run-1-job.log

Найдите Master: local[2], настоящий ID приложения, выбранные входной и выходной пути и даты отчёта. ID различается. Отчёт должен показывать 14 октября / 2 / 45.00 и 15 октября / 2 / 80.00. Нулевой код вместе с правильным фактическим Parquet убедительнее одной обнадёживающей строки журнала.

Программа создаёт и останавливает собственный сеанс. Она не использовала представления или переменные Python предыдущего занятия.

Измените вход в новом процессе

На этом шаге вы докажете, что программа выводит результат из переданного пути. Изучите вторую порцию:

cat /home/labex/project/data/new-orders.csv

В ней два оплаченных заказа за 16 октября с суммами 30.00 и 25.00 и один pending. Предположите одну строку отчёта: количество 2 и выручка 55.00. Сохраните первый результат и отправьте новый файл в отдельное назначение:

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/new-orders.csv /home/labex/project/output/run-2 > /home/labex/project/output/run-2-job.log 2>&1
printf '%s\n' "$?" > /home/labex/project/output/run-2-exit-status.txt
cat /home/labex/project/output/run-2-exit-status.txt
tail -n 30 /home/labex/project/output/run-2-job.log

Ожидаются код 0 и предсказанный результат за 16 октября. Настоящий ID приложения отличается от первого процесса. Программа загрузила новый путь и создала собственный сеанс; оставшееся представление не потребовалось.

run-1 и run-2 остаются доступными, позволяя изучить связь каждого входа и результата. Не меняйте исходный файл лишь ради появления запомненного ответа.

Раздельно найдите отсутствующий вход и существующий выход

На этом шаге вы сохраните два разных сбоя путей без удаления данных. Сначала отправьте несуществующий вход. Следующая команда должна завершиться ошибкой.

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/missing-orders.csv /home/labex/project/output/unused-missing-input > /home/labex/project/output/missing-input.log 2>&1

Сразу сохраните код перед просмотром журнала:

printf '%s\n' "$?" > /home/labex/project/output/missing-input-exit-status.txt
cat /home/labex/project/output/missing-input-exit-status.txt
tail -n 25 /home/labex/project/output/missing-input.log

Ожидаются ненулевой код и диагностика отсутствующего пути с именем missing-orders.csv. Исправление входного пути решает проблему; изменение master или пересоздание кластера — нет.

Стандартный режим errorifexists скрипта также защищает существующее назначение. Попробуйте известный вход с уже завершённым путём run-1. Следующая команда должна завершиться ошибкой.

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/orders.csv /home/labex/project/output/run-1 > /home/labex/project/output/existing-output.log 2>&1
printf '%s\n' "$?" > /home/labex/project/output/existing-output-exit-status.txt
cat /home/labex/project/output/existing-output-exit-status.txt
tail -n 25 /home/labex/project/output/existing-output.log

Ожидаются ненулевой код и диагностика уже существующего выхода. Это отличается от отсутствующего входа, а успешный прежний отчёт должен остаться нетронутым.

Исправьте проблему с приоритетом сохранения: используйте правильный источник и новый выходной каталог:

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/orders.csv /home/labex/project/output/run-3 > /home/labex/project/output/run-3-job.log 2>&1
printf '%s\n' "$?" > /home/labex/project/output/run-3-exit-status.txt
cat /home/labex/project/output/run-3-exit-status.txt
tail -n 25 /home/labex/project/output/run-3-job.log

Ожидаются успех и первоначальные два ежедневных итога. Новое назначение сохраняет обе прежние порции и свидетельства сбоев без удаления исходных файлов и целых деревьев результатов.

Явно перестройте нужный производный снимок

На этом шаге вы осознанно выберете замену известного полного снимка. Необязательный аргумент --overwrite уже реализован: он меняет только режим записи назначения этой программы на overwrite. Он не меняет вход, другие результаты и внешний master Spark.

Используйте его, когда намерены перестроить весь указанный производный результат из того же источника. Здесь run-1 — такой известный снимок; другие запуски и исходные данные остаются отдельно:

spark-submit --master 'local[2]' /home/labex/project/sales_batch.py /home/labex/project/data/orders.csv /home/labex/project/output/run-1 --overwrite > /home/labex/project/output/overwrite-job.log 2>&1
printf '%s\n' "$?" > /home/labex/project/output/overwrite-exit-status.txt
cat /home/labex/project/output/overwrite-exit-status.txt
tail -n 30 /home/labex/project/output/overwrite-job.log

Ожидаются код 0, Write mode: overwrite и те же две строки отчёта. Новый процесс заменяет снимок вместо добавления дубликатов дат. Его ID приложения отличается от первого запуска, а журнал имеет собственное имя файла.

Вы отработали два допустимых ответа на существующий выход: выбрать новый путь, когда важно сохранить обе версии, или явно перестроить известный производный снимок, когда нужна замена. Ошибкам входного пути всё равно нужен правильный вход; overwrite не исправляет отсутствующие данные. Эти привычки отправки и повтора готовят к итоговому заданию повторно используемого конвейера продаж.

Итоги

Вы запустили приложение Spark с параметрами в независимых процессах, сохранили фактические коды и журналы и проверили результаты разных входов. Вы отличили отсутствующий вход от конфликта существующего выхода и выбрали новое назначение или явную замену снимка. Итоговое задание объединит отправку с очисткой, обогащением, агрегацией и выходными разделами.