标签:mapreduce 第三方配置文件 共享方法 distributedcache 参数传递
其实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文件进行管理。具体用法随后介绍,随后会有一篇专门介绍DistributedCache的文章。
本文出自 “混混” 博客,请务必保留此出处http://yimaoqian.blog.51cto.com/1328422/1594005
标签:mapreduce 第三方配置文件 共享方法 distributedcache 参数传递
原文地址:http://yimaoqian.blog.51cto.com/1328422/1594005