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