Spark集群:如何在每个工作节点上打印RDD的内容

4

我刚开始学习Apache Spark,想知道为什么以下代码对我无效。

我正在运行Spark 2.1,并启动了一个Master和一个Worker(非本地)。这是我的代码:

object SimpleApp {
    def main(args: Array[String]) {
    val file = [FILELOCATION]
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val textFile = sc.textFile(file)   
    val counts = textFile.flatMap(line => line.split(" "))
                         .map(word => (word.toLowerCase.toCharArray.toList.sorted.mkString, 1))
                         .reduceByKey(_ + _)

    counts.map(println)
    counts.foreach(println)

    val countCollect = counts.collect()

    sc.stop()    
    }
}

我似乎无法让工作节点在标准输出中打印出其内容。即使我将主节点和工作节点设置为本地,似乎也不起作用。
这里我是否理解错了什么?

你是通过IDE还是spark-submit来运行作业的? - Ramesh Maharjan
我正在通过 spark-submit 运行它。 - xkor
你有检查执行器的日志吗? - banjara
你可以尝试使用countCollect.map(println)吗?如果可以的话,请告诉我。 - code
我已经尝试过这个,但在工作进程的 shell 上没有任何输出。 - xkor
3个回答

0
如果你想在执行器中打印一些内容,普通的println就可以了。这将会在执行器的标准输出中打印输出结果。

我能够通过[counts.collect().foreach(println)]收集RDD并打印收集的内容,但我假设这是在驱动程序端完成的。我遇到的问题是如何在执行程序端打印RDD的分布式内容。我希望能够看到文档是如何在工作节点之间分割的,并详细了解该过程。 - xkor

0

您可以在浏览器中查看每个工作进程的状态、应用程序状态stderr、stdout以及许多其他内容,只需在localhost:8080上查看[主机机器]。单击worker-Id,您可以查看日志(stdout、stderr)。如果您想查看实际分布和状态,则可以单击正在运行的应用程序,在其中单击Application Detailed UI链接,它将显示您的应用程序的完整详细信息。

如果您只想查看worker UI,则可以通过在worker系统中键入localhost:8081来查看。


我进入了localhost:8080并尝试查看stdout上打印的内容,但是它是空的。 - xkor

0
每当您提交一个Spark作业时,Spark作业的任务(指令)会从驱动程序传输到执行器。驱动程序可以在您当前登录的同一节点上运行(本地和YARN客户端),也可以在另一个节点上运行(应用程序主节点)。
所有操作都会将结果返回给驱动程序,因此,如果您已登录到驱动程序运行的计算机上,则可以看到输出。但是,您无法在执行器节点上看到输出,因为任何打印语句都将打印在相应机器的控制台上。您只需执行sc.textFile(),它将把所有分区分别保存到目录中。通过这种方式,您可以查看每个分区中的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接