【问题标题】:How to reduce the verbosity of Spark's runtime output?如何减少 Spark 运行时输出的冗长?
【发布时间】:2015-03-27 04:26:29
【问题描述】:

如何减少 Spark 运行时产生的跟踪信息量?

默认的太冗长了,

如何关闭它,并在需要时打开它。

谢谢

详细模式

scala> val la = sc.parallelize(List(12,4,5,3,4,4,6,781))
scala> la.collect
15/01/28 09:57:24 INFO SparkContext: Starting job: collect at <console>:15
15/01/28 09:57:24 INFO DAGScheduler: Got job 3 (collect at <console>:15) with 1 output 
...
15/01/28 09:57:24 INFO Executor: Running task 0.0 in stage 3.0 (TID 3)
15/01/28 09:57:24 INFO Executor: Finished task 0.0 in stage 3.0 (TID 3). 626 bytes result sent to driver
15/01/28 09:57:24 INFO DAGScheduler: Stage 3 (collect at <console>:15) finished in 0.002 s
15/01/28 09:57:24 INFO DAGScheduler: Job 3 finished: collect at <console>:15, took 0.020061 s
res5: Array[Int] = Array(12, 4, 5, 3, 4, 4, 6, 781)

静音模式(预期)

scala> val la = sc.parallelize(List(12,4,5,3,4,4,6,781))
scala> la.collect
res5: Array[Int] = Array(12, 4, 5, 3, 4, 4, 6, 781)

【问题讨论】:

  • 打印的不是 scala REPL,而是 Spark 运行时。所以你需要考虑控制 Spark 输出的选项。
  • 我认为这个问题与 Spark 和 spark 使用的记录器有关,而不是与 Scala 有关。所以 spark 使用 log4j 进行登录,可以在 "SPARK_HOME/conf/log4j.properties.template" 中配置。更改与您想要的控制台相对应的设置。更具体地说,将第一行更改为 "log4j.rootCategory=ERROR, console"。

标签: scala apache-spark


【解决方案1】:

引自“Learning Spark”一书。

您可能会发现在 shell 中打印的日志记录语句 分散注意力。您可以控制日志记录的详细程度。去做这个, 您可以在 conf 目录中创建一个名为 log4j.properties 的文件。 Spark 开发人员已经为这个文件包含了一个模板,名为 log4j.properties.template。要使日志记录不那么冗长,请创建一个 conf/log4j.properties.template 的副本称为 conf/log4j.properties 并找到以下行:

log4j.rootCategory=INFO, console

然后 降低日志级别,以便我们只显示 WARN 消息及以上 将其更改为以下内容:

log4j.rootCategory=WARN, console

什么时候 你重新打开 shell,你应该会看到更少的输出。

【讨论】:

    【解决方案2】:

    火花 1.4.1

    sc.setLogLevel("WARN")
    

    来自源代码中的 cmets:

    有效的日志级别包括:ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARN

    Spark 2.x - 2.3.1

    sparkSession.sparkContext().setLogLevel("WARN")

    火花 2.3.2

    sparkSession.sparkContext.setLogLevel("WARN")

    【讨论】:

    • 在 1.6.1 中效果很好!我无法让 Spark 从我的 $SPARK_HOME/conf 目录中读取属性,但我更喜欢在运行时设置属性 - 尽管在 SparkContext 初始化期间您仍然会收到 INFO,但从那时起就是您设置它的方式。非常适合协作以拥有相同的配置。
    • sc 变量是什么?
    • @Moebius 那将是您的 SparkContext 实例
    • 在 Spark 2.x 中需要设置 sparkSession.sparkContext().setLogLevel("WARN")
    【解决方案3】:

    Spark 应用级别的日志记录配置

    使用这种方法无需更改集群中的代码即可用于 spark 应用程序。

    • 让我们从 log4j.properties.template 创建一个新文件 log4j.properties。
    • 然后使用log4j.rootCategory 属性更改详细程度。
    • 说,我们需要检查给定 jar 的 ERROR,log4j.rootCategory=ERROR, console

    Spark 提交命令是

    spark-submit \
        ... #Other spark props goes here    
        --files prop/file/location \
        --conf 'spark.executor.extraJavaOptions=-Dlog4j.configuration=prop/file/location' \
        --conf 'spark.driver.extraJavaOptions=-Dlog4j.configuration=prop/file/location' \
        jar/location \
        [application arguments] 
    

    现在您只会看到属于 ERROR 分类的日志。


    普通的 Log4j 方式 wo Spark(但需要更改代码)

    为包org 和akka 设置日志记录OFF

    import org.apache.log4j.{Level, Logger}
    
    Logger.getLogger("org").setLevel(Level.ERROR)
    Logger.getLogger("akka").setLevel(Level.ERROR)
    

    【讨论】:

      【解决方案4】:

      如果您从 shell 调用命令,则a lot you can do 无需更改任何配置。这是设计使然。

      以下是几个使用管道的 Unix 示例,但您可以在其他环境中使用类似的过滤器。

      完全静默日志(风险自负)

      将标准错误传递给/dev/null,即:

      run-example org.apache.spark.examples.streaming.NetworkWordCount localhost 9999 2&gt; /dev/null

      忽略INFO 消息

      run-example org.apache.spark.examples.streaming.NetworkWordCount localhost 9999 | awk '{if ($3 != "INFO") print $0}'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2016-06-10
        相关资源
        最近更新 更多