共计 2272 个字符,预计需要花费 6 分钟才能阅读完成。
其实 MapReduce 作业运行第三方配置文件的共享方法往小了说其实就是参数在 MapReduce 作业中的传递,往大了说其实就是 DistributedCache 的应用。
在 MapReduce 中传递参数普遍用 Configuration,Configuration 是一个键值对,将所需的参数值表示成键值对(键值对为字符串类型),调用 Configuration 的 set 方法就保存进去了,用的时候调用 get 方法。
这是最基础的,在工作中难免遇到一些特殊的情况,比如,如何传递一个对象型参数?当你的 MapReduce 作业依赖第三方 jar 包,而这个第三方 jar 包又需要从集群本地读取一些配置文件,这种情况又改怎么把配置文件传给集群中的各个节点呢?
对象类型的参数可以覆盖这个对象的 toString() 方法,将它的所有元素表示成字符串,然后使用 Configuration.set(name, value) 传递这个字符串,然后用的时候 get 到这个字符串,做析构。这种方法容易造成精度上的丢失,并且容易带来空间上的浪费。比如 double 类型转换成字符串,不仅精度有损失,而且 8 字节的空间用字符串来表示可能会变成几十字节。其次不灵活,如果修改了这个对象的结构可能会有 bug 哦。
另一种比较 nice 的方法是利用 Hadoop 的 api 中的 DefaultStringifier,此类有两个方法 store 和 load,分别用来设置和获取。用法为
DefaultStringifier.store(conf, obj ,”keyname”);
将 object 以序列化后以指定的 key 存在 conf 中。
object = DefaultStringifier.load(conf, “keyname”, variableClass);
其中 conf 为 MapReduce 作业当前的配置环境 conf,obj 为传入的对象,keyname 为此 obj 在 conf 中的标识,variableclass 为 obj 获取后转化成的 class 类,
此方法需要注意一点是 obj 这个对象需要实现 Writable 接口,使它具有序列化的能力。此对象的 Writable 接口可以自己实现也可以将此 obj 转化为 BytesWritable 类型的,这样在从 conf 中取出的时候还得进行反转,转化方法可以这样写
private static BytesWritable transfer(Object patterns) {
ByteArrayOutputStream baos = null;
ObjectOutputStream oos = null;
try {
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(patterns);
oos.flush();
return new BytesWritable(baos.toByteArray() );
} catch(Exception e) {
logger.error(“”, e);
} finally {
IoUtils.close(baos);
IoUtils.close(oos);
}
return null;
}
反转方法为
private static Object transferMRC(byte[] bytes ) {
// MapWritable map = new MapWritable();
ObjectInputStream is = null;
try {
is = new ObjectInputStream(new ByteArrayInputStream( bytes) );
return is.readObject();
} catch(Exception e) {
logger.error(“”, e);
} finally {
IoUtils.close(is);
}
return null;
}
但是如果遇到更大的参数呢?比如分词用的语料库等等,这时就应该用到 Hadoop 的缓存机制 DistributedCache 了。
DistributedCache 是 hadoop 框架提供的一种机制, 可以将 job 指定的文件, 在 job 执行前, 先行分发到 task 执行的机器上, 并有相关机制对 cache 文件进行管理。
Spark 颠覆 MapReduce 保持的排序记录 http://www.linuxidc.com/Linux/2014-10/107909.htm
在 Oracle 数据库中实现 MapReduce http://www.linuxidc.com/Linux/2014-10/107602.htm
MapReduce 实现矩阵乘法 – 实现代码 http://www.linuxidc.com/Linux/2014-09/106958.htm
基于 MapReduce 的图算法 PDF http://www.linuxidc.com/Linux/2014-08/105692.htm
Hadoop 的 HDFS 和 MapReduce http://www.linuxidc.com/Linux/2014-08/105661.htm
MapReduce 计数器简介 http://www.linuxidc.com/Linux/2014-08/105649.htm