第六章 开发一个MapReduce应用 第一节 配置

在第二章中,我们介绍了MapReduce模式。在本章中,我们看看在实际中开发一个MapReduce

应用。

写一个MapReduce程序要遵循一个特定的模式。开始时你要写map和reduce函数,最好把单元

测试也写上,确保程序做了你想做的。然后你写一个驱动程序来运行一个job,它可以使用数据的一

小部分在你的集成开发环境中运行以检查它是否正常工作。如果失败,你需要使用你的IDE调试器来

找到程序的问题。然后你可以扩展你的单元测试来覆盖这种情况,促使你的map或reduce可以正确

处理这种输入。

当程序在部分数据集上运行与预期一致时,你就可以把它发布到集群上了。运行在完整数据集上

可能暴露更多的问题,你可以象之前那样修正它,通过扩展你的测试并修改你的map和reduce来处理

新的问题。在集群中调试是一个挑战,所以我们来查看一些可以使它简单的常用的技术。

在程序工作后,你也许希望做一些调整,首先,运行一些标准测试来使mapreduce程序更快,

其次是任务分析。分析分布式程序不是那么容易的,但HADOOP有一些针对这个处理的工具。

在我们开始写一个mapreduce程序之前,我们需要建立并配置开发环境。为了它,我们需要学习

一些关于HADOOP如何配置的东西。

配置API

HADOOP组件使用HADOOP自己的配置API来配置。类Configuration的实例(org.apache.hadoop.conf

包中)表示了配置的属性和值的集合。每一个属性的名称是一个String,值可能是java基本数据类型中的一

个,包括boolean,int ,long,float等,其它一些有用的类型如:String,Class及java.io.File;及String集合。

Configuration从XML文件中读取它们的属性,XML文件定义了简单的name-value对的结构。见例6-1.

Example 6-1. A simple configuration file, configuration-1.xml
<?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>

假设这个配置在一个名为configuration-1.xml的文件中,我们可以使用如下的代码来访问它的属性:

Configuration conf = new Configuration();
conf.addResource("configuration-1.xml");
assertThat(conf.get("color"), is("yellow"));
assertThat(conf.getInt("size", 0), is(10));
assertThat(conf.get("breadth", "wide"), is("wide"));

有两件事需要注意:类型信息没有保存在XML文件中;属性在读取时可以解释为指定的类型。同时,

get()方法允许你指定一个默认的值,用在属性没有定义在XML文件的情况,如这里的breadth。

资源整合

定义一个Configuration时使用多个资源文件,情况就变得有趣了。这个在HADOOP中用来分离出系统

的默认属性,定义在内部的一个叫core-default.xml的文件中,覆盖core-site.xml中的特定于平台的属性。

例6-2定义了size和weight属性。

Example 6-2. A second configuration file, configuration-2.xml
<?xml version="1.0"?>
<configuration>
    <property>
        <name>size</name>
        <value>12</value>
    </property>
    <property>
        <name>weight</name>
        <value>light</value>
    </property>
</configuration>

资源按序添加到Configuration:

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

定义在后加的资源文件中的属性会覆盖前面定义的。所以size属性取的值是第二个配置文件:

assertThat(conf.getInt("size", 0), is(12));

尽管如此,标记了final的属性不能被覆盖。在第一个配置文件中,weight属性是final的,所以第二个文件试图

覆盖时会失败,它从第一个文件中取值:

assertThat(conf.get("weight"), is("heavy"));

试图覆盖final属性通常导致配置错误,其结果是在日志文件中有一条警告信息来辅助诊断。管理员把属性标记

为final表示他不希望用户在他们的客户端文件或提交参数中修改它。

变量扩展

配置属性可以通过其它属性或系统属性的形式定义。例如,第一个配置文件中的属性size-weight定义为${size},${weight},

这些属性使用配置中的值来扩展:

assertThat(conf.get("size-weight"), is("12,heavy"));

System的属性比定义在资源文件中的属性优先:

System.setProperty("size", "14");
assertThat(conf.get("size-weight"), is("14,heavy"));

这个特性很有用,可以通过命令行来覆盖属性,通过JVM的-Dproperty=value参数来定义。

注意,尽管配置属性可以以系统属性的形式定义,但是它不能通过配置API访问,除非系统属性以配置属性的形式重新定义:

System.setProperty("length", "2");
assertThat(conf.get("length"), is((String) null));
时间: 2024-11-07 10:21:28

第六章 开发一个MapReduce应用 第一节 配置的相关文章

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数

Android深度探索(卷1)HAL与驱动开发 第六章 第一个Linux驱动程序:统计单词个数 统计单词个数的功能是封装在Linux驱动中的. Linux驱动的工作和访问方式是Linux亮点之一,同时受到了业界大防范好评.Linux系统将每一个驱动都映射成一个文件.这些文件称为设备文件或者驱动文件,都保存在 /dev 目录中.这种设计理念使得与Linux驱动进行交互就像与普通文件进行交互一样容易.当然,也比访问Linux API 更容易.由于大多数Linux驱动都有与其对应的设备文件,因此与Li

鸟哥的Linux私房菜_基础版_学习笔记2:第六章 linux的文件权限与目录配置

第六章 linux的文件权限与目录配置 6.1.用户与用户组 1.文件拥有者 2.群组概念 3.其他人的概念 在Linux里面,任何一个文件都有"User,Group和Others"3种身份的个别权限. 我们以王三毛为例,王三毛这个『文件』的拥有者为王三毛,他属于王大毛这个群组, 而张小猪相对于王三毛,则只是一个『其他人(others)』而已. 不过,这里有个特殊的人物要来介绍的,那就是『万能的天神』!这个天神具有无限的神力, 所以他可以到达任何他想要去的地方,呵呵!那个人在Linux

第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触

http://blog.csdn.net/visioncat/article/details/1596576 GCC for Win32 开发环境介绍(5) 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触 SDL,也就是 Simple DirectMedia Layer 是一个针对 声音,键盘,鼠标,遥杆,通过OpenGL的3D以及2D处理的底层跨平台函数库.她主要支持的平台有Linux, Windows, Windows CE, BeOS, MacOS, Mac OS X,

第六章 Linux的文件权限与目录配置

第六章 Linux的文件权限与目录配置 6.1Linux用户身份与用户组记录的文件 每个账号都可以有多个用户组支持 /etc/passwd              用户账号 /etc/shadow             账号密码 /etc/group                 组账号 6.2权限 文件的RWX权限只涉及对文件内容的约束 文件夹的RWX权限只涉及对文件夹下的文件的约束 ls原理:根据身份对文件夹访问时,若该身份对该文件夹为r--,则结果只返回文件名列表:若为r-x,返回文

Android深度探索(卷1)HAL与驱动开发 第六章&#160;第一个Linux驱动程序:统计单词个数 读书笔记

本章是一个具体的例子,来详细的介绍开发和测试Linux驱动程序的完整过程.尤其是测试Linux驱动.在这个统计单词个数的实例中,重点是该算法的实现技术:即Linux驱动,而不是如何统计的. 6.1Linux驱到底是什么 Linux驱动的工作方式和访问方式是Linux的特点之一.Linux系统将每一个驱动都映射成一个文件,这些文件被称为驱动文件或设备文件,保存在dev目录中.由于大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据就变成了与设备文件交换数据.事实上,编写Linu

第六章第一个Linux驱动程序:统计单词个数

第六章介绍如何在多种平台,使用多种方法测试Linux驱动. 本章主讲统计单词个数的算法的实现技术:Linux驱动.统计单词个数的功能是封装在Linux驱动中的.驱动不一定是直接和硬件打交道的,还可以喝普通的library一样提供其他程序的调用来实现特定功能的. 第一节Linux驱动到底是个什么东西 Linux驱动和普通的Linux API没有本质上的区别,只是使用Linux驱动的方式和使用Linux API的方法不同. Linux系统将每一个驱动都映射成一个文件,这些文件称为设备文件或驱动文件,

第六章 第一个Linux驱动程序:统计单词个数

在本章将进入了最令人激动的时刻,为了是读者在刚开始学习Linux驱动开发时充满期待,没有只提供Helloworld程序. 首先介绍Linux驱动到底是个什么东西,它和我们以前接触过的windows类型差不多,但是操作和工作方式有很大的区别,Linux系统将每一个驱动都映射成一个文件.这些文件成为设备文件或这驱动文件,都保存在/dev目录中. 接下来给出编写Linux驱动程序的步骤:第一步:建立Linux驱动骨架,Linux驱动程序中需要提供两个函数来分别处理驱动初始化和退出的工作.这两个函数分别

第六章 第一个Linux驱动程序: 统计单词个数

本章作为实战第一章,首先要做的就是了解linux驱动到底是个什么东西,首先了解linux驱动的工作方式,linux系统将每一个驱动都映射成一个文件,保存在/dev中,再使用c语言函数ioctl向驱动的设备文件发送打印命令. 一.编写Linux驱动程序 1.建立Linux驱动骨架 Linux内核在使用驱动时需要装载与卸载驱动 装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化 卸载驱动:删除设备文件.释放内存地址空间等:module_exit函数处理退出 包含这

第六章 第一个Linux驱动程序:统计单词个数 心得笔记

一.Linux系统将每个驱动都映射成一个文件.这些文件称为设备文件或驱动文件,都保存在/dev目录中.这使得与Linux驱动进行交互就向与普通文件进行交互一样容易.大多数Linux驱动都有与其对应的设备文件,因此与Linux驱动交换数据变成与驱动设备交换数据. 二.编写Linux驱动程序 1.建立Linux驱动骨架           Linux内核在使用驱动时需要装载与卸载驱动        装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化