我正在调试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。

有人能帮助我吗?

谢谢!

最佳答案

此处的关键是JVM运行打印行的原因,因为这是它将在其中显示的日志。
在您的情况下,由于您是在驱动程序之外的 yarn 上运行,因此您可以看到驱动程序的打印输出,但看不到在执行程序上运行的任何代码(如映射)。
该输出将进入相应的 yarn 容器stderr文件。

如果要在调试时看到任何打印语句,最简单的方法是在本地模式下运行。

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

关于hadoop - 无法在Spark API中打印/记录消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45603835/

10-10 01:04
查看更多