【问题标题】:How can I prevent java libraries from polluting STDOUT如何防止 java 库污染 STDOUT
【发布时间】:2019-05-20 15:07:05
【问题描述】:

我正在编写一个使用 pyspark 进行一些计算的 python 3.6 程序。我正在编写它,以便它可以像正常的 UNIX 程序一样运行,接受来自 STDIN 的输入并将输出发送到 STDOUT。

Java 不支持,语言默认是在日志严重性足够高的情况下退出 STDOUT。 pyspark 对此并不陌生。

在导入任何 py4j 库之前,我是否需要手动弄乱我的文件描述符,或者是否有某种方法可以从 Python 端破坏 java 端,以便所有日志记录都转到 STDERR?

我期望工作但没有工作的一个 kludge 基本上是this

import contextlib
import sys

@contextlib.contextmanager
def impolite_library_wrapper():
    real_out = sys.stdout
    sys.stdout = sys.stderr
    yield
    sys.stdout = real_out

with impolite_library_wrapper():
    import pyspark.sql
    spark_builder = pyspark.sql.SparkSession.builder.enableHiveSupport()
    spark = spark_builder.getOrCreate()

print("pls")

...我可以在这样的最小环境中运行:

$ bash
$ mkdir /tmp/pls
$ cd /tmp/pls
$ pipenv install pyspark==2.3
$ env -i "PATH=$PATH" pipenv run python wtf.py 2>/dev/null
2019-05-20 17:10:54 WARN  Utils:66 - Your hostname, <redacted> resolves to a loopback address...
2019-05-20 17:10:54 WARN  Utils:66 - Set SPARK_LOCAL_IP if you need to bind to another address
2019-05-20 17:10:55 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
pls

我希望这会输出 pls 并且只输出 pls

我看到这将由 pyspark 在 Spark 3.0 中使用SPARK-21094 专门解决;我可以接受特定于 pyspark 的答案,但我目前的目标是 Spark 2.3。

【问题讨论】:

    标签: python-3.x pyspark py4j


    【解决方案1】:

    我讨厌这一切,但它似乎正在发挥作用:

    import contextlib
    import sys
    import subprocess
    
    class StderrOnlyPopen(subprocess.Popen):
        def __init__(self, args, bufsize=-1, executable=None,
                     stdin=None, stdout=sys.stderr, *more, **kwmore):
            super().__init__(args, bufsize, executable,
                             stdin, stdout, *more, **kwmore)
    
    @contextlib.contextmanager
    def impolite_library_wrapper():
        real_Popen = subprocess.Popen
        subprocess.Popen = StderrOnlyPopen
        yield
        subprocess.Popen = real_Popen
    
    with impolite_library_wrapper():
        import pyspark.sql
    
    spark_builder = pyspark.sql.SparkSession.builder.enableHiveSupport()
    spark = spark_builder.getOrCreate()
    

    【讨论】:

    • 人们认为做 Perl 几年对你没有好处
    猜你喜欢
    • 2014-04-09
    • 2014-05-30
    • 1970-01-01
    • 2021-01-12
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2018-11-29
    相关资源
    最近更新 更多