【发布时间】: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