Mapreduce topK问题总是只能得到一个结果,求解

king_ven 2014-05-22 05:33:30

import java.io.IOException;
import java.util.TreeMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DefaultStringifier;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;


public class TopK
{
private int topk;

public static class TopKMapper extends Mapper<LongWritable, Text, IntWritable, Text>
{
private TreeMap<IntWritable, Text> fatcats = new TreeMap<IntWritable, Text>();

public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException
{
Configuration conf = context.getConfiguration();

Text topktext = DefaultStringifier.load(conf, "topk", Text.class);
int topk = Integer.parseInt(topktext.toString());

String[] str = value.toString().split("\t");

fatcats.put(new IntWritable(Integer.parseInt(str[0])), new Text(str[1]));
if(fatcats.size() > topk)
{
fatcats.remove(fatcats.firstKey());
}
}

@Override
protected void cleanup(Context context) throws IOException, InterruptedException
{
for(IntWritable key :fatcats.keySet())
{
context.write(key, fatcats.get(key));
}
}
}

public static class TopKReducer extends Reducer<IntWritable, Text, IntWritable, Text>
{
private TreeMap<IntWritable, Text> fatcats = new TreeMap<IntWritable, Text>();

public void reduce(IntWritable key, Iterable<Text>values, Context context)throws IOException, InterruptedException
{
Configuration conf = context.getConfiguration();

Text topktext = DefaultStringifier.load(conf, "topk", Text.class);
int topk = Integer.parseInt(topktext.toString());

for (Text str : values)
{
fatcats.put(key, str);
if(fatcats.size() > topk)
{
fatcats.remove(fatcats.firstKey());
}
}
}

@Override
protected void cleanup(Context context) throws IOException, InterruptedException
{
for(IntWritable key :fatcats.keySet())
{
context.write(key, fatcats.get(key));
}
}
}

public void run(String src, String dst) throws IOException
{
Configuration conf = new Configuration();
conf.set("fs.default.name", "hdfs://localhost:9000");

DefaultStringifier.store(conf, new Text(String.valueOf(topk)) ,"topk");

Job job = new Job(conf, "TopK");
job.setJarByClass(TopK.class);

//设置输入输出格式
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);

//设置Map、Combine和Reduce处理类
job.setMapperClass(TopKMapper.class);
job.setReducerClass(TopKReducer.class);
job.setCombinerClass(TopKReducer.class);

//设置输出类型
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(Text.class);

job.setNumReduceTasks(1);

//注意这里的输入输出都应该是在HDFS下的文件或目录
FileInputFormat.addInputPath(job, new Path(src));
FileOutputFormat.setOutputPath(job, new Path(dst));

//开始运行
try {
job.waitForCompletion(true);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public TopK(int topk)
{
this.topk = topk;
}

public static void main(String[] args)
{
System.out.println(String.valueOf(10));

System.out.println(Integer.parseInt(String.valueOf(10)));

TopK topk = new TopK(10);
try {
topk.run("/count.txt", "/topk");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
...全文
130 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
姜小白- 2014-05-23
  • 打赏
  • 举报
回复
楼主将帖子移动到 云计算——分布式计算Hadoop板块吧
king_ven 2014-05-22
  • 打赏
  • 举报
回复
急求大神解答啊。
内容概要:本文研究了基于共识的捆绑算法(CBBA)在多智能体系统中的多任务分配问题,重点应用于远程太空船交会与维修的相对运动规划(RPO)任务。通过Matlab代码实现了CBBA算法,解决了多个航天器在复杂空间环境下协同执行交会、对接与维修任务时的任务分配挑战。研究突出该算法在分布式决策、冲突避免与资源优化方面的优势,详细探讨了任务打包、竞标机制与共识达成等核心环节,验证了其在无中央控制器条件下实现高效、鲁棒任务分配的有效性。; 适合人群:具备航天动力学、控制理论、多智能体系统及优化算法基础,从事航天器自主任务规划、分布式协同控制等相关领域的研究生、科研人员及工程师。; 使用场景及目标:① 实现多航天器在通信受限与信息不完整的远程空间环境下的自主任务分配;② 提升RPO任务中路径规划与资源调度的效率与安全性;③ 构建去中心化的多智能体协同框架,增强系统整体鲁棒性与可扩展性。; 阅读建议:建议结合提供的Matlab代码深入理解CBBA算法的实现逻辑,重点关注竞标权重设计、任务冲突消解与共识收敛过程,并可通过调整任务规模、通信拓扑与约束条件进行仿真实验,以全面掌握算法性能与适用边界。

58,440

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧