《Hadoop权威》学习笔记五:MapReduce应用程序
一、API的配置---Configuration类
- API的配置:Hadoop提供了专门的API对资源进行配置,Configuration类的实例(在org.apache.hadoop.conf包)包括配置属性及其值的集合。每个属性是一个String类型,值的类型可能是以以下的多种类型:包括了Java基本类型(如boolean、int、long、float)和其他一些有用的类型。配置从给定资源中读取它们的属性,通常是名-值对构成的结构简单的XML文件
1 <?xml version="1.0"?> 2 <configuration> 3 <property> 4 <name>color</name> 5 <value>yellow</value> 6 <description>Color</description> 7 </property> 8 9 <property> 10 <name>size</name> 11 <value>10</value> 12 <description>Size</description> 13 </property> 14 15 <property> 16 <name>weight</name> 17 <value>heavy</value> 18 <final>true</final> 19 <description>Weight</description> 20 </property> 21 22 <property> 23 <name>size-weigth</name> 24 <value>${size},${weight}</value> 25 <description>Size and weight</description> 26 </property> 27 </configuration>
1 Configuration conf = new Configuration(); 2 conf.addResource("configuration-1.xml"); 3 System.out.println(conf.get("color")); 4 System.out.println(conf.getInt("size",0)); 5 System.out.println(conf.get("breadth","wide"));
- 合并配置文件:在Hadoop中,core-default.xml文件定义系统的默认属性,而core-site.xml定义特定重写的属性。如果同时定义多个配置文件,那么后来加入的属性将会覆盖之前定义的属性,但是如果final被标记为true的时候,该属性将无法被覆盖,系统会报配置出错。
- 扩展属性
- 配置的属性可以由其他属性或者系统属性来定义,如${size},${weigth}
- 系统属性定义属性,即System.setProperty("size",14),并且优先级高于文件资源所定义的属性
- 在命令行中使用JVM参数-Dproperty=value来重写属性
二、配置开发环境
- conf选项:可以方便地切换配置文件
- GenericOptionsParser,Tool和ToolRunner:GenericOptionsParser一个解释普通Hadoop命令行选项的类,可以根据应用需要在Configuration对象中进行设置,不过通常不这样使用,而是使用ToolRunnner,因为其实现了Tool接口,运行比较方便。
1 public interface Tool extends Configurabel{ 2 int run(String [] args) throws Exception; 3 }
1 public class ConfigurationPrinter extends Configured implements Tool { 2 static{ 3 Configuration.addDefaultResource("hdfs-default.xml"); 4 Configuration.addDefaultResource("hdfs-site.xml"); 5 Configuration.addDefaultResource("mapred-default.xml"); 6 Configuration.addDefaultResource("mapred-site.xml"); 7 } 8 9 @Override 10 public int run(String[] args) throw Exception{ 11 Configuration conf = getconf(); 12 for(Entry<String,String> entry:conf){ 13 System.out.printf("%s=%s\n",entry.getKey(),entry.getValue()); 14 } 15 return 0; 16 } 17 18 public static void main(String[] args) throw Exception { 19 int exitcode = ToolRunner.run(new ConfigurationPrinter,args); 20 System.exit(exitCode); 21 } 22 23 24 }
三、编写单元测试
四、本地运行测试数据
五、在集群上运行
六、作业调优
- 作业优化检查表格
优化内容 最佳实践 mapper的数量 运行mapper需要多久时间?如果平均只运行几秒钟,则可以看是否能用能少的mapper运行
更长的时间,通常是一分钟左右,时间的长度取决于使用的输入格式
reducer的数量 为了达到最高性能,reducer的数目应该比reducer槽的数目稍微少一点。这使得reducer能一
次性完成任务,并在reducer阶段充分利用集群。
combiner 作业能否充分利用combiner来减少通过shuffle传输数据 中间值的产生 对map输出进行压缩能使作业执行更快 自定义序列 如果正在使用自己定义的Writable对象或自定义的comparator,则必须确保已实现RawComparator shuffle运行 MapReduce shuffle可以对一些内存管理参数进行调整,将弥补性能上的不足。 - HPROC分析工具:HPROC是一个JDK自带的分析工具,虽然只有基本的功能,但是同样能提供程序CPU运行和堆使用情况等相关有用的信息。
1 conf.setProfileEnabled(true);//默认状态下,HPROF是关闭的,启用分析工具 2 conf.setProfileParams("-agentlib:hprof=cpu=samples,heap=sites,depth=6,"+ 3 "force=n,thread=y,verbose=n,file=%s");//设置分析参数,既传到任务JVM的额外的命令行参数 4 conf.setProfileTaskRange(true,"0-2"); 5 //指定分析的任务,第一个参数指明这是map任务的范围还是reduce任务的范围,如果是true代表是map,false代表的是reduce 6 //第二个参数,指明要分析任务的ID
七、MapReduce的工作流