Убийство искры Apache из веб-интерфейса не убивает его подпроцесс Python - PullRequest
0 голосов
/ 20 сентября 2018

код pyspark, написанный для вызова другого задания python с использованием subprocess.Popen (команда)

Попытка вручную уничтожить Sparkcontext из веб-интерфейса Spark Master http://localhost:8080, и он успешно убил

к тому времени, когда подпроцесс python запущен и работает на рабочем узле как процесс python.

Использование Redhatlinux

Как убить подпроцесс python, если я уничтожу pyspark sparkcontext?

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Ниже у меня работает код

from subprocess import Popen, PIPE, CalledProcessError
from contextlib import contextmanager
from pyspark import SparkContext
from pyspark import SparkConf
import sys, os, subprocess, signal, time

@contextmanager
def spark_manager():
    conf = SparkConf().setAppName("TEST-SPARK")
    conf.set("spark.scheduler.mode", "FAIR")
    sc = SparkContext(conf=conf)

    try:
        yield sc
    finally:
        sc.stop()

with spark_manager() as context:
    process = subprocess.Popen(['python3', 'test.py'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    # Poll process for new output until finished
    while True:
        if context._jsc.sc().isStopped():
            print(process.pid)
            time.sleep(1.0)
            os.kill(process.pid, signal.SIGKILL)
            break
        nextline = process.stdout.readline()
        if nextline == '' and process.poll() is not None:
            break
        sys.stdout.write(nextline)
        sys.stdout.flush()

    output = process.communicate()[0]
    exitCode = process.returncode

    if (exitCode == 0):
        print(output)
    else:
        raise ProcessException(command, exitCode, output)
0 голосов
/ 20 сентября 2018

В общем, довольно сложно надежно уничтожить подпроцесс, потому что подпроцесс может выполнять бесперебойный код, когда вы хотите уничтожить его.Это, как говорится, похоже, что подход "изо всех сил" может быть подходящим для вашего случая.Вы захотите создать и ждать своего подпроцесса таким образом, чтобы можно было выполнить очистку, если процесс будет прерван.Самый простой способ сделать это - поместить ваш подпроцесс в блок try / finally.

try:
    print("starting subprocess")
    x = subprocess.Popen(["sleep", "100000"])
    x.wait()
finally:
    print("stopping subprocess")
    x.terminate()

Я полагаю, что искра посылает сигнал прерывания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...