Hadoop实践(四)---生成集群上的监视和调试

来源:互联网 发布:linux链接网络 编辑:程序博客网 时间:2024/06/05 04:14

成功的在伪分布集群中运行作业之后,可以将实际数据放在生产集群上运行。

伪分布式和生产集群的区别:

  • 1- 伪分布模式下只有一个节点,所以的日志文件都放在单独的目录/logs中,可以在本地访问
  • 1- 在全分布集群中,每个节点都有自己的/logs目录保存其日志文件,通过特定节点上的日志文件来诊断该节点的问题
  • 2- 集群中各个守护进程的域名和地址不同,需要根据具体情况确定

1、计数器

在Hadoop作业中插桩计数器来分析其整体运作。在程序中定义不同的计数器,分别累计特定时间的发生次数。

对于来自同一个作业的所有任务的相同计数器,Hadoop会自动对它们进行求和,来反映整个作业的情况

MapReduce作业中的默认的内部计数器参考这里:传送门
《Hadoop实践(三)—MapReduce中的Counter》
http://blog.csdn.net/wee_mita/article/details/73526358

计数器的典型应用是用来追踪不同的输入记录类型,特别是跟着“坏”记录

通过Reporter.incrCounter()方法来使用计数器,Reporter对象被传递给map()和reduce()方法。以计数器名和增量为参数来调用incrCounter(),每个不同的事件都有一个独立命名的计数器。

2、跳过坏记录

在处理大数据集时,不可避免地在一些记录上会出错。Hadoop对硬件失效所采用的恢复机制无法应对由坏记录所导致的确定性软件失效。相反,它提供了一个特征,用来跳过那些被确信会导致任务崩溃的记录,如果这个特征被启用,任务在重试几次后,进入skipping模式

只要在skipping模式中,TaskTracker(Appclication Master),就会跟踪并确定哪个记录区域会导致失效,然后重启任务并跳过坏记录。

2-1、在Java中配置记录跳读

skipping特征在默认状态下是关闭的。在Java中,这个特征由SkippingBadRecords来控制,全部由静态方法组成。作业的driver类需要调用如下的方法:

  • public static void setMapperMaxSkipRecords(Configuration conf, long maxSkipRecs){}
  • public static void setReducerMaxSkipRecords(Configuration conf, long maxSkipRecs){}

分别为map和reduce任务打开记录跳读的设置

Hadoop使用分治的策略来寻找跳读的区域,每次取跳读区域中一半的任务执行,并判断这一半有没有坏记录,这个过程不断迭代,直到跳读区域的大小在可接受的范围内。这个过程相当耗时。

需要在Hadoop常规的任务回复机制中增加任务重试的最大次数来适应这些额外的重试。使用JobConf.setMaxMapAttempts()和JobConf.setMaxReducepAttempts()方法,或者设置等效的属性mapred.map.max.attempt和mapred.reduce.max.attempt

Hadoop会把跳过的记录写入HDFS以供以后分析,它们以序列文件的形式写入_log/skip目录,可以使用SkipBadRecords.setSkipOutputPath(JobConf conf,Path path)修改当前用于存放被跳过记录的目录

2-2、在Java之外配置记录跳读

在GenericOptionsParser的通用选项来设置记录跳读

与SkipBadRecords方法调用等效的JobConf属性

方法 属性 setAttemptsToStartSkipping() mapred.skip.attempts.to.start.skipping setMapperMaxSkipRecords() mapred.skip.map.max.skip.records setReducerMaxSkipRecords() mapred.skip.reduce.max.skip.records setSkipOutputPath mapred.skip.out.dir setAutoIncrMapperProcCount mapred.skip.map.auto.incr.proc.count setAutoIncrReducerProcCount mapred.skip.reduce.auto.incr.proc.count

2-3、用IsolationRunner重新运行出错的任务

Hadoop中有一个名为IsolationRunner的工具,它就像一台用于调试的时间机器 。这个工具可以隔离失败的任务,并在同一节点上用完全相同的输入重新运行它。