最近用了用Hadoop,要试从两个数据源读取数据再取交集的功能,查了一下就是Hadoop的DataJoin,大喜之下认真看看,网上搜一下相关贴子还不少(细看之后才知道都是抄《Hadoop in Action》的),不过这篇贴子(http://www.cnblogs.com/xuqiang/archive/2011/06/05/2073155.html)做的注解很通俗易懂,很好。
试了一下书上的例子,困难重重(我用的是1.0.3)。不过回想起来主要碰到的是两个问题:
- 库非要在${HADOOP_HOME}/lib/下才行,所以要做:cp ./contrib/datajoin/hadoop-datajoin-1.0.3.jar ./lib/hadoop-datajoin-1.0.3.jar
- 运行时在combine阶段空指针出错,解决方案:
1 public static class TaggedWritable extends TaggedMapOutput { 2 private Writable data; 3 //Note: 加上这个默认构造函数 4 public TaggedWritable() { 5 this.tag = new Text(""); 6 this.data = new Text(""); 7 } 8 ......... 9 } 10 11 12 public static class TestJoinReducer extends DataJoinReducerBase { 13 protected TaggedMapOutput combine(Object[] tags, Object[] values) { 14 if (tags.length < 2) return null; 15 String joinedStr = ""; 16 for (int i=0; i<values.length; i++) { 17 if (i > 0) joinedStr += ","; 18 //Note:这样即可,不必象原书那么复杂 19 TaggedWritable tw = (TaggedWritable)values[i]; 20 String line = ((Text) tw.getData()).toString(); 21 String[] tokens = line.split(",", 2); 22 joinedStr += tokens[1]; 23 } 24 TaggedWritable retv = new TaggedWritable(new Text(joinedStr)); 25 retv.setTag((Text) tags[0]); 26 return retv; 27 } 28 }
最后的一点结论:
- Google大神很强大,各位爱分享的大牛很热心,但解决问题自己多动脑才更好,不要太依赖于别人的现有成果;
- Datajoin用的仍是Hadoop旧的MapRed库,不知什么时候能更新到MapReduce库;
- Hive可以更方便的搞定类似问题;