一、API的配置---Configuration类

  • API的配置:Hadoop提供了专门的API对资源进行配置,Configuration类的实例(在org.apache.hadoop.conf包)包括配置属性及其值的集合。每个属性是一个String类型,值的类型可能是以以下的多种类型:包括了Java基本类型(如boolean、int、long、float)和其他一些有用的类型。配置从给定资源中读取它们的属性,通常是名-值对构成的结构简单的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-weigth</name>
    <value>${size},${weight}</value>
    <description>Size and weight</description>
    </property>
    </configuration>
     Configuration conf = new Configuration();
    conf.addResource("configuration-1.xml");
    System.out.println(conf.get("color"));
    System.out.println(conf.getInt("size",0));
    System.out.println(conf.get("breadth","wide"));

  • 合并配置文件:在Hadoop中,core-default.xml文件定义系统的默认属性,而core-site.xml定义特定重写的属性。如果同时定义多个配置文件,那么后来加入的属性将会覆盖之前定义的属性,但是如果final被标记为true的时候,该属性将无法被覆盖,系统会报配置出错。
  • 扩展属性
    1. 配置的属性可以由其他属性或者系统属性来定义,如${size},${weigth}
    2. 系统属性定义属性,即System.setProperty("size",14),并且优先级高于文件资源所定义的属性
    3. 在命令行中使用JVM参数-Dproperty=value来重写属性

二、配置开发环境

  • conf选项:可以方便地切换配置文件
  • GenericOptionsParser,Tool和ToolRunner:GenericOptionsParser一个解释普通Hadoop命令行选项的类,可以根据应用需要在Configuration对象中进行设置,不过通常不这样使用,而是使用ToolRunnner,因为其实现了Tool接口,运行比较方便。

     public interface Tool extends Configurabel{
    int run(String [] args) throws Exception;
    }
     public class ConfigurationPrinter extends Configured implements Tool {
    static{
    Configuration.addDefaultResource("hdfs-default.xml");
    Configuration.addDefaultResource("hdfs-site.xml");
    Configuration.addDefaultResource("mapred-default.xml");
    Configuration.addDefaultResource("mapred-site.xml");
    } @Override
    public int run(String[] args) throw Exception{
    Configuration conf = getconf();
    for(Entry<String,String> entry:conf){
    System.out.printf("%s=%s\n",entry.getKey(),entry.getValue());
    }
    return 0;
    } public static void main(String[] args) throw Exception {
    int exitcode = ToolRunner.run(new ConfigurationPrinter,args);
    System.exit(exitCode);
    } }

三、编写单元测试

四、本地运行测试数据

五、在集群上运行

六、作业调优

  • 作业优化检查表格

    优化内容 最佳实践
    mapper的数量

    运行mapper需要多久时间?如果平均只运行几秒钟,则可以看是否能用能少的mapper运行

    更长的时间,通常是一分钟左右,时间的长度取决于使用的输入格式

    reducer的数量

    为了达到最高性能,reducer的数目应该比reducer槽的数目稍微少一点。这使得reducer能一

    次性完成任务,并在reducer阶段充分利用集群。

    combiner 作业能否充分利用combiner来减少通过shuffle传输数据
    中间值的产生 对map输出进行压缩能使作业执行更快
    自定义序列 如果正在使用自己定义的Writable对象或自定义的comparator,则必须确保已实现RawComparator
    shuffle运行 MapReduce shuffle可以对一些内存管理参数进行调整,将弥补性能上的不足。
  • HPROC分析工具:HPROC是一个JDK自带的分析工具,虽然只有基本的功能,但是同样能提供程序CPU运行和堆使用情况等相关有用的信息。

     conf.setProfileEnabled(true);//默认状态下,HPROF是关闭的,启用分析工具
    conf.setProfileParams("-agentlib:hprof=cpu=samples,heap=sites,depth=6,"+
    "force=n,thread=y,verbose=n,file=%s");//设置分析参数,既传到任务JVM的额外的命令行参数
    conf.setProfileTaskRange(true,"0-2");
    //指定分析的任务,第一个参数指明这是map任务的范围还是reduce任务的范围,如果是true代表是map,false代表的是reduce
    //第二个参数,指明要分析任务的ID

七、MapReduce的工作流

《Hadoop权威》学习笔记五:MapReduce应用程序的更多相关文章

  1. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  2. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  3. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  4. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  5. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  6. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  7. Linux学习笔记(五) 账号管理

    1.用户与组账号 用户账号:包括实际人员和逻辑性对象(例如应用程序执行特定工作的账号) 每一个用户账号包含一个唯一的用户 ID 和组 ID 标准用户是系统安装过程中自动创建的用户账号,其中除 root ...

  8. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  9. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  10. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

随机推荐

  1. c++实现dll注入其它进程

    DLL注入技术才具有强大的功能和使用性,同时简单易用,因为DLL中可以实现复杂的功能和很多的技术. 技术要点: 1.宿主进程调用LoadLibrary,就可以完成DLL的远程注入.可以通过Create ...

  2. 转:fopen与open可以转换吗

    绝对不可以.fopen是C运行库级别的函数,而open是system call的wrapper routine.fopen返回FILE *的指针,这个结构本身维护着一些关于这个文件的信息,而open返 ...

  3. Ubuntu12.04 下搭建Java开发环境

    1:下载 jdk-7u40-linux-i586.tar.gz. 2:解压安装. (1)创建jvm目录:sudo mkdir -p /usr/lib/jvm (2)sudo tar zxvf ./ j ...

  4. 2014-07-24 .NET实现微信公众号的消息回复与自定义菜单

    今天是在吾索实习的第12天.我们在这一天中,基本实现了微信公众号的消息回复与自定义菜单的创建. 首先,是实现消息回复,其关键点如下: 读取POST来的数据流:Stream 数据流变量 = HttpCo ...

  5. HDU_2036——多边形面积,行列式计算

    Problem Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)”话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也 ...

  6. zookeeper[4] 安装windows zookeeper,及问题处理

    安装步骤: 1.在如下路径下载zookeeper-3.4.7.tar.gz http://mirrors.cnnic.cn/apache/zookeeper/stable/ 2.解压zookeeper ...

  7. OSI七层结构

  8. appium新版本不支持findElementByName,切换到findElementByAndroidUIAutomator

    appium 1.7.6 不支持findElementByName(locator)  不知道为什么? 脚本中许多这样的语句,麻烦事情多了 org.openqa.selenium.InvalidSel ...

  9. TypeScript 素描 - 装饰器

    /* 装饰器 简单理解为C#中的Attribute 可以装饰到类.函数.讯问符.属性.参数上 语法 @xxx 装饰器其实是一个函数 @xxx 就要有一个 function xxx 多个装饰器可以用来装 ...

  10. DataGrid横向滚动条无法拖动的问题

    项目中经常遇到一些问题,这些问题可能很简单,但是之前从未遇到,可能经过了一番谷歌,也可能是查阅了MSDN,或是借鉴了大牛博客,逐渐有了些眉目,为了将这些东西落地,也为了将来之不易的东西记录下来,以备今 ...