【问题标题】:Spark doesnt print outputs on the console within the map functionSpark不会在地图功能内的控制台上打印输出
【发布时间】:2017-01-12 10:33:46
【问题描述】:

我有一个在集群模式下运行的简单 Spark 应用程序。

val funcGSSNFilterHeader = (x: String) => {
    println(!x.contains("servedMSISDN")   
    !x.contains("servedMSISDN")
}

val ssc = new StreamingContext(sc, Seconds(batchIntervalSeconds))
val ggsnFileLines = ssc.fileStream[LongWritable, Text, TextInputFormat]("C:\\Users\\Mbazarganigilani\\Documents\\RA\\GGSN\\Files1", filterF, false)
val ggsnArrays = ggsnFileLines
    .map(x => x._2.toString()).filter(x => funcGSSNFilterHeader(x))

ggsnArrays.foreachRDD(s => {println(x.toString()})

出于调试目的,我需要在 map 函数中打印 !x.contains("servedMSISDN") ,但这不会在控制台上打印

【问题讨论】:

  • 在本地模式下运行非常适合这种调试。当您打印其他内容时发生了什么,例如地图函数内部和地图函数外部的“hello”?
  • 我想在集群模式下打印它们..
  • 您在“本地模式”下是否设法在地图功能内打印?
  • 当你处于集群模式时,打印到控制台将在节点中完成,所以你不会在驱动程序的控制台中看到它
  • 如何在集群模式下在驱动程序控制台上打印它们...

标签: scala apache-spark spark-streaming


【解决方案1】:

您的代码包含驱动程序(主/主)和执行程序(在集群模式的节点上运行)。

在“地图”内运行的函数在执行器上运行

即当您处于集群模式时,在 map 函数中执行 print 将导致打印到节点控制台(您不会看到)。

为了调试程序,您可以:

  1. 在“本地”模式下运行代码,当执行程序在同一台机器上运行时,“map 函数”中的打印将打印到“主/主节点”的控制台

  2. 将“打印到控制台”替换为保存到文件/保存到弹性/等


请注意,除了 localcluster 模式之外 - 您的代码中似乎有错字:

ggsnArrays.foreachRDD(s => {println(x.toString()})

应该是:

ggsnArrays.foreachRDD(s => {println(x.toString)})

【讨论】:

    【解决方案2】:

    两种可能: 您的日志位于工作节点上,因此您必须检查工作日志以获取这些日志消息。如前所述,您可以在本地模式下运行您的应用程序来检查您机器上的日志。顺便说一句,使用 SLF4j 比使用 println 更好,但我认为它只是用于学习:)

    在 sn-p 中没有 ssc.start()ssc.awaitTermination()。您是否运行了这些命令?如果没有,foreachRDD 将不会被执行。如果示例没问题,请在脚本末尾添加这些行并重试,但请检查工作节点日志:)

    【讨论】:

      【解决方案3】:

      Yaron 已经向您解释过,您看不到打印语句的输出,因为它不是在您的驱动程序中执行,而是在工作节点上执行。

      除了他的回答说明,您还可以访问 SparkUISpark History Server。 在那里,您可以在 Executors 选项卡中直观地查看哪些执行程序在哪个节点上运行。正如您在屏幕截图中看到的那样,您将可以访问stdoutstderr(如果您的集群配置正确)并查看那里写的内容。

      【讨论】:

        猜你喜欢
        • 2016-10-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 2014-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多