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的文章。

时间: 2024-10-05 05:01:59

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

剖析MapReduce 作业运行机制

包含四个独立的实体: ·  Client Node 客户端:编写 MapReduce代码,配置作业,提交MapReduce作业. ·  JobTracker :初始化作业,分配作业,与 TaskTracker通信,协调整个作业的运行. jobtracker是一个Java 应用程序,它的主类是 JobTracker. ·  TaskTracker :保持与 JobTracker通信,在分配的数据片段上执行 Map或Reduce 任务.tasktracker是 Java应用程序,它的主类是TaskT

Hadoop之 - 剖析 MapReduce 作业的运行机制(MapReduce 2)

在0.20版本及更早期的系列中,mapred.job.tracker 决定了执行MapReduce程序的方式.如果这个配置属性被设置为local(默认值),则使用本地的作业运行器.运行器在耽搁JVM上运行整个作业.它被设计用来在小的数据集上测试和运行MapReduce程序. 如果 mapred.job.tracker 被设置为用冒号分开的主机和端口对(主机:端口),那么该配置属性就被解释为一个jobtracker地址,运行器则将作业提交给该地址的jobtracker. Hadoop 2.x引入了

Yarn源码分析之MapReduce作业中任务Task调度整体流程(一)

v2版本的MapReduce作业中,作业JOB_SETUP_COMPLETED事件的发生,即作业SETUP阶段完成事件,会触发作业由SETUP状态转换到RUNNING状态,而作业状态转换中涉及作业信息的处理,是由SetupCompletedTransition来完成的,它主要做了四件事: 1.通过设置作业Job的成员变量setupProgress为1,标记作业setup已完成: 2.调度作业Job的Map Task: 3.调度作业的JobReduce Task: 4.如果没有task了,则生成J

Spark源码系列(三)作业运行过程

导读 看这篇文章的时候,最好是能够跟着代码一起看,我是边看代码边写的,所以这篇文章的前进过程也就是我看代码的推进过程. 作业执行 上一章讲了RDD的转换,但是没讲作业的运行,它和Driver Program的关系是啥,和RDD的关系是啥? 官方给的例子里面,一执行collect方法就能出结果,那我们就从collect开始看吧,进入RDD,找到collect方法. def collect(): Array[T] = { val results = sc.runJob(this, (iter: It

MapReduce 作业的生命周期

这个过程分为以下 5 个步骤: 步骤 1 作业提交与初始化.用户提交作业后,首先由 JobClient 实例将作业相关信 息,比如将程序 jar 包.作业配置文件.分片元信息文件等上传到分布式文件系统(一般为HDFS)上,其中,分片元信息文件记录了每个输入分片的逻辑位置信息.然后 JobClient 通过 RPC通知JobTracker.JobTracker收到新作业提交请求后,由作业调度模块对作业进 行初始化 :为作业创建一个JobInProgress对象以跟踪作业运行状况,而 obInPro

MapReduce作业的map task和reduce task调度参数

MapReduce作业可以细分为map task和reduce task,而MRAppMaster又将map task和reduce task分为四种状态: 1.pending:刚启动但尚未向resourcemanager发送资源请求: 2.scheduled:已经向resourceManager发送资源请求,但尚未分配到资源: 3.assigned:已经分配到了资源且正在运行: 4.completed:已经运行完成. map task的生命周期为:scheduled -> assigned -

【转】Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

原文网址:http://www.blogjava.net/anchor110/articles/355699.html 1.在工程下新建lib文件夹,将需要的第三方包拷贝进来.2.将引用的第三方包,添加进工作的build path.3.(关键的一步)将lib设为源文件夹.如果不设置,则程序编译可以通过,但运行的时候,会报: java.lang.NoClassDefFoundError # re: Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundErro

hadoop笔记之MapReduce的运行流程

MapReduce的运行流程 MapReduce的运行流程 基本概念: Job&Task:要完成一个作业(Job),就要分成很多个Task,Task又分为MapTask和ReduceTask JobTracker TaskTracker Hadoop MapReduce体系结构 JobTracker的角色 作业调度 分配任务.监控任务执行进度 监控TaskTracker的状态 TaskTracker的角色 执行任务 汇报任务状态 MapReduce作业执行过程 MapReduce的容错机制 重复

Android 应用程序退出后不在运行列表中显示的方法

使应用信息不在运行列表中显示的方法需要修改配置文件中activity标签的两个值 <span style="font-size:14px;">android:noHistory="true" android:excludeFromRecents="true"></span> 将这两个值置为true android:noHistory 这个属性用于设置在用户离开该Activity,并且它在屏幕上不再可见的时候,它是否应