【问题标题】:Apache Spark Stderr and StdoutApache Spark 标准错误和标准输出
【发布时间】:2014-08-25 15:40:10
【问题描述】:

我通过连接到具有一个主设备和两个从设备的 spark 独立集群来运行 spark-1.0.0。我通过 Spark-submit 运行 wordcount.py,实际上它从 HDFS 读取数据并将结果写入 HDFS。到目前为止一切都很好,结果将正确写入 HDFS。但让我担心的是,当我为每个工人检查标准输出时,它是空的,我不知道它是否应该是空的?我在标准错误中得到了关注:

Some(app-20140704174955-0002) 的 stderr 日志页面

Spark 
Executor Command: "java" "-cp" "::
/usr/local/spark-1.0.0/conf:
/usr/local/spark-1.0.0
/assembly/target/scala-2.10/spark-assembly-1.0.0-hadoop1.2.1.jar:/usr/local/hadoop/conf" "
-XX:MaxPermSize=128m" "-Xms512M" "-Xmx512M" "org.apache.spark.executor.CoarseGrainedExecutorBackend
" "akka.tcp://spark@master:54477/user/CoarseGrainedScheduler" "0" "slave2" "1
" "akka.tcp://sparkWorker@slave2:41483/user/Worker" "app-20140704174955-0002"
========================================


14/07/04 17:50:14 ERROR CoarseGrainedExecutorBackend: 
Driver Disassociated [akka.tcp://sparkExecutor@slave2:33758] -> 
[akka.tcp://spark@master:54477] disassociated! Shutting down.

【问题讨论】:

  • 没关系。您的驱动程序已完成其工作(字数统计)并断开连接。
  • Stdout呢,它是空的,有意义吗?

标签: apache-spark


【解决方案1】:

Spark 总是将所有内容,甚至 INFO 写入 stderr。人们似乎这样做是为了停止标准输出缓冲消息并导致不可预测的日志记录。当已知应用程序永远不会在 bash 脚本中使用时,这是一种可接受的做法,这对于日志记录尤其常见。

【讨论】:

  • 谢谢您的回复--我还有一个问题是关于ReduceBykey的。其实我想知道使用这种方法会涉及多少从节点?这是否取决于我们设置为 reduce 任务参数的 reducer 的数量?
  • 如果您的分区数量多于核心总数,则将使用所有节点。建议每个核心至少有 2-4 个分区。如果你的数据已经被分割成合适的数量,则无需将此参数传递给 reduceByKey 方法。
  • @samthebest - 你是说所有 Spark 输出都到 stderr 吗?我在我的 spark 映射函数中做了一个简单的“print()”,当我查看从机的日志文件时,在 work/app-/0/ 下,我看到了 stderr 中的打印输出,但没有看到 stdout。我的标准输出是空的。我觉得这很奇怪——如果 stdout 总是空的,那么它有什么意义?
【解决方案2】:

在传递给 Spark 的 log4j.properties 中试试这个(或修改 Spark/conf 下的默认配置)

# Log to stdout and stderr
log4j.rootLogger=INFO, stdout, stderr

# Send TRACE - INFO level to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold=TRACE
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.filter.filter1=org.apache.log4j.varia.LevelRangeFilter
log4j.appender.stdout.filter.filter1.levelMin=TRACE
log4j.appender.stdout.filter.filter1.levelMax=INFO
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Send WARN or higher to stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.Threshold=WARN
log4j.appender.stderr.Target  =System.err
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

# Change this to set Spark log level
log4j.logger.org.apache.spark=WARN
log4j.logger.org.apache.spark.util=ERROR

此外,在 INFO 级别显示的进度条会发送到 stderr。

用

禁用
spark.ui.showConsoleProgress=false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多