基于ODPS的MR开发

ODPS提供了MapReduce编程接口;用户可以使用MapReduce提供的接口(Java API)编写MapReduce程序处理ODPS的中的数据

(一)处理流程

1.MapReduce处理数据过程主要分成2个阶段:Map阶段和Reduce阶段。首先执行Map阶段,再执行Reduce阶段。Map和Reduce的处理逻辑由用户自定义实现,但要符合MapReduce框架的约定。

  • 在正式执行Map前,需要将输入数据进行”分片”。所谓分片,就是将输入数据切分为大小相等的数据块,每一块作为单个Map Worker的输入被处理,以便于多个Map Worker同时工作。
  • 分片完毕后,多个Map Worker就可以同时工作了。每个Map Worker在读入各自的数据后,进行计算处理,最终输出给Reduce。Map Worker在输出数据时,需要为每一条输出数据指定一个Key。这个Key值决定了这条数据将会被发送给哪一个Reduce Worker。Key值和Reduce Worker是多对一的关系,具有相同Key的数据会被发送给同一个Reduce Worker,单个Reduce Worker有可能会接收到多个Key值的数据。
  • 在进入Reduce阶段之前,MapReduce框架会对数据按照Key值排序,使得具有相同Key的数据彼此相邻。如果用户指定了”合并操作”(Combiner),框架会调用Combiner,将具有相同Key的数据进行聚合。Combiner的逻辑可以由用户自定义实现。与经典的MapReduce框架协议不同,在ODPS中,Combiner的输入、输出的参数必须与Reduce保持一致。这部分的处理通常也叫做”洗牌”(Shuffle)。
  • 接下来进入Reduce阶段。相同的Key的数据会到达同一个Reduce Worker。同一个Reduce Worker会接收来自多个Map Worker的数据。每个Reduce Worker会对Key相同的多个数据进行Reduce操作。最后,一个Key的多条数据经过Reduce的作用后,将变成了一个值。
2.下面将以WordCount为例,解释ODPS MapReduce各个阶段的概念。 假设存在一个文本a.txt,文本内每行是一个数字,我们要统计每个数字出现的次数。文本内的数字称为Word,数字出现的次数称为Count。如果ODPS Mapreduce完成这一功能,需要经历下图描述的几个步骤:
基于ODPS的MR开发_第1张图片

首先对文本进行分片,将每片内的数据作为单个Map Worker的输入;

  • Map处理输入,每获取一个数字,将数字的Count设置为1,并将此对输出,此时以Word作为输出数据的Key;
  • 在Shuffle阶段前期,首先对每个Map Worker的输出,按照Key值,即Word值排序。排序后进行Combine操作,即将Key值(Word值)相同的Count累加, 构成一个新的对。此过程被称为合并排序;
  • 在Shuffle阶段后期,数据被发送到Reduce端。Reduce Worker收到数据后依赖Key值再次对数据排序;
  • 每个Reduce Worker对数据进行处理时,采用与Combiner相同的逻辑,将Key值(Word值)相同的Count累加,得到输出结果;
  • 由于ODPS的所有数据都被存放在表中,因此ODPS MapReduce的输入、输出只能是表,不允许用户自定义输出格式,不提供类似文件系统的接口。

(二)搭建开发环境

1.前期准备

(1)安装好jdk,jre,maven并设置好环境变量;打开cmd检测是否安装成功:

基于ODPS的MR开发_第2张图片

(2)下载并安装eclipse以及maven插件(M2Eclipse);

2.添加远程repository:

(1)在Eclipse中依次点击 Window->Preferences -> Maven -> Arthetypes ,在打开的对话框中点击 Add Remote Catalog... 按钮

(2)在打开的对话框中, Catalog File 填入 http://maven.sdk.de.yushanfang.com/SNAPSHOT , Description 填入 Base Archetypes ,然后一路 OK 就完成了远程repository添加

基于ODPS的MR开发_第3张图片

3.配置mvn:在 installations 中添加 maven 的地址

基于ODPS的MR开发_第4张图片

4.设置user settings并配置global settings,其中配置文件settings.xml文件内容如下:



    
        com.alibaba.base.plugins
    

    
        
            base
            
                
                    base-snapshots
                    http://maven.sdk.de.yushanfang.com/SNAPSHOT
                    
                        false
                    
                    
                        true
                    
                
            
        
    

    
        base
    
基于ODPS的MR开发_第5张图片

5.新建mvn项目:
(1)如同新建一般maven项目一样,在Eclipse中依次点击 File -> New -> Project... ,在打开的对话框中选择 Maven -> Maven Project
(2)一路点击 Next ,在 Select an Archetypes 界面, Catalog 选择 Base Archetypes ,并选中 Include snapshot archetypes 复选框,此时可以看到列表中出现base-mapreduce-archetype和base-udf-archetype两个archetypes,选择需要创建的程序类型,点击 Next
(3)填写项目信息:
基于ODPS的MR开发_第6张图片
其中:baseId表示用户标识;projectId表示用户要创建程序到哪个御膳房项目ID;token表示用于签名的令牌;idePath表示程序将要上传到IDE的哪个工作目录下,需要工作目录已经在IDE中创建好,例如“工作流/士诚”;这些Id可以在‘我的账号’-〉‘证书管理’中获取;
6.编译以及上传:
(1)项目新建好之后右键项目 run as maven clean 编译项目;
(2)右键项目 run as maven build提交线上,配置信息如下:
基于ODPS的MR开发_第7张图片
其中关键信息为:
Goals                                            base:check base:zip base:submit
base.program.type                    mapreduce
base.endpoint                            http://api.sdk.de.yushanfang.com
base.ide.url                                 http://ide.de.yushanfang.com
base.ide.resource.url                http://@{env}.codebase.de.yushanfang.com/scheduler/res?id={rid}

(3)上传成功后平台上将出现一个jar包跟一个mapred文件,直接执行mapred文件即可;
7.建好工程之后有以下目录:

基于ODPS的MR开发_第8张图片
(1)JobLauncher,MyCombiner,MyMapper,MyReducer文件用于编写用户自定义的任务;
(2)配置文件base.mapred.xml是输入输出表的定义等;
PS:以上文件均提供模版

参考资料:ODPS MR


你可能感兴趣的:(经验帖)