python - 波开 : redirect stderr and stdout to single stream

标签 python stream spark-submit

我已经围绕 Spark-Submit 命令创建了一个包装器,以便能够通过解析日志来生成实时事件。 目的是创建一个实时界面,显示 Spark 作业的详细进度。

所以包装器将如下所示:

  submitter = SparkSubmitter()
  submitter.submit('/path/to/spark-code.py')
  for log_event in submitter:
    if log_event:
      print('Event:', log_event)

输出将如下所示:

  Event: StartSparkContextEvent()
  Event: StartWorkEvent()
  Event: FinishWorkEvent()
  Event: StopSparkContextEvent()

在内部,SparkSubmitter 类将 Spark-submit 命令作为 subprocess.Popen 进程启动,然后在 stdout 流上进行迭代器,并通过解析该进程生成的日志来返回事件,如下所示:

  class SparkSubmitter():
    def submit(self, path):
        command = self.build_spark_submit_command(path)
      self.process = Popen(command, stdout=PIPE, stderr=PIPE)

    def __iter__(self):
        return self

    def __next__(self):
        # note: this is a IO-Blocking command
        log = self.process.stdout.readline().decode('utf-8') 
      return self.parse_log_and_return_event(log)

此实现与 Spark 独立集群配合良好。但我在 Yarn 集群上运行时遇到问题。

在 Yarn 集群中,“Spark 相关日志”位于 stderr 中,而不是 stdout 中。所以我的类无法解析 Spark 生成的日志,因为它只是尝试读取 stdout

问题1:是否可以将Popen的stdout和stderr作为单个流读取?

问题2:由于stdout和stderr都是Stream,是否可以合并这两个流并将它们作为一个读取?

问题3:是否可以将所有日志仅重定向到标准输出?

最佳答案

所有 3 个问题的答案都是肯定的,您可以使用 stderr=subprocess.STDOUT 作为 Popen 的参数来重定向 stderr< 的输出stdout:

self.process = Popen(command, stdout=PIPE, stderr=subprocess.STDOUT)

关于python - 波开 : redirect stderr and stdout to single stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55397854/

相关文章:

python - 用Python创建Windows屏幕保护程序?

ios - 通过流播放的音频出现抖动/断断续续

scala - Spark - 错误 : Failed to load class - spark-submit

python - 错误 "Unable to open Jupyter Notebook: Port 8888 is already in use"

python - 如何用 Python 回测策略

javascript - 某些方法如何知道提前进行论证?

java - Java 的平台无关/dev/null 输出接收器

java - 如何读取和计算互联网上文​​件的哈希值

google-cloud-dataproc - GCP Dataproc spark.jar.packages 问题下载依赖项

scala - Spark 提交错误 : Cannot load main class from JAR file