研究了会,终于知道原因了。 控制台输出的是driver的内容,包括构造DAG,提交作业,调度,分发tasks等等,因为代码执行经过textFile(), map(), flatMap()这些函数的时候都是在构造DAG,所以会在控制台中输出,而且driver本身没有stderr和stdout文件,所以只能在控制台输出。 每个executor自身的log都会输出到stderr中,所以当task运行后,RDD中compute()函数的log会记录在stderr中。 anyway,这个log system可以改进下 |
nextuser 发表于 2016-12-20 15:21 即使同样是使用println来记录log,不同的位置代码也会输出在不同位置。不过我已经知道原因了。 |
bingoogle 发表于 2016-12-20 09:56 system.out.println() 与 logger.info("This is info message."); 源码中可能存在上面两种情况。 只是举例,也就是说输出方式是多种的。 |
nextuser 发表于 2016-12-20 09:09 为什么有些地方log4j控制不了?而且,即使在同一个package下的两个.scala文件,一个的loginfo只在stderr输出,另一个的loginfo只输出在控制台 |
两种可能: 第一种可能相信楼主已经猜到了,就是源码造成的。 源码中,可能有的不是log4j,而是直接输出。所以会造成控制台和日志文件不一致。 第二种 就是楼主的修改的源码可能位置不对或则没有生效调用到或则说调用的其它函数。可能处于底层。 从上面楼主的描述来看,修改源码是有效果的。所以根本原因,还是源码造成的。有些地方可能是log4j控制不到的。 |