MapRuduce开发对于大多数程序员都会觉得略显复杂,运行一个WordCount(Hadoop中hello word程序)不仅要熟悉MapRuduce模型,还要了解Linux命令(尽管有Cygwin,但在Windows下运行MapRuduce仍然很麻烦),此外还要学习程序的打包、部署、提交job、调试等技能,这足以让很多学习者望而退步。
所以如何提高MapReduce开发效率便成了大家很关注的问题。但Hadoop的Committer早已经考虑到这些问题,从而开发了ToolRunner、MRunit(MapReduce最佳实践第二篇中会介绍)、MiniMRCluster、MiniDFSCluster等辅助工具,帮助解决开发、部署等问题。举一个自己亲身的例子:
某周一和搭档(结对编程)决定重构一个完成近10项统计工作的MapRuduce程序,这个MapReduce(从Spring项目移植过来的),因为依赖Spring框架(原生Spring,非Spring Hadoop框架),导致性能难以忍受,我们决定将Spring从程序中剔除。重构之前程序运行是正确的,所以我们要保障重构后运行结果与重构前一致。搭档说,为什么我们不用TDD来完成这个事情呢?于是我们研究并应用了MRunit,令人意想不到的是,重构工作只用了一天就完成,剩下一天我们进行用findbug扫描了代码,进行了集成测试。这次重构工作我们没有给程序带来任何错误,不但如此我们还拥有了可靠的测试和更加稳固的代码。这件事情让我们很爽的同时,也在思考关于MapReduce开发效率的问题,要知道这次重构我们之前评估的时间是一周,我把这个事情分享到EasyHadoop群里,大家很有兴趣,一个朋友问到,你们的评估太不准确了,为什么开始不评估2天完成呢?我说如果我们没有使用MRUnit,真的是需要一周才能完成。因为有它单元测试,我可以在5秒内得到我本次修改的反馈,否则至少需要10分钟(编译、打包、部署、提交MapReduce、人工验证结果正确性),而且重构是个反复修改,反复运行,得到反馈,再修改、再运行、再反馈的过程,MRunit在这里帮了大忙。
相同智商、相同工作经验的开发人员,借助有效的工具和方法,竟然可以带来如此大的开发效率差距,不得不让人惊诧!
PS. 本文基于Hadoop 1.0(Cloudera CDH3uX)。本文适合读者:Hadoop初级、中级开发者。
1. 使用ToolRunner让参数传递更简单
关于MapReduce运行和参数配置,你是否有下面的烦恼:
- 将MapReduce Job配置参数写到java代码里,一旦变更意味着修改java文件源码、编译、打包、部署一连串事情。
- 当MapReduce 依赖配置文件的时候,你需要手工编写java代码使用DistributedCache将其上传到HDFS中,以便map和reduce函数可以读取。
- 当你的map或reduce 函数依赖第三方jar文件时,你在命令行中使用”-libjars”参数指定依赖jar包时,但根本没生效。
其实,Hadoop有个ToolRunner类,它是个好东西,简单好用。无论在《Hadoop权威指南》还是Hadoop项目源码自带的example,都推荐使用ToolRunner。
下面我们看下src/example目录下WordCount.java文件,它的代码结构是这样的:
public class WordCount { // 略... public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs(); // 略... Job job = new Job(conf, "word count"); // 略... System.exit(job.waitForCompletion(true) ? 0 : 1); } }
WordCount.java中使用到了GenericOptionsParser这个类,它的作用是将命令行中参数自动设置到变量conf中。举个例子,比如我希望通过命令行设置reduce task数量,就这么写:
bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5
上面这样就可以了,不需要将其硬编码到java代码中,很轻松就可以将参数与代码分离开。
其它常用的参数还有”-libjars”和-“files”,使用方法一起送上:
bin/hadoop jar MyJob.jar com.xxx.MyJobDriver -Dmapred.reduce.tasks=5 \ -files ./dict.conf \ -libjars lib/commons-beanutils-1.8.3.jar,lib/commons-digester-2.1.jar
参数”-libjars”的作用是上传本地jar包到HDFS中MapReduce临时目录并将其设置到map和reduce task的classpath中;参数”-files”的作用是上传指定文件到HDFS中mapreduce临时目录,并允许map和reduce task读取到它。这两个配置参数其实都是通过DistributeCache来实现的。
至此,我们还没有说到ToolRunner,上面的代码我们使用了GenericOptionsParser帮我们解析命令行参数,编写ToolRunner的程序员更懒,它将 GenericOptionsParser调用隐藏到自身run方法,被自动执行了,修改后的代码变成了这样:
public class WordCount extends Configured implements Tool { @Override public int run(String[] arg0) throws Exception { Job job = new Job(getConf(), "word count"); // 略... System.exit(job.waitForCompletion(true) ? 0 : 1); return 0; } public static void main(String[] args) throws Exception { int res = ToolRunner.run(new Configuration(), new WordCount(), args); System.exit(res); } }
看看代码上有什么不同:
- 让WordCount继承Configured并实现Tool接口。
- 重写Tool接口的run方法,run方法不是static类型,这很好。
- 在WordCount中我们将通过getConf()获取Configuration对象。
关于GenericOptionsParser更多用法,请点击这里:GenericOptionsParser.html
推荐指数:★★★★
推荐理由:通过简单的几步,就可以实现代码与配置隔离、上传文件到DistributeCache等功能。修改MapReduce参数不需要修改java代码、打包、部署,提高工作效率。
相关推荐
在"mapred.zip"中,文档部分可能涵盖了MapReduce的基本概念、编程模型、配置指南以及最佳实践等内容,这对于初学者来说是很好的学习材料。源码部分则可以让开发者深入了解MapReduce作业的内部工作流程,以及如何编写...
文档还介绍了一些其他有用的特性,这些特性可能包括在开发MapReduce应用程序时的一些高级配置选项、优化技巧以及在生产环境中部署和维护MapReduce应用程序的最佳实践。 总而言之,Hadoop MapReduce文档是一份全面的...
总的来说,这个项目为学习者提供了一个宝贵的实践平台,帮助他们掌握Hadoop MapReduce的基本原理和C4.5决策树算法的并行实现,同时对分布式机器学习有更深入的理解。这在当今数据驱动的世界中具有极高的实用价值和...
在Java项目中,Hadoop是一个不可或缺的开源框架,主要用于处理和存储海量数据。这个"java项目Hadoop依赖包...在使用过程中,了解和掌握Hadoop的相关概念、API及最佳实践,将有助于提高项目开发效率和系统的稳定性。
三、最佳实践 1. **版本匹配**:确保插件版本与所使用的Hadoop版本兼容,以避免可能出现的问题。 2. **日志查看**:利用Eclipse的输出视图跟踪作业的运行状态和日志信息,帮助诊断问题。 3. **优化调试**:在调试...
在IT行业中,开发分布式计算系统如Hadoop通常需要借助特定的开发工具和插件来提升效率。MyEclipse,作为一款强大的...随着技术的发展,开发者应当持续关注新的开发工具和最佳实践,以适应不断演进的大数据生态系统。
阅读《Hadoop应用开发技术详解》这本书,你将获得关于Hadoop的全面知识,包括安装、配置、编程模型、生态系统组件以及最佳实践等。通过学习和实践,你将具备开发高效Hadoop应用的能力,跟上大数据时代的步伐。 总之...
7. **最佳实践**:为了充分利用这个插件,建议保持Eclipse、Hadoop插件和Hadoop集群的版本协调一致,同时定期更新插件以获取最新的功能和修复。 8. **学习资源**:网上有许多教程和社区资源可以帮助学习如何使用...
此外,书中还包含了性能优化技巧、故障排除策略以及最佳实践建议,帮助读者构建高效、可靠的大数据分析系统。 总之,Hadoop与MapReduce不仅是大数据分析领域的核心技术,也是推动数据驱动决策和创新的重要工具。...
除了基本的MapReduce开发,Hadoop Eclipse Plugin还可以与其他插件结合,例如使用m2eclipse(Maven Eclipse Integration)来管理依赖,或者与Pig、Hive等大数据工具集成,实现更复杂的数据分析任务。 总结来说,...
- **最佳实践**: 分享了一些实际应用场景下的配置和优化技巧,帮助用户更好地利用Hadoop解决实际问题。 #### 二、Wikipedia上的Hadoop条目 - **网址**: [Wikipedia上的Hadoop页面]...
1. **hadoop程式開發.docx**:可能详细介绍了Hadoop程序开发的步骤、最佳实践,或者包含了一些示例代码。 2. **实验.docx**:可能包含了Hadoop相关的实验指导,例如设置Hadoop环境、执行MapReduce任务等,帮助读者...
阿里云专有云企业版V3.8.0的E-MapReduce开发指南是一份详细介绍如何在阿里云专有云环境中开发和应用MapReduce服务的文档。E-MapReduce是基于开源Hadoop MapReduce构建的云服务,它为企业提供了高效、易用的大数据...
这本书全面涵盖了Hadoop生态系统的核心组件、原理、配置以及最佳实践,是理解、学习和应用Hadoop不可或缺的资源。 Hadoop是Apache软件基金会开发的一个开源框架,主要用于处理和存储大规模数据集。其核心由两个主要...
实战开发部分,作者会展示如何结合Hadoop和Spark进行项目实践。这可能包括构建一个完整的数据处理流程,从数据的收集、存储、处理到分析和机器学习模型的训练与部署。这部分内容会涉及到使用Hadoop的HDFS和MapReduce...
综上所述,《Hadoop应用开发技术详解》这本书应该涵盖了上述知识点,并提供了丰富的实例和练习,帮助读者全面掌握Hadoop应用开发的核心技术和最佳实践。如果对这部分内容感兴趣,建议获取完整版本以获得更深入的学习...
通过《Hadoop应用开发技术详解》的学习,开发者可以深入了解Hadoop的工作原理,掌握其开发工具和最佳实践,从而在大数据领域游刃有余。无论是进行数据处理、分析还是构建复杂的大数据应用,这本书都能提供有力的技术...
9. **最佳实践**:为了提高效率和性能,指南可能会提供一些最佳实践,如数据分区策略、资源调度优化等。 值得注意的是,由于文档版本为20190320,某些信息可能已经过时,用户需要定期查看阿里云的最新文档以获取...