`
longzhun
  • 浏览: 370081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop MapReduce开发最佳实践

 
阅读更多

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运行和参数配置,你是否有下面的烦恼:

  1. 将MapReduce Job配置参数写到java代码里,一旦变更意味着修改java文件源码、编译、打包、部署一连串事情。
  2. 当MapReduce 依赖配置文件的时候,你需要手工编写java代码使用DistributedCache将其上传到HDFS中,以便map和reduce函数可以读取。
  3. 当你的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);
    }
}

看看代码上有什么不同:

  1. 让WordCount继承Configured并实现Tool接口。
  2. 重写Tool接口的run方法,run方法不是static类型,这很好。
  3. 在WordCount中我们将通过getConf()获取Configuration对象。

关于GenericOptionsParser更多用法,请点击这里:GenericOptionsParser.html

推荐指数:★★★★

推荐理由:通过简单的几步,就可以实现代码与配置隔离、上传文件到DistributeCache等功能。修改MapReduce参数不需要修改java代码、打包、部署,提高工作效率。

分享到:
评论

相关推荐

    mapred.zip_hadoop_hadoop mapreduce_mapReduce

    在"mapred.zip"中,文档部分可能涵盖了MapReduce的基本概念、编程模型、配置指南以及最佳实践等内容,这对于初学者来说是很好的学习材料。源码部分则可以让开发者深入了解MapReduce作业的内部工作流程,以及如何编写...

    hadoop mapreduce

    文档还介绍了一些其他有用的特性,这些特性可能包括在开发MapReduce应用程序时的一些高级配置选项、优化技巧以及在生产环境中部署和维护MapReduce应用程序的最佳实践。 总而言之,Hadoop MapReduce文档是一份全面的...

    基于Hadoop下MapReduce框架的并行C4.5算法.zip

    总的来说,这个项目为学习者提供了一个宝贵的实践平台,帮助他们掌握Hadoop MapReduce的基本原理和C4.5决策树算法的并行实现,同时对分布式机器学习有更深入的理解。这在当今数据驱动的世界中具有极高的实用价值和...

    java项目Hadoop依赖包

    在Java项目中,Hadoop是一个不可或缺的开源框架,主要用于处理和存储海量数据。这个"java项目Hadoop依赖包...在使用过程中,了解和掌握Hadoop的相关概念、API及最佳实践,将有助于提高项目开发效率和系统的稳定性。

    hadoop-eclipse-plugin-2.6.0.jar.zip_2.6.0_hadoop_hadoop plugin

    三、最佳实践 1. **版本匹配**:确保插件版本与所使用的Hadoop版本兼容,以避免可能出现的问题。 2. **日志查看**:利用Eclipse的输出视图跟踪作业的运行状态和日志信息,帮助诊断问题。 3. **优化调试**:在调试...

    myeclipse开发hadoop插件

    在IT行业中,开发分布式计算系统如Hadoop通常需要借助特定的开发工具和插件来提升效率。MyEclipse,作为一款强大的...随着技术的发展,开发者应当持续关注新的开发工具和最佳实践,以适应不断演进的大数据生态系统。

    Hadoop应用开发技术详解pdf 

    阅读《Hadoop应用开发技术详解》这本书,你将获得关于Hadoop的全面知识,包括安装、配置、编程模型、生态系统组件以及最佳实践等。通过学习和实践,你将具备开发高效Hadoop应用的能力,跟上大数据时代的步伐。 总之...

    eclipse hadoop2 插件

    7. **最佳实践**:为了充分利用这个插件,建议保持Eclipse、Hadoop插件和Hadoop集群的版本协调一致,同时定期更新插件以获取最新的功能和修复。 8. **学习资源**:网上有许多教程和社区资源可以帮助学习如何使用...

    hadoop_operations

    此外,书中还包含了性能优化技巧、故障排除策略以及最佳实践建议,帮助读者构建高效、可靠的大数据分析系统。 总之,Hadoop与MapReduce不仅是大数据分析领域的核心技术,也是推动数据驱动决策和创新的重要工具。...

    hadoop-eclipse-plugin-1.1.2

    除了基本的MapReduce开发,Hadoop Eclipse Plugin还可以与其他插件结合,例如使用m2eclipse(Maven Eclipse Integration)来管理依赖,或者与Pig、Hive等大数据工具集成,实现更复杂的数据分析任务。 总结来说,...

    Hadoop学习网址

    - **最佳实践**: 分享了一些实际应用场景下的配置和优化技巧,帮助用户更好地利用Hadoop解决实际问题。 #### 二、Wikipedia上的Hadoop条目 - **网址**: [Wikipedia上的Hadoop页面]...

    hadoop shell操作与程式开发

    1. **hadoop程式開發.docx**:可能详细介绍了Hadoop程序开发的步骤、最佳实践,或者包含了一些示例代码。 2. **实验.docx**:可能包含了Hadoop相关的实验指导,例如设置Hadoop环境、执行MapReduce任务等,帮助读者...

    阿里云 专有云企业版 V3.8.0 E-MapReduce 开发指南 20190621.pdf

    阿里云专有云企业版V3.8.0的E-MapReduce开发指南是一份详细介绍如何在阿里云专有云环境中开发和应用MapReduce服务的文档。E-MapReduce是基于开源Hadoop MapReduce构建的云服务,它为企业提供了高效、易用的大数据...

    Hadoop开发指南(第四版)_ORelly出版

    这本书全面涵盖了Hadoop生态系统的核心组件、原理、配置以及最佳实践,是理解、学习和应用Hadoop不可或缺的资源。 Hadoop是Apache软件基金会开发的一个开源框架,主要用于处理和存储大规模数据集。其核心由两个主要...

    Hadoop Spark大数据巨量分析与机器学习整合开发实战 ,林大贵

    实战开发部分,作者会展示如何结合Hadoop和Spark进行项目实践。这可能包括构建一个完整的数据处理流程,从数据的收集、存储、处理到分析和机器学习模型的训练与部署。这部分内容会涉及到使用Hadoop的HDFS和MapReduce...

    Hadoop应用开发技术详解PDF电子书下载 带书签目录 部分

    综上所述,《Hadoop应用开发技术详解》这本书应该涵盖了上述知识点,并提供了丰富的实例和练习,帮助读者全面掌握Hadoop应用开发的核心技术和最佳实践。如果对这部分内容感兴趣,建议获取完整版本以获得更深入的学习...

    Hadoop应用开发技术详解

    通过《Hadoop应用开发技术详解》的学习,开发者可以深入了解Hadoop的工作原理,掌握其开发工具和最佳实践,从而在大数据领域游刃有余。无论是进行数据处理、分析还是构建复杂的大数据应用,这本书都能提供有力的技术...

    阿里云 专有云企业版 V3.7.0 E-MapReduce 开发指南 20190320.pdf

    9. **最佳实践**:为了提高效率和性能,指南可能会提供一些最佳实践,如数据分区策略、资源调度优化等。 值得注意的是,由于文档版本为20190320,某些信息可能已经过时,用户需要定期查看阿里云的最新文档以获取...

Global site tag (gtag.js) - Google Analytics