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

2022-07-03 17:06:51 浏览数 (1)

其实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文件进行管理。

0 人点赞