首页 > 代码库 > MapReduce作业运行第三方配置文件的共享方法

MapReduce作业运行第三方配置文件的共享方法

    其实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作业运行第三方配置文件的共享方法