Hadoop Datajoin例子运行时出错的问题

最近用了用Hadoop,要试从两个数据源读取数据再取交集的功能,查了一下就是Hadoop的DataJoin,大喜之下认真看看,网上搜一下相关贴子还不少(细看之后才知道都是抄《Hadoop in Action》的),不过这篇贴子(http://www.cnblogs.com/xuqiang/archive/2011/06/05/2073155.html)做的注解很通俗易懂,很好。

 

试了一下书上的例子,困难重重(我用的是1.0.3)。不过回想起来主要碰到的是两个问题:

  1. 库非要在${HADOOP_HOME}/lib/下才行,所以要做:cp ./contrib/datajoin/hadoop-datajoin-1.0.3.jar ./lib/hadoop-datajoin-1.0.3.jar
  2. 运行时在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可以更方便的搞定类似问题;
posted @ 2012-08-21 22:28  双子靓星  阅读(350)  评论(0编辑  收藏  举报