2017-08-10 71 views
0

我调试一个Spark工作,但不知何故,一个星火API调用内部任何事情都是从控制台/日志hidding,这里是我的代码:无法打印/火花API日志消息

public static JavaRDD<SolrInputDocument> join(
     JavaPairRDD<ImmutableBytesWritable, Result> hBaseRdd, 
     List<NuggetsField> fields) { 
     System.out.println("In join method...."); 
     logger.error("In join method.... logger.error"); 

     JavaRDD<ProductJoin> pjs = hBaseRdd.map(tuple -> { 
      System.out.println("in map API ....."); 
      logger.error("in map API.... logger.error"); 
      /**do some transformation*/ 
     }); 

     System.out.println("got ProductJoin RDD....."); 
     System.out.println("pjs.count() = " + pjs.count()); 
     return pjs; 
    } 

In join method....In join method.... logger.error并且got ProductJoin RDD.....pjs.count() =总是可以打印出来。

然而,in map API .....in map API.... logger.error从不显示。

这是为什么? 另外,pjs.count()的值不是0.

有人可以帮我吗?

谢谢!

+0

您能查看使用'纱日志-applicationId application_id'。 –

+0

我以前试过,但是我得到了'-bash:yarn:command not found',:(: – FisherCoder

+0

好的,我能够这样做,但是仍然在这个纱线日志中,仍然没有记录任何东西,可能会出错? – FisherCoder

回答

1

这里的关键是JVM运行打印行,因为这是它将出现的日志。 在你的情况下,因为除了驱动程序之外你正在纱线上运行,你可以看到驱动程序的打印输出,但没有在执行程序上运行的任何代码(如地图)。 该输出进入相应的纱线容器stderr文件。

如果您想在调试时看到任何打印语句,最简单的事情就是以本地模式运行。

关于pjs.count(),映射操作使得1到1的转换,它不能删除元素。您需要稍后应用过滤器来删除空值。

+0

谢谢,我发现他们在执行者的stderr日志。 – FisherCoder

0

根据你的代码时加入执行方法无论在方法中提到的系统输出消息将在驾驶员上打印从您所提交的火花提交作业。但是如果是pjs这是一个RDD,并且只有在调用动作时才会被评估,在这里调用pjs.count(),这将在执行器一侧评估。因此,无论您在转换中提到的Sysout消息都将在Executor端打印出来。要访问这些日志,您需要通过纱线日志-applicationId application_id来访问YARN容器日志,因为来自执行者的日志将被聚合在容器中。正如我看到你没有找到yarn命令那么请在你的CLASSPATH中添加“$ YARN_HOME/bin”并尝试命令。

请使用以下链接: - https://spark.apache.org/docs/latest/running-on-yarn.html

科:调试应用程序