记录MapReduce作业的标准做法
我正在尝试找到登录MapReduce作业的最佳方法。 我在我的其他Java应用程序中使用slf4j和log4j appender,但由于MapReduce作业在集群中以分布式方式运行,我不知道应该在哪里设置日志文件位置,因为它是一个访问受限的共享集群特权。
是否有任何标准做法用于登录MapReduce作业,因此您可以在作业完成后轻松查看群集中的日志?
您可以使用log4j,它是hadoop使用的默认日志记录框架。 因此,从MapReduce应用程序中,您可以执行以下操作:
import org.apache.log4j.Logger; // other imports omitted public class SampleMapper extends Mapper { 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 } }
此示例代码将使用log4j logger将事件记录到inheritance的Mapper记录器。 所有日志事件都将记录到各自的任务日志中。 您可以从JobTracker(MRv1)/ ResourceManager(MRv2)网页访问任务日志。
如果您使用的是yarn ,则可以使用以下命令从命令行访问应用程序日志:
yarn logs -applicationId
如果您使用mapreduce v1 ,则命令行没有单点访问; 因此,您必须登录每个TaskTracker并查看配置的路径,一般在${hadoop.log.dir}/userlogs
中指定的/var/log/hadoop/userlogs/attempt_
包含log4j输出。
要添加到@Ashrith的答案:您可以通过JobTracker GUI查看各个任务跟踪器日志。 JT Gui可以看到正在运行的任务尝试,您可以单击以下任何一项:stderr,stdout和系统日志。 您可以在系统日志中找到log4j输出。
- Hadoop Basics的MapReduce程序中的java.lang.NoClassDefFoundError
- 将对象副本传递给hadoop中所有映射器的最佳实践
- 如何在Hadoop 3.0中进行CopyMerge?
- 执行中出现Hadoop错误:键入map中的键不匹配:期望org.apache.hadoop.io.Text,收到org.apache.hadoop.io.LongWritable
- Hive启动 – 终端初始化失败; 回到没有支持
- 使用ArrayWritable的序列化似乎以一种有趣的方式工作
- Hadoop映射器和reducer输出不匹配
- 在Loop之后,全局变量的值不会改变
- OpenCV库加载了hadoop但没有工作