Hadoop MapReduce 编写

Key Words: Configruation, Combiing Resources, Variable Expansion, dependency, package

写 MapReduce 的套路,首先写 map 和 reduce 函数,在 IDE 中拿一小部分的数据集进行调试,编写单元测试,调试成功之后,将程序放开(unleash)到集群环境中,期间可能遇到更多的问题,继续丰富单元测试,在分布式环境下进行 mapReduce 程序的调试,是一个挑战,Hadoop 提供了相关通用技巧来使得调试过程相对容易
在程序能够正常运行之后,需要给 mapReduce 程序进行调优,让其跑的更快,以及对任务(task)进行剖析(profile),对任务进行剖析是通过在执行流程中添加相关钩子(hook)来进行诊断

Configruation API 要点

1.xml 文件中不存储类型信息,所以属性可以通过指定的类型被解释
2.可以为属性指定一个 default 值

合并资源(Combining Resources)

1.按照加载的顺序进行合并

Configuration conf = new Configuration();
conf.addResource("configuration-1.xml");
conf.addResource("configuration-2.xml"); 

2.属性被标记为final后,不能被后续的定义覆盖(overridden)

变量扩展(Variable Expansion)

1.后续的变量值定义可以使用前者变量的定义值

<?xml version="1.0"?>
<configuration>
  <property>
    <name>color</name>
    <value>yellow</value>
    <description>Color</description>
  </property>
  
  <property>
    <name>size</name>
    <value>10</value>
    <description>Size</description>
  </property>
  
  <property>
    <name>weight</name>
    <value>heavy</value>
    <final>true</final>
    <description>Weight</description>
  </property>
  
  <property>
    <name>size-weight</name>
    <value>${size},${weight}</value>
    <description>Size and weight</description>
  </property>
</configuration>

2.系统属性比资源文件中的属性具有更高的优先级

所以可以通过 -Dproperty=value的形式来进行覆盖属性文件中的变量定义。但是有个例外,就是被覆盖的属性必须在属性文件中进行了定义,否则配置对象无法获取且给出警告

System.setProperty("length", "2");
assertThat(conf.get("length"), is((String) null)); 

配置开发环境

1.依赖配置(pom.xml)

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.hadoopbook</groupId>
    <artifactId>hadoop-book-mr-dev</artifactId>
    <version>4.0</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <hadoop.version>2.5.1</hadoop.version>
    </properties>
    <dependencies>
        <!-- Hadoop main client artifact -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-client</artifactId>
            <version>${hadoop.version}</version>
        </dependency>
        <!-- Unit test artifacts -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.mrunit</groupId>
            <artifactId>mrunit</artifactId>
            <version>1.1.0</version>
            <classifier>hadoop2</classifier>
            <scope>test</scope>
        </dependency>
        <!-- Hadoop test artifact for running mini clusters -->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-minicluster</artifactId>
            <version>${hadoop.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>hadoop-examples</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.5</version>
                <configuration>
                    <outputDirectory>${basedir}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

为了构建 MapReduce 作业,只需引入 hadoop-client 依赖,它包含了 Hadoop 客户端和 HDFS 和 MapReduce 交互的类

使用 mrunit 来进行 MapReduce 的单元测试

hadoop-minicluster 类库包含了“mini-”的集群,它们在单机(single JVM)上测试 Hadoop 集群非常有用

管理配置

对于 local、pseudo distributed、cluster 环境的配置,最好的做法是,将它们各自的配置文件独立于 Hadoop 的安装目录树,这样的能够容易的切换 Hadoop 的作业环境而不至于重复或是丢失配置

GenericOptionsParser,Tool,and ToolRunner

ToolRunner 使用 GenericOptionsParser 来把命令行上指定的选项设置到 Configuration 实例对象中

注意在命令行中的-D property=value中间的空格符号,以及与标准 JVM 系统属性(system properties)的区别

路径以及依赖

客户端路径

由 hadoop jar <jar> 设置的用户客户端类路径包括以下几个组成部分:

  • 作业 Jar 文件
  • 作业 Jar 文件中 lib 目录下的所有 Jar 文件以及 classes 目录(如果有)
  • 由 HADOOP_CLASSPATH 定义的类路径(如果设置)

作业路径

在集群环境中,map 和 reduce 任务各自运行在不同的 JVM 上面,所以他们的 classpath 不能通过 HADOOP_CLASSPATH 来进行控制

HAOOP_CLASSPATH 是一个客户端设置,且只能为驱动器 JVM 设置 classpath,也就是提交作业的的 JVM

用户的任务类路径有如下构成:

  • 作业 Jar 文件
  • 作业 Jar 文件中 lib 目录下的所有 Jar 文件以及 classes 目录(如果有)
  • 任何通过 -libjars 选项添加到分布式缓存的文件,或者通过 addFileToClassPath() 方法添加的文件

打包依赖

打包依赖有如下实践方法

  • 将库包和重新打包进作业 JAR
  • 将作业 JAR 和 lib 目录中的库打包
  • 保持库与作业 JAR 分开,并且通过 HADOOP_CLASSPATH 将它们添加到客户端类路径,通过 -libjars 将它们添加到任务的类路径

从创建的角度看,最后使用分布式缓存的选项是最简单的,因为依赖不需要再作业的 JAR 中重新创建。使用分布式缓存意味着在集群上更少的 JAR 文件转移(因为文件可能换在任务之间的一个节点上)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • 目的这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。先决条件请先确认Had...
    SeanC52111阅读 1,725评论 0 1
  • MapReduce是一个数据处理的编程模型。这个模型很简单,但也不是简单到不能够支持一些有用的语言。Hadoop能...
    单行线的旋律阅读 1,518评论 0 2
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,807评论 6 342
  • 先思考问题 我们处在一个大数据的时代已经是不争的事实,这主要表现在数据源多且大,如互联网数据,人们也认识到数据里往...
    墙角儿的花阅读 7,361评论 0 9