关于mapreduce中类重用机制
来源:互联网 发布:学生成绩数据库下载 编辑:程序博客网 时间:2024/06/11 05:31
今天写了一个writable,其代码如下:
public class CFWritable implements Writable { private IntWritable mark ;//标识位 private List<ItemWritable> items ; public CFWritable(){ mark = new IntWritable(0); items = new ArrayList<ItemWritable>(2); } public CFWritable(int mark,List<ItemWritable> items){ this.mark = new IntWritable(mark); this.items = items ; } @Overridepublic void write(DataOutput out) throws IOException {out.writeInt(items.size());mark.write(out);for(ItemWritable item:items){item.write(out);}}@Overridepublic void readFields(DataInput in) throws IOException {int itemsSize = in.readInt();mark.readFields(in);for(int i = 0 ; i < itemsSize; i ++){ItemWritable item = new ItemWritable();item.readFields(in);items.add(item);}}public int getMark() {return mark.get();}public void setMark(int mark) {this.mark = new IntWritable(mark);}public List<ItemWritable> getItems() {return items;}public void setItems(List<ItemWritable> items) {this.items = items;}}
上面的代码在跑集群任务的时候,发现Reduce到66%这个数后就基本上不动了。排查一番,感觉类中的items的个数不会超过100个,那么在计算的时候不应该慢下来。为了验证想法,自己在程序中打印了一些信息,其中就包含items的size;打印出来的结果令我不解,items的size就是前面的累计。
仔细排查代码后,突然在脑中一闪:在ruduce的时候,mr为了加快速度(不要重新new)就复用了writable的类,而我这里却没有任何机制清空items,所以这里会一直在items 的后面添加数据。
问题找到后,修改代码如下:
public class CFWritable implements Writable { private IntWritable mark ;//标识位 private List<ItemWritable> items ; public CFWritable(){ mark = new IntWritable(0); items = new ArrayList<ItemWritable>(2); } public CFWritable(int mark,List<ItemWritable> items){ this.mark = new IntWritable(mark); this.items = items ; } @Overridepublic void write(DataOutput out) throws IOException {out.writeInt(items.size());mark.write(out);for(ItemWritable item:items){item.write(out);}}@Overridepublic void readFields(DataInput in) throws IOException {<span style="color:#ff0000;">clear();//先清除上次给的值</span>int itemsSize = in.readInt();mark.readFields(in);for(int i = 0 ; i < itemsSize; i ++){ItemWritable item = new ItemWritable();item.readFields(in);items.add(item);}}public void clear(){items.clear();}public int getMark() {return mark.get();}public void setMark(int mark) {this.mark = new IntWritable(mark);}public List<ItemWritable> getItems() {return items;}public void setItems(List<ItemWritable> items) {this.items = items;}}
0 0
- 关于mapreduce中类重用机制
- 关于MapReduce框架中Key-Value对象的重用
- 关于TableViewCell的重用机制
- AbsListView中item重用机制
- 关于UITableView的重用机制浅谈
- iOS关于UITableViewCell的重用机制
- 解决UITableView中cell重用机制
- ios UITableView中Cell的重用机制
- UITableView中Cell的重用机制
- IOS中tableview 的重用机制
- ios UITableView中Cell的重用机制
- UITableView中Cell使用标识符重用机制
- 解决UITableView中Cell重用机制问题
- UITableView中cell的重用机制
- MapReduce框架中Key-Value对象的重用
- 关于uitableview自定义cell与重用机制探究
- (iphone/ipad)关于uitableview自定义cell与重用机制探究
- iOS开发之关于cell的重用机制
- 5个强大的Java分布式缓存框架推荐
- 浅谈深度学习(Deep Learning)的基本思想和方法
- 关于IT增值服务"拜师学艺"价格调整的通知
- 职责链模式
- pacman用法
- 关于mapreduce中类重用机制
- SEO优化原则
- 小端与大端的判断和转换
- 造成segment fault,产生core dump的可能原因
- 关于qt开发环境搭建
- HDU 3591 多重背包
- mysql 权限相关命令
- 第十二周项目三求n的阶乘
- 关于命名空间的函数