Ошибка при запуске задания Spark из Django API с использованием подпроцесса.Всплывающее окно
Я создал исполняемый файл проекта Django, и мне нужно запустить задание Spark из конечной точки API в этом исполняемом файле. Я использую subprocess.Открываю, чтобы выполнить команду spark-submit, но при выполнении команды я сталкиваюсь с ошибкой.
Вот команда, которую я пытаюсь запустить:
/opt/spark-3.5.5-bin-hadoop3/bin/spark-submit --master local --deploy-mode client --conf "spark.ui.enabled=false" --conf "spark.ui.showConsoleProgress=false" --conf "spark.dynamicAllocation.enabled=false" --conf "spark.rdd.compress=false" --conf "spark.driver.memory=4g" --conf "spark.executor.memory=8g" --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" /Users/user1/Project/process-engine/route.py > /app/server/EAP/rasLite/engine/raslight/spark_submit_log/20250424/772_1.0_174702842893.log 2>&1 "{'processNo': '772', 'versionNo': '1.0', 'jsonData': '', 'executionDate': '', 'skipError': 'N', 'generated_executionid': '149897', 'isExecutionIdGenerated': 'True', 'executionId': '149897', 'isPreProcess': 'False'}" &
Однако в журналах я получаю следующую ошибку:
Unknown command: 'C:/Users/user1/Project/process-engine/route.py'
Type 'ras.exe help' for usage.
Контекст:
- Я запускаю эту команду из конечной точки API Django в исполняемом файле проекта Django.
- Путь к route.py кажется правильным, но в сообщении об ошибке указан путь в стиле Windows (C:/Users/...) вместо пути в стиле Unix, который я использую (/Users/...).
- Я использую следующий код для выполнения команды:
command = f'/Users/user1/Project/process-engine/spark-3.5.5-bin-hadoop3/bin/spark-submit --master local --deploy-mode client --conf "spark.ui.enabled=false" --conf "spark.ui.showConsoleProgress=false" --conf "spark.dynamicAllocation.enabled=false" --conf "spark.rdd.compress=false" --conf "spark.driver.memory=4g" --conf "spark.executor.memory=8g" --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" /Users/user1/Project/process-engine/route.py > {finalFilePath} 2>&1'
final_command = command + " " + '\"' + raw_body_decoded1 + '\"' + " " + "&"
# Set the environment variables for the subprocess
env = os.environ.copy()
env['DJANGO_SETTINGS_MODULE'] = 'rasLightEngine.settings'
env['SPARK_HOME'] = 'C:/Users/user1/Project/process-engine/spark-3.5.5-bin-hadoop3'
subprocess.Popen(f'{final_command}', shell=True, env=env)
Я попытался настроить переменную окружения для SPARK_HOME, но она по-прежнему выдает ту же ошибку.
Похоже, что ваш код на django имеет свою собственную логику, которая неверно интерпретируется. Попробуйте выполнить следующее
# 1. Make sure paths are consistent with your OS
# For Windows:
spark_home = 'C:/Users/user1/Project/process-engine/spark-3.5.5-bin-hadoop3'
route_path = 'C:/Users/user1/Project/process-engine/route.py'
# For Unix/Linux/Mac:
# spark_home = '/Users/user1/Project/process-engine/spark-3.5.5-bin-hadoop3'
# route_path = '/Users/user1/Project/process-engine/route.py'
# 2. Use os.path.join for paths to ensure compatibility
spark_submit = os.path.join(spark_home, 'bin', 'spark-submit')
# 3. Build the command with proper quoting
command = [
spark_submit,
"--master", "local",
"--deploy-mode", "client",
"--conf", "spark.ui.enabled=false",
"--conf", "spark.ui.showConsoleProgress=false",
"--conf", "spark.dynamicAllocation.enabled=false",
"--conf", "spark.rdd.compress=false",
"--conf", "spark.driver.memory=4g",
"--conf", "spark.executor.memory=8g",
"--conf", "spark.serializer=org.apache.spark.serializer.KryoSerializer",
route_path
]
# 4. Set up environment
env = os.environ.copy()
env['DJANGO_SETTINGS_MODULE'] = 'rasLightEngine.settings'
env['SPARK_HOME'] = spark_home
# 5. Execute the command - using args as a list avoids shell parsing issues
process = subprocess.Popen(
command + [raw_body_decoded1],
stdout=open(finalFilePath, 'w'),
stderr=subprocess.STDOUT,
env=env
)