从 Dataproc 上的 MapReducer 映射器记录日志

Logging from a MapReducer mapper on Dataproc

我正在尝试退出我的映射器作业,运行 在 Dataproc 上。

按照建议 ,我简单地定义了一个 log4j 记录器并向其提供了信息:

import org.apache.log4j.Logger;

public class SampleMapper extends Mapper<LongWritable, Text, Text, Text> {
private Logger logger = Logger.getLogger(SampleMapper.class);

@Override
protected void setup(Context context) {
    logger.info("Initializing NoSQL Connection.")
    try {
        // logic for connecting to NoSQL - ommitted
    } catch (Exception ex) {
        logger.error(ex.getMessage());
    }
}

@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    // mapper code ommitted
}

}

但是我在任何地方都找不到任何日志,不是通过 Dataproc 用户界面,不是通过在主服务器上调用 yarn logs,甚至是登录到工作实例并在各种合理的地方搜索时也找不到。

我是否缺少任何可以使其正常工作的配置?

从哪里读取默认的 log4j 配置?如何聚合它?

说明日志放在每个worker中的/tmp,建议配置一些yarn属性使用GCS bucket。尽管您可以收集它们,但它们不会显示在 Stackdriver 中,为此您可能需要使用 google-cloud-logging 库将您的自定义消息发送到 Stackdriver,例如:

import com.google.cloud.logging.Logging;
import com.google.cloud.logging.LoggingOptions;

LoggingOptions options = LoggingOptions.getDefaultInstance();
try(Logging logging = options.getService()) {
  // use logging here
}

关于 Stackdriver 方法,您可以找到更多信息 here

我很惊讶这没有记录在案,但 Stackdriver 日志记录中提供了来自所有 YARN 容器的日志。在 Cloud Console 中,转到 Stackdriver -> Logging -> Logs,在 Cloud Dataproc Cluster -> cluster name -> cluster uuid 下查找您的集群。然后,select yarn-userlogs,其中包括来自所有容器的日志。您可以按应用程序或容器 ID(它们是 json 有效负载中的字段)进行过滤。

如果您希望 YARN 在集群上为您收集日志,请考虑设置 YARN 日志聚合 ()。