阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

122次阅读
没有评论

共计 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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计2272字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中