设为首页 收藏本站
查看: 680|回复: 0

[经验分享] nutch 1.8 nutch 2.2.1 与 hadoop 2.2.0

[复制链接]
发表于 2016-12-12 11:07:37 | 显示全部楼层 |阅读模式
由于项目需要把nutch运行在hadoop2.2.0上,但是官方网站上给出的版本为hadoop1.2.0,于是需要做版本兼容,我们选取的nutch版本为2.2.1,以为最大的版本是最新的,后来发现无知了,这也是后来痛苦经历的根源。

先说结论,nutch1.8直接可以运行在hadoop2.2.0上,不用为版本兼容做任何修改。

但是不知道这一结论之前我为了兼容nutch 2.2.1和hadoop2.2.0及hbase0.96做了如下工作:
1、修改gora-core,将里面依赖hbase和hadoop的内容都改为高版本的,修正编译错误重新编译
2、修改gora-hbase,重复跟gora-core一样的动作
3、修改nutch的build.xml文件,将所有依赖的低版本也改为高版本,然后在maven库中将gora-core和gora-hbase也替换为我们重新编译过的。
4、修改gora-core和gora-hbase的ivy文件,去掉对低版本hadoop包和hbase包机avro包的依赖
5、重新编译nutch,这是会欣喜的发现,inject命令可以执行了
6、但是执行generate的时候会出现一个空指针,粘一部分
java.lang.Exception: java.lang.NullPointerException: null of string in field baseUrl of org.apache.nutch.storage.WebPage
        at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:403)
Caused by: java.lang.NullPointerException: null of string in field baseUrl of org.apache.nutch.storage.WebPage
        at org.apache.avro.generic.GenericDatumWriter.npe(GenericDatumWriter.java:97)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:91)
        at org.apache.avro.generic.GenericDatumWriter.write(GenericDatumWriter.java:61)
        at org.apache.hadoop.io.serializer.avro.AvroSerialization$AvroSerializer.serialize(AvroSerialization.java:105)
   经过多方调查得到如下结论:
   1)空指针是由于hadoop2.2.0时使用的GenericDatumWriter,而1.0.1时使用的是PersistentDatumWriter
   2)而产生上述问题的原因是用于hadoop2.2.0时使用是AvroSerializer,而1.0.1时使用的是PersistentSerializer
   3)而产生上述问题的原因是在hadoop的MapTask类中,会选取对value的序列化类(2.2.0的hadoop-mapreduce-client-core中MapTask的第985行),而序列化类是由Serialization类包装的
   4)组合Serialization类的代码在2.2.0的hadoop-common的SerializationFactory构造函数中即第56行开始,而hadoop1.0中对应的代码时不一样的,比较一下
hadoop2.2.0:
  public SerializationFactory(Configuration conf) {
    super(conf);
    for (String serializerName : conf.getStrings(
      CommonConfigurationKeys.IO_SERIALIZATIONS_KEY,
      new String[]{WritableSerialization.class.getName(),
        AvroSpecificSerialization.class.getName(),
        AvroReflectSerialization.class.getName()})) {
      add(conf, serializerName);
    }
  }

hadoop 1.0.1:
  public SerializationFactory(Configuration conf) {
    super(conf);
    for (String serializerName : conf.getStrings("io.serializations",
      new String[]{"org.apache.hadoop.io.serializer.WritableSerialization"})) {
      LOG.error("serializerName"+serializerName);
      add(conf, serializerName);
    }
  }
CommonConfigurationKeys.IO_SERIALIZATIONS_KEY这个变量跟下面是一样的,本人在1.0.1上打log看了,就是包含后来PersistentSerializer的PersistentSerialization,由于半天没配好2.2.0的编译环境,所以后来2.2.0那边就没查了,然后就发现1.8直接能用了。。。

自此痛苦的调查告一段落,期望后来人不要向我一样走弯路,也给期望继续做nutch2.2.1和合hadoop2.2.0兼容的人留一点意见。

再次重复hadoop2.2.0和nutch1.8是可以兼容的!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-313229-1-1.html 上篇帖子: Hadoop 实现协同过滤 (example in chapter 6) Part 2 下篇帖子: Maven搭建hadoop环境报Missing artifact jdk.tools:jdk.tools:jar:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表