在Hadoop中输入采样器

时间:2013-06-03 04:49:25

标签: hadoop hadoop-partitioning

我对InputSampler的理解是它从记录阅读器获取数据并采样密钥,然后在HDFS中创建分区文件。

我对此采样器的查询很少: 1)此抽样任务是否为地图任务? 2)我的数据在HDFS上(分布在我的集群的节点上)。此采样器是否会在具有要采样数据的节点上运行? 3)这会消耗我的地图插槽吗? 4)样本是否与我的MR工作的地图任务同时运行?我想通过减少插槽数来知道是否会影响映射器消耗的时间?

2 个答案:

答案 0 :(得分:5)

我发现InputSampler做了一个严重缺陷的假设,因此不是很有帮助。

这个想法是它从mapper输入中对键值进行采样,然后使用生成的统计信息对mapper输出进行均匀分区。那么假设是映射器输入和输出的密钥类型和值分布是相同的。根据我的经验,映射器几乎从不向读取器发送相同的键值类型。因此InputSampler是无用的。

在为了有效分区而必须进行采样的几次中,我最终将采样作为映射器的一部分(因为我才知道正在生成哪些键)并将结果写入映射器中对目录的close()方法(每个映射器的一组统计信息)。然后,我的分区程序必须在第一次调用时执行延迟初始化以读取映射器编写的文件,将统计信息同化为一些有用的结构,然后相应地对后续密钥进行分区。

您唯一真正的选择是猜测开发时间如何分配关键值并将该假设硬编码到您的分区器中。

不是很干净,但这是我能想到的最好的。

答案 1 :(得分:3)

很久以前就提出了这个问题,很多问题都没有得到答复。

@Chris唯一和最多投票的答案并没有真正回答问题,但提供了一个有趣的观点,虽然我认为有点过于悲观和误导,所以我也在这里讨论它。

原始问题的答案

采样任务在InputSampler.writePartitionFile(job, sampler)的调用中完成。对此方法的调用是阻塞,在此期间完成采样,在同一个线程中。

这就是您不需要致电job.waitForCompletion()的原因。它不是MapReduce作业,它只是在您客户的流程中运行。此外,MapReduce作业至少需要20秒才能启动,但是对一个小文件进行采样只需要几秒钟。

因此,您所有问题的答案都只是"否"。

阅读代码

的更多细节

如果您查看writePartitionFile()的代码,您会发现它会调用sampler.getSample(),他会调用inputformat.getSplits()来获取所有输入分割列表作为样本。

然后将按顺序读取这些输入格式以提取样本。每个输入拆分由在同一方法中创建的新记录读取器读取。这意味着您的客户正在进行阅读和抽样。

您的其他节点未运行任何" map"或者其他过程,它们只是为HDFS提供客户端所需的块数据,用于采样所需的输入分割。

在Map输入和输出之间使用不同的键类型

现在,讨论克里斯给出的答案。我同意InputSampler和TotalOrderPartitioner在某些方面可能存在缺陷,因为它们真的不容易理解和使用......但是他们 强加关键类型地图输入和输出之间相同。

InputSampler使用作业的InputFormat(及其RecordReader)键创建包含所有采样键的分区文件。然后,在Mapper进程结束时的分区阶段,TotalOrderPartitioner将使用此文件来创建分区。

最简单的解决方案是为InputSampler创建一个自定义RecordReader,它与Mapper 执行相同的键转换

为了说明这一点,我们假设您的数据集包含(char,int)对,并且您的映射器通过获取字符的ascii值将它们转换为(int,int)。例如' a'变成了97.

如果您要对此作业执行总订单分区,您的InputSampler会对字母' a'''' c'进行采样。然后在分区阶段,您的映射器输出键将是整数值,如102或107,这不能与' a',' g'或者' t'从分区文件进行分区分发。这是不一致的,这就是为什么当使用相同的InputFormat进行采样和mapreduce工作时,假设输入和输出键类型是相同的原因。

所以解决方案是编写一个自定义的InputFormat及其RecordReader,仅用于采样客户端作业,该作业读取输入文件并在返回之前执行从charint的相同转换每条记录。这样,InputSampler将直接将自定义记录阅读器中的整数ascii值写入分区文件,该分区文件保持相同的分布,并且可以与映射器的输出一起使用。

在几行文字说明文章中并不容易理解,但是任何有兴趣全面了解InputSampler和TotalOrderPartitioner如何工作的人都应该查看此页面:http://blog.ditullio.fr/2016/01/04/hadoop-basics-total-order-sorting-mapreduce/

它详细解释了如何在不同情况下使用它们。