gpt4 book ai didi

hadoop - MapReduce TotalOrderPartitioning 仅将输出写入一个文件?

转载 作者:可可西里 更新时间:2023-11-01 15:59:11 26 4
gpt4 key购买 nike

我正在运行一个 mapreduce 作业,它读取输入并使用多个 reduce 对其进行排序。我能够将输出按 reducer 的数量排序为 5。但是,输出仅写入 1 个文件,并且有 4 个空文件。我正在使用输入采样器和 totalorderpartitioner 进行全局排序。

我的驱动程序如下所示:

int numReduceTasks = 5;
Configuration conf = new Configuration();
Job job = new Job(conf, "DictionarySorter");
job.setJarByClass(SampleEMR.class);
job.setMapperClass(SortMapper.class);
job.setReducerClass(SortReducer.class);
job.setPartitionerClass(TotalOrderPartitioner.class);
job.setNumReduceTasks(numReduceTasks);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

job.setOutputKeyClass(LongWritable.class);
job.setOutputValueClass(Text.class);


FileInputFormat.setInputPaths(job, input);
FileOutputFormat.setOutputPath(job, new Path(output
+ ".dictionary.sorted." + getCurrentDateTime()));
job.setPartitionerClass(TotalOrderPartitioner.class);

Path inputDir = new Path("/others/partitions");

Path partitionFile = new Path(inputDir, "partitioning");
TotalOrderPartitioner.setPartitionFile(job.getConfiguration(),
partitionFile);

double pcnt = 1.0;
int numSamples = numReduceTasks;
int maxSplits = numReduceTasks - 1;
if (0 >= maxSplits)
maxSplits = Integer.MAX_VALUE;

InputSampler.Sampler<LongWritable, Text> sampler = new InputSampler.RandomSampler<LongWritable, Text>(pcnt,
numSamples, maxSplits);
InputSampler.writePartitionFile(job, sampler);
job.waitForCompletion(true);

最佳答案

我觉得你的 RandomSampler 参数很可疑:

  • 第一个参数freq 是概率,而不是百分比。对于 pcnt = 1,您正在对 100% 的记录进行抽样。
  • 第二个参数numSamples 应该更大一些。它应该足以代表整个数据集的分布。

假设您有以下键:4,7,8,9,4,1,2,5,6,3,2,4,7,4,8,1,7,1,8,9, 9,9,9

使用 freq = 0.3numSamples = 10。为了简单起见,假设 0.3 表示每 3 个键一个(如果采样)。这将收集以下样本:4,9,2,3,7,1,8,9。这将被分类为1,2,3,4,7,8,9,9。这个样本有8个元素,所以全部保留,因为它没有超过最大样本数numSamples = 10。在此示例中,您的 reducer 的边界将类似于 2、4、8、9。这意味着如果一对具有键“1”,它将在 Reducer #1 中结束。键为“2”的一对将在 Reducer #2 中结束。键为“5”的一对将在 Reducer #3 中结束,等等......这将是一个很好的分布。

现在,如果我们在相同的示例键上运行您的值。您的 freq = 1 因此您将每个 key 都放入示例中。因此您的示例将与初始键集相同。除了您设置最大样本数 numSamples = 4,这意味着您在样本中只保留 4 个元素。您的最终样本可能是 9,9,9,9。在这种情况下,您的所有边界都是相同的,因此所有对总是转到 Reducer #5。

在我的示例中,看起来我们很不幸拥有相同的最后 4 个键。但是如果你的原始数据集已经排序,如果你使用高频和少量样本,这很可能会发生(并且边界分布肯定是坏的)。

blog post有很多关于 Sampling 和 TotalOrderPartitioning 的细节。

关于hadoop - MapReduce TotalOrderPartitioning 仅将输出写入一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40097216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com