我非常喜欢hadoop,任何人都可以给我一个关于如何在hadoop map / reduce中跳过不良记录的简单程序吗?
先谢谢
答案 0 :(得分:2)
由于您是根据字段缺失过滤记录,因此这是适合Mapper实现的逻辑。 Java API Mapper看起来像这样:
public class FilteringMapper extends Mapper<LongWritable, Text, LongWritable, Text>{
private static final Logger _logger = Logger.getLogger(FilteringMapper.class);
protected void map(LongWritable key, Text value, Context context) {
if(recordIsBad(value))
_logger.info(<log record data you care about>);
else
context.write(key, value);
}
private boolean recordIsBad(Text record){
//return true if record is bad by your standards
}
}
此Mapper只会根据您的标准进行过滤。如果您需要在Mapper中进一步转换数据,则可以轻松添加。
答案 1 :(得分:1)
答案 2 :(得分:1)
处理损坏记录的最佳方法是在mapper或reducer中 码。您可以检测到错误记录并忽略它,或者您可以中止 通过抛出异常来完成工作。您还可以计算总数 在使用计数器的工作中的不良记录,看看有多广泛 问题是。但在极少数情况下,您无法解决问题 因为第三方库中存在一个您无法工作的错误 在你的mapper或reducer中。在这些情况下,您可以使用Hadoop 可选跳过模式,用于自动跳过不良记录。什么时候 启用跳过模式,任务报告正在处理的记录 回到tasktracker。任务失败时,tasktracker将重试 任务,跳过导致失败的记录。因为 额外的网络流量和簿记,以维持失败的记录 范围,仅在任务失败后为任务打开跳过模式 两次。
因此,对于一个始终在错误记录上失败的任务,tasktracker 使用以下结果运行以下任务尝试:
任务失败。
任务失败。
启用了跳过模式。任务失败,但是失败的记录由tasktracker存储。
- 醇>
仍然启用了跳过模式。任务通过跳过上次尝试失败的错误记录而成功。
默认情况下,跳过模式已关闭;你为地图独立启用它 并使用
SkipBadRecords
类减少任务。这很重要 请注意,跳过模式每个任务只能检测到一个错误记录 尝试,所以这种机制仅适用于检测 偶尔会出现不良记录(比如每个任务)。你可能需要增加 最大任务尝试次数(通过mapred.map.max.attempts
和mapred.reduce.max.attempts
)给予跳过模式足够的尝试 检测并跳过输入拆分中的所有错误记录。不好的记录 已被Hadoop检测到的序列文件保存在_logs/skip
子目录下的作业输出目录。这些可以 在工作完成后进行检查以进行诊断 (例如,使用hadoop fs -text
。
来自&#34; Hadoop的文字:权威指南&#34;汤姆怀特
答案 3 :(得分:0)
您可以通过将属性mapreduce.map.skip.maxrecords
和/或mapreduce.reduce.skip.maxgroups
设置为值> 0(默认为0)来跳过MapReduce作业中的记录。
这是一个简单的命令,您可以使用Hadoop streaming在Shell上运行以启动将忽略1000个映射器的MapReduce作业:
mapred streaming \
-D mapreduce.map.skip.maxrecords=1000 \
-file map.sh \
-file reduce.sh \
-input myInputDir \
-output myOutputDir \
-mapper map.sh \
-reducer reduce.sh
(其中map.sh
和reduce.sh
是可执行的bash脚本)。
Hadoop提供了一个选项,其中某些不良输入记录集可以 在处理地图输入时被跳过。应用程序可以控制此 通过SkipBadRecords类。
当地图任务确定性崩溃时,可以使用此功能 某些输入。这通常是由于map函数中的错误引起的。 通常,用户必须修复这些错误。但是,这不是 有时可能。该错误可能在第三方库中, 例如,其源代码不可用。在这种情况下 即使多次尝试,任务也永远不会成功完成, 而工作失败。使用此功能,仅一小部分数据 不良记录的丢失,这对于某些人来说可以接受 应用程序(那些执行非常大的统计分析 数据)。
您可以在mapred-default.xml
中看到与跳过记录有关的所有属性。
另一个相关属性是mapreduce.task.skip.start.attempts
:MR任务开始跳过记录之前的失败尝试次数(默认为2)。