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

[经验分享] hadoop传递参数方法总结

[复制链接]

尚未签到

发表于 2017-12-17 13:14:42 | 显示全部楼层 |阅读模式
  转自:http://blog.csdn.net/xichenguan/article/details/22162813
  写MapReduce程序通常要传递各种各样的参数,选择合适的方式来传递参数既能提高工作效率,也可以避免bug的产生。根据参数的大小,可以粗略的分为以下几种。
  最直接的方式就是使用Configuration的各种set方法,对于基本数据类型都有很好的支持,比如传递kmeans聚类算法的中心点个数。
  如何传递一个对象型参数?话说所有的对象都是由基本类型构建的,所以我们可以覆盖这个对象的toString()方法,将它的所有元素表示成字符串,然后使用Configuration.set(name, value)传递这个字符串。然后在Mapper端获得这个字符串,做析构。这种朴素的方法有两个缺点。首先,将对象变成字符串会有精度上的损失,比如 double类型转换成字符串,不仅精度有损失,而且8字节的空间用字符串来表示可能会变成几十字节。其次,由于字符串化和反字符串化分散在不同的地方,很容易产生bug,如果修改了这个对象的结构,这种bug产生的几率非常大。既然有这种需求存在,难道hadoop没有提供nice点的方法吗?有,不过在api文档中没有直接说明。
  正确的方法是,让这个对象实现Writable接口,使它具有序列化的能力,然后使用org.apache.hadoop.io.DefaultStringifier的store(conf,  obj, keyname)和load(conf, keyname, itemclass)静态方法设置和获取这个对象。他的主要思想就是将这个对象序列化成一个字节数组后,用Base64编码成一个字符串,然后传递给 conf, 解析的时候与之类似。
  如何传递更大的参数,比如分词用的语料库等等?可以使用hadoop的缓存文件DistributedCache。
  1、使用configuration的set()和get()方法,这里的name和value都是String型
  Configuration.set(name, value)
  Configuration.get(name)
  这种方法适合基本数据类型的传递。
  2、使用Stringifier 接口。
  

DefaultStringifier.store(conf, object ,"key");  

  将object以序列化后以指定的key存在conf中。
  

object = DefaultStringifier.load(conf, "key", variableClass );  

  从conf中取出object。
  需要指出的是使用第二种方法的对象必须是可序列化的。Hadoop的序列化是通过Writable接口来实现的,在org.apache.hadoop.io包下包含了大量的可序列化的组件,它们都实现了Writable接口,Writable接口提供了两个方法,write和readFields,分别用来序列化和反序列化,实现该接口的典型例子如下:


  • package com.sanyuan.resource.xml.Entity;
  • import java.io.DataInput;
  • import java.io.DataOutput;
  • import java.io.IOException;
  • import org.apache.hadoop.io.Text;
  • import org.apache.hadoop.io.Writable;
  • public class PublishUrl implements Writable {
  •         private static final long serialVersionUID = 1L;
  •         private Text url;
  •         private Text title;
  •         public PublishUrl(){
  •                this.url = new Text();
  •                this.title = new Text();
  •         }
  •         public Text getUrl() {
  •                return url;
  •         }
  •         public void setUrl(Text url) {
  •                this.url = url;
  •         }
  •         public Text getTitle() {
  •                return title;
  •         }
  •         public void setTitle(Text title) {
  •                this.title = title;
  •         }
  •         @Override
  •         public void readFields(DataInput in) throws IOException {
  •                url.readFields(in);
  •                title.readFields(in);

  •         }
  •         @Override
  •         public void write(DataOutput out) throws IOException {
  •                url.write(out);
  •                title.write(out);
  •         }

  • }
  • 3、如果是一些更大的object,是不能放在conf中传递的,这就需要用到DistributedCache或者Hdfs文件系统。

运维网声明 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-425016-1-1.html 上篇帖子: hadoop 常用命令总结 下篇帖子: hadoop yarn组件介绍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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