无法在spark api中打印/记录消息

avwztpqn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(563)

我正在调试spark作业,但不知怎么的,spark 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。
有人能帮我吗?
谢谢!
2exbekwf

2exbekwf1#

这里的关键是jvm运行打印行的内容,因为这是它将出现的日志。在您的例子中,因为您运行的是除驱动程序之外的其他程序,所以您可以看到驱动程序的打印输出,但看不到在执行器(如map)上运行的任何代码的打印输出。该输出进入相应的Yarn容器stderr文件。
如果您想在调试时看到任何print语句,最简单的方法就是在本地模式下运行。
关于pjs.count(),Map操作进行1到1的转换,不能删除元素。稍后需要应用筛选器来删除空值。

ipakzgxi

ipakzgxi2#

根据您的代码,当join方法被执行时,方法中提到的任何系统输出消息都将打印在您提交spark submit作业的驱动程序端。但是在pjs的情况下,它是一个rdd,只有在对它调用action时才会计算,在调用pjs.count()时才会执行,这将在executor端进行计算。因此,无论您在将在执行器端打印的转换中提到什么sysout消息。要访问这些日志,您需要通过yarn logs-applicationid application\u id访问yarn容器日志,因为来自执行者的日志将聚合到容器中。当我看到您没有找到yarn命令时,请将“$yarn\u home/bin”添加到您的类路径并尝试该命令。
请使用以下命令link:- httpshttp://spark.apache.org/docs/latest/running-on-yarn.html
部分:调试应用程序

相关问题