博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hadoop传递参数方法总结
阅读量:5239 次
发布时间:2019-06-14

本文共 2193 字,大约阅读时间需要 7 分钟。

转自: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,分别用来序列化和反序列化,实现该接口的典型例子如下:

  1. package com.sanyuan.resource.xml.Entity;  
  2. import java.io.DataInput;  
  3. import java.io.DataOutput;  
  4. import java.io.IOException;  
  5. import org.apache.hadoop.io.Text;  
  6. import org.apache.hadoop.io.Writable;  
  7. public class PublishUrl implements Writable {  
  8.         private static final long serialVersionUID = 1L;  
  9.         private Text url;  
  10.         private Text title;  
  11.         public PublishUrl(){  
  12.                this.url = new Text();  
  13.                this.title = new Text();  
  14.         }  
  15.         public Text getUrl() {  
  16.                return url;  
  17.         }  
  18.         public void setUrl(Text url) {  
  19.                this.url = url;  
  20.         }  
  21.         public Text getTitle() {  
  22.                return title;  
  23.         }  
  24.         public void setTitle(Text title) {  
  25.                this.title = title;  
  26.         }  
  27.         @Override  
  28.         public void readFields(DataInput in) throws IOException {  
  29.                url.readFields(in);  
  30.                title.readFields(in);  
  31.                  
  32.         }  
  33.         @Override  
  34.         public void write(DataOutput out) throws IOException {  
  35.                url.write(out);  
  36.                title.write(out);  
  37.         }  
  38.           
  39. }   
  40.  3、如果是一些更大的object,是不能放在conf中传递的,这就需要用到DistributedCache或者Hdfs文件系统。

转载于:https://www.cnblogs.com/zhangjxblog/p/6636451.html

你可能感兴趣的文章
openwrt使用list
查看>>
函数对象
查看>>
Problem B: 占点游戏
查看>>
css3基础篇二
查看>>
进程间的八种通信方式----共享内存是最快的 IPC 方式
查看>>
DPDK初始化流程
查看>>
MEF: MSDN 杂志上的文章(14) 稳定的组合
查看>>
python常用模块之sys, os, random
查看>>
HDU 2548 A strange lift
查看>>
Linux服务器在外地,如何用eclipse连接hdfs
查看>>
react双组件传值和传参
查看>>
BNU29140——Taiko taiko——————【概率题、规律题】
查看>>
POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
查看>>
java 得到以后的日期
查看>>
[Kaggle] Sentiment Analysis on Movie Reviews
查看>>
python安装easy_intall和pip
查看>>
AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
查看>>
宏脚本链接数据库
查看>>
HDU1004
查看>>
MySQL高速缓存
查看>>