Hadoop MapReduce性能优化(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-18 00:13:01

点击下载

作者:[法]卡勒德·坦尼尔(Khaled Tannir)

出版社:信息技术第一出版分社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Hadoop MapReduce性能优化

Hadoop MapReduce性能优化试读:

前言

MapReduce是一个重要的并行处理模型,用于大规模、数据密集型应用,比如数据挖掘和Web索引。Hadoop作为MapReduce的一个开源实现,广泛用于支持对响应时间要求很严苛的集群计算作业。

多数 MapReduce 程序的开发是以数据分析为目的的,这通常需要花费很长的时间。许多公司正在用 Hadoop 在更大的数据集上做更高级的数据分析,当然这更加需要运行时间的保障。运行效率,尤其是MapReduce的I/O开销,仍然是需要解决的问题。经验表明,配置不当的Hadoop集群会明显降低MapReduce作业的执行性能,甚至会造成显著的性能降级。

在本书中,我们致力于解决MapReduce优化问题:怎样识别系统的短板,怎样做才能充分利用 Hadoop集群资源更好地处理输入数据。本书先介绍MapReduce内部工作原理,并讨论可能影响性能的因素,之后研究Hadoop性能指标(metrics)与性能检测工具,并识别资源短板,如CPU竞争、内存利用率、海量I/O存储以及网络流量。

本书基于实际经验,以循序渐进的方式教读者消除作业瓶颈,并在生产环境下全面优化MapReduce作业。除此之外,读者还将学到如何通过计算得出恰当地处理数据的集群节点数,如何根据硬件资源定义恰当的mapper和reducer任务数,以及如何用压缩技术和combiner优化mapper和reducer任务的性能。

最后,读者将会了解Hadoop集群调优的最佳实践和建议,并认识MapReduce模板类。

本书涵盖的内容

第1章解读MapReduce内在工作原理以及影响MapReduce性能的因素。

第2章介绍Hadoop配置文件以及与MapReduce性能相关的参数,并解释用来监视Hadoop MapReduce 活动的Hadoop 性能指标和几种性能监视工具。

第3章探索Hadoop MapReduce 性能调优周期并解释如何创建性能基线,之后还要学习如何基于Hadoop计数器识别资源瓶颈和短板。

第4章解释如何检查Hadoop集群的“健康状况”并识别CPU和内存利用率、海量I/O存储以及网络流量。此外,还要掌握配置Hadoop集群时如何进行正确的衡量。

第5章展示如何强化map和reduce任务的执行。读者将学习块大小对性能的影响,如何压缩溢写(spill)记录,如何确定map和reduce吞吐量,以及如何调节MapReduce配置参数。

第6章解释何时需要使用combiner和压缩技术优化map和reduce任务,并介绍几种优化应用程序代码的技术。

第7章介绍各种软硬件检查清单、推荐配置和调优属性,以便更合理地使用Hadoop集群。

阅读本书需要做的准备

读者需要Apache Hadoop框架(http://hadoop.apache.org/)以及一台安装了Linux操作系统并运行Hadoop的计算机。

本书的目标读者

对于有经验的 MapReduce 用户或者开发人员,这本书再合适不过了。对于MapReduce初学者或者打算尝试新知识和学习新技术用以优化应用程序的用户,本书也是非常有用的指导手册。虽然读者无需具备创建MapReduce应用的知识,但具备这些知识有助于迅速掌握某些概念,让读者更熟悉MapReduce类模板代码片段。

书中的排版约定

读者会发现,本书中使用了一些不同样式的文本,用以区别不同类型的信息。下面是这些样式的示例及对其含义的解释。

正文中的代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、用户输入等使用等宽字体表示:“我们可以使用include指令包含其他上下文。”

代码块设置如下:

[default]

exten => s,1,Dial(Zap/1|30)

exten => s,2,Voicemail(u100)

exten => s,102,Voicemail(b100)

exten => i,1,Voicemail(s0)

当代码块的特定部分需要提醒读者注意时,相应行或者条目会加粗:

[default]

exten => s,1,Dial(Zap/1|30)

exten => s,2,Voicemail(u100)

exten => s,102,Voicemail(b100)

exten => i,1,Voicemail(s0)

命令行输入和输出按照如下方式书写:

# cp /usr/src/asterisk-addons/configs/cdr_mysql.conf.sample

/etc/asterisk/cdr_mysql.conf

新术语和重要词语用黑体表示。屏幕上显示的单词,比如出现在菜单或者对话框中的文本显示为:“点击Next按钮移到下一屏。”

这样的方框中出现的是警告或重要的注解。

这样的方框中出现的是技巧和提示。

读者反馈

我们总是欢迎来自读者的反馈。请告诉我们你觉得这本书怎么样——喜欢哪些内容,不喜欢哪些内容。读者的反馈对于我们挖掘更多有益于读者的主题是非常重要的。

普通的反馈只需发送邮件到feedback@packtpub.com,并在邮件主题中注明相应的书名即可。

如果你是某一些主题的专家并且对写作或撰写一本书有兴趣,可以访问www.packtpub.com/authors,阅读我们的作者指南。

客户支持

现在,你已经成为 Packt 出版社的尊贵用户,为了使你的购买物超所值,我们有很多事情可以帮你。

勘误

尽管我们已尽力确保内容的准确性,但错误仍然在所难免。如果读者在书中发现了错误(也许是一个文件或一段代码)并愿意反馈给我们,我们将不胜感激。这样做可以让其他读者免受这些错误的困扰,并且可以帮我们在下一版中进行改进。如果读者发现任何错误,请访问http://www.packtpub.com/submit-errata,选择书名,点击errata submission form(提交勘误表)链接,并在勘误表中填写详细的报告信息。一旦提交的勘误被确认,就会被采纳并上传到网站上,或者追加到该书的“勘误”部分已经存在的勘误列表中。任何现有的勘误都可以从http://www.packtpub.com/support选择书名进行查看。

版权说明

盗版的盛行是互联网上一直存在的问题。在 Packt,我们对待版权及许可的保护非常认真,如果读者发现在互联网上有任何非法复制我们的作品的情况,无论是什么形式,都请立即将网络地址或网站名称提供给我们,以便我们采取补救措施。

请通过copyright@packtpub.com联系我们,并附上涉嫌盗版内容的链接。

我们非常感谢你对作者权益的保护,你的协助同时也保障了我们带给你更多有价值内容的能力。

疑问

如果对本书的某些方面有任何问题,可以通过questions@packtpub.com联系我们,我们会尽力解决。致谢

一切赞颂,全归真主,全世界的主。首先,我必须感谢真主,是他给了我思考和写作的能力。

接下来,我要感谢我的妻子Laila,是她在写作期间给了我巨大的支持、鼓励以及耐心。我还要感谢我在加拿大和黎巴嫩的家人,感谢他们在本书写作过程中给予我的支持。

衷心感谢 Packt 出版社的每一个人,感谢他们给我的帮助和指导,感谢他们给了我与Hadoop和MapReduce社区的朋友们分享经验与技术方面的知识的机会。

同样感谢每一位技术审稿人,你们的正确反馈保证了每一个技术细节的精确和内容的丰富。作者简介

Khaled Tannirhas从1980年开始从事计算机相关工作。他刚开始编程时使用的是传说中的 Sinclair Zx81 电脑,后来使用 Commodore 家用电脑系列产品(Vic 20、Commodore 64、Commodore 128D和Amiga 500)进行开发。

他拥有电子学学士学位和系统信息架构方向硕士学位。研究生阶段,他写出了非常专业的毕业论文,并因此获取了研究硕士学位。

Khaled Tannirhas 是微软认证的开发人员(MCSD),他在领导软件解决方案的开发和实施以及技术演说方面,拥有20多年技术经验。如今,他是一名独立IT咨询师,并在法国、加拿大的许多大公司担任基础设施工程师、高级研发工程师、企业/解决方案架构师等职务。

他在Microsoft .NET、Microsoft 服务器系统、Oracle Java 技术等领域拥有丰富的经验,并且熟练驾驭在线和离线应用系统设计、系统转换以及多语言的互联网/桌面应用程序开发。

Khaled Tnnirhas总是热衷于探索和学习新的技术,并基于这些技术在法国、北美、中东等地区寻求商机。他现在拥有一个IT电子实验室,实验室中配备了很多服务器、监控器、开源电子板(如Arduino、Netduino、RaspBerry Pi 和.Net Gadgeteer),还有一些装有Windows Phone、Android 和iOS 操作系统的智能设备。

2012年,他协助组织并出席了法国波尔多大学的复杂数据挖掘国际论坛——EGC 2012。在一个研讨会中,他提出了“如何优化在云计算环境下的数据分布”这一议题。这个议题旨在寻求一种方法,在云计算环境下能够优化数据挖掘常用算法(如kmeans算法和关联规则算法等)的使用。

他还是《RavenDB 2.x Beginner’s Guide》一书的作者。

目前,他的目标是获得云计算和大数据方向的博士学位,并希望籍此学习更多的相关技术。

此外,Khaled Tnnirhas 也是摄影、旅游、视频游戏的爱好者。他喜欢拍摄自然风光和夜景,并且经常使用Arduino/.Net Gadgeteer开发一些有趣的电子产品。当然,他也乐于与他的妻子及家人共度美好的时光。

读者可以通过电子邮件与他联系,他的邮箱是contact@khaledtannir.net。技术审稿人简介

Włodzimierz Bzyl 在波兰格但斯克大学工作。他目前的研究方向是 Web 技术和NoSQL数据库。他对新技术充满热情,并热衷于把这些技术介绍给他的学生。他乐于为开源系统贡献代码,同时也享受在塔特拉山脉徒步。

Craig Henderson 1995年毕业于实时计算系统专业,之后他长期从事大规模数据处理和分布式系统方面的工作。他是一个C++ MapReduce开源库的作者,这个开源库旨在提高单服务器应用程序的扩展性(开源代码可以从 https://github.com/cdmh/mapreduce 获取)。他当前在研究基于图像和视频处理技术进行人员身份识别。

Mark Kerzner 同时拥有法律、数学和计算机科学三个学位。他拥有多年软件设计经验,并且自2008年以来一直从事基于Hadoop的系统的设计工作。他是SHMsoft公司(一家各种Hadoop垂直应用的提供商)的总裁,同时是Hadoop Illuminated 这一Hadoop 培训咨询机构的联合创始人之一,也是《Hadoop Illuminated》这本开源书的合著者。他还写过或者与人合写过多本图书和多项专利。

非常感谢同事们对我的帮助,尤其是Sujee Maniyam,同时感谢家人对我的支持。第1章了解Hadoop MapReduce

MapReduce是一个流行的针对数据密集任务的分布式计算模型,它正在发展成为用来支撑包括Web索引、数据挖掘和科学仿真等领域的大规模数据并行应用的重要编程模型。

Hadoop是Google公司的MapReduce编程模型的最受欢迎的Java开源实现。在很多公司,Hadoop已经用于大规模数据分析任务,并且经常用在对响应时间要求很严格的作业中。

在深入了解 MapReduce 编程和 Hadoop 性能调优之前,我们先来回顾一下MapReduce模型的基础知识,并了解有哪些因素影响着Hadoop的性能。

本章将介绍以下内容:

MapReduce 模型;

Hadoop MapReduce 概述;

Hadoop MapReduce 的工作原理;

影响MapReduce 性能的因素。1.1MapReduce模型

MapReduce编程模型的设计目标是,使用普通硬件的大型集群处理非结构化数据并产生大规模数据集。它能够在数千个计算节点的集群上处理 TB 级的数据,进行故障处理,完成任务复制并聚合最终结果。

MapReduce 模型简单易懂。它是由 Google 研究院的工程师在 21 世纪初设计的(http://research.google.com/archive/mapreduce.html)。这一模型包含两个可以在多台机器上并行执行的函数:一个map函数和一个reduce函数。

要使用MapReduce,程序员需要编写一个用户定义的map函数和一个(同样是用户定义的)reduce函数来表示期望的计算逻辑。map函数读取键值对,执行用户指定的代码,产生中间结果。然后,通过reduce函数的用户指定代码聚合中间结果并输出最终结果。

MapReduce应用程序的输入按照每个输入规约加入到记录中,每个输入规约产生多个键值对,每个键值对以形式表述。

因此,MapReduce处理过程包含以下两个主要环节。

map():对所有输入记录逐条执行用户定义的map 函数,每条记录产生零到多个中间键值对,也就是记录。然后所有的记录都放到记录中。

reduce():按照键的不同,对每个map 输出的记录调用一次用户定义的reduce函数;对于每条记录,reduce函数输出零到多个对。所有的对最后合并为最终结果。

map和reduce的函数签名如下:

map()    list()

reduce()  

MapReduce编程模型的设计独立于存储系统。MapReduce通过reader从底层存储系统读取键值对。reader 从存储系统读取所有记录,并封装成键值对供后续处理。用户可以通过实现相应的 reader 增加对新存储系统的支持。这种存储独立的设计使MapReduce能够分析保存在不同存储系统中的数据,为异构系统带来了极大便利。

为了理解MapReduce编程模型,我们假设你需要从给定的输入文件中获得每一个单词出现的次数。将其转化成为MapReduce作业,单词计数作业通过以下几个步骤定义。

1.输入数据拆分成记录。

2.map 函数处理上述记录,并对每个单词生成键值对。

3.合并map 函数输出的所有键值对,并根据键分组、排序。

4.将中间结果发送给reduce 函数,由reduce 函数产生最终输出。

这个MapReduce应用的完整步骤如图1-1所示。图1-1

进行键值对的聚合操作时,会产生的大量I/O以及网络流量I/O。为了压缩map和reduce步骤间需要的I/O网络流量,程序员可以选择在map一侧进行预聚合,而预聚合通过提供Combiner函数完成。Combiner函数与reduce函数类似,其不同之处在于,前者并不传递给定键的所有值,而是把传递进来的输入值之和作为输出值传递出去。1.2Hadoop MapReduce概述

Hadoop由Google公司推出,是最流行的MapReduce编程模型的Java开源实现。还有一些其他的MapReduce开源实现(如Sphere、Starfish、Riak等),这些开源实现实现了Google文档描述的特性或者其中的部分特性。

Hadoop由分布式数据存储引擎和MapReduce执行引擎组成。在处理使用大量节点、围绕大量数据集展开的高分布性问题方面,Hadoop得到了成功的应用。上述节点一起构成了Hadoop集群,而Hadoop集群由一个称为JobTracker的主节点和多个工作节点(从节点)构成,每个工作节点称为一个 TaskTracker。在这个框架体系下,一个用户程序称为一项作业,并分为两个步骤,即map和reduce。

与在MapReduce 编程模型中类似,使用Hadoop MapReduce 实现的时候,用户仅须定义map 和reduce 函数。Hadoop MapReduce系统会自动并行执行这些函数并确保容错。

要学习更多关于 Hadoop MapReduce 实现的内容,读者可以浏览Hadoop官方网站:http://hadoop.apache.org。

Hadoop MapReduce 框架基本上采用了一个分布式文件系统来读写数据。这个分布式文件系统称为 Hadoop 分布文件系统(HDFS),是 Google 文件系统(GFS)的对等开源实现。因此,Hadoop MapReduce 作业的I/O 性能严重依赖于HDFS。

HDFS包含一个叫做NameNode(名称节点)的主节点和一个叫做DataNode(数据节点)的从节点。在HDFS内部,数据拆分为固定大小的数据块(block或chunk)并分发到集群中的所有数据节点。每个数据块一般复制为两个复制件:一个放在同一机架上,另一个放在其他机架上。NameNode负责跟踪哪个DataNode保存了哪个数据块的哪个复制件。1.3Hadoop MapReduce的工作原理

经过一个或者多个步骤,MapReduce编程模型可以用来处理许多大规模数据问题,还可以更高效地实现MapReduce编程模型来支持使用大量机器处理大量数据的问题。在大数据的背景下,可以处理的数据规模可以大到无法在单机存储。

在典型的Hadoop MapReduce 框架下,数据拆分为数据块并分发到集群内的多个节点上。MapReduce框架通过把计算逻辑转移到数据所在的机器,而不是把数据转移到其能够得以处理的机器上,从而充分利用数据的本地性优势。MapReduce应用的大多数输入数据块存放在本地节点,因而能够迅速加载,而且可以并行读取在多个节点上的多个数据块。因此,MapReduce能够达到很高的综合I/O带宽和数据处理速率。

要启动一项MapReduce作业,Hadoop会创建一个MapReduce应用的实例并把作业提交给JobTracker。然后,作业被拆分为map任务(也叫作mapper)和reduce任务(也叫作reducer)。

Hadoop启动MapReduce作业时,输入数据集拆分为大小相等的数据块,并采用心跳协议(heartbeat protocol)分配任务。每个数据块被调度到一个TaskTracker 节点上并由一个map任务处理。

每项任务都在一个工作节点的可用插槽上执行,每个节点会配置固定数量的map插槽和固定数量的reduce插槽。如果所有可用插槽都被占用,挂起的任务就需要等待一些插槽被释放。

TaskTracker 周期性地向 JobTracker 发送其状态。当 TaskTracker 节点空闲时, JobTracker 节点会给它分配新任务。JobTracker 节点在散发数据块时会考虑数据本地性,总是试图把本地数据块分配给TaskTracker节点。如果尝试失败,JobTracker节点会分配一个本地机架或者随机数据块给TaskTracker节点。

当所有的map函数都执行结束时,运行时系统会将中间键值对分组,并发起一组reduce任务来生成最终结果。接下来执行过程从shuffle阶段转向reduce阶段。在这个最终的reduce阶段,reduce函数被调用来处理中间数据并写最终输出。

用户经常使用不同的术语来表述Hadoop的map和reduce任务、子任务、阶段、子阶段。map任务包含了两个子任务(map和merge),而reduce任务仅包含一个任务。然而,shuffle和sort首先发生,并由系统完成。每个子任务又拆分为多个子阶段,如read-map、spill、merge、copy-map和reduce-write。1.4影响MapReduce性能的因素

影响MapReduce输入数据处理时间的因素很多。其中之一是实现map和reduce函数时使用的算法。其他外部因素也可能影响MapReduce性能。根据我们的经验和观察,可能影响MapReduce的主要因素有以下几个。

硬件(或者资源)因素,如CPU 时钟、磁盘I/O、网络带宽和内存大小。

底层存储系统。

输入数据、分拣(shuffle)数据以及输出数据的大小,这与作业的运行时间紧密相关。

作业算法(或者程序),如map、reduce、partition、combine和compress。有些算法很难在MapReduce中概念化,或者在MapReduce中效率可能会降低。

运行map任务时,shuffle子任务的中间输出存储在内存缓冲区中,用以减少磁盘I/O。输出的大小可能会超过内存缓冲区而造成溢出,因此需要 spill 子阶段把数据刷新到本地文件系统。这个子阶段也会影响MapReduce性能,它经常采用多线程技术实现,以便使磁盘I/O利用率最大化并缩减作业的运行时间。

MapReduce编程模型允许用户使用自己的map和reduce函数指定数据转换逻辑。本模型并不限定map函数产生的中间对在交由reduce函数处理前如何被分组。因此,归并排序(merge-sort)算法被用作默认的分类算法。然而,归并排序算法并非总是最高效的,尤其是对分析型任务(如聚合和等值连接)而言,这类任务并不关心中间键的顺序。

对于MapReduce编程模型来说,分组(grouping)/划分(partitioning)是一个串行的任务。这就意味着在reduce任务可以运行之前,框架需要等待所有map任务完成。

想要深入学习归并排序算法,请参考 http://en.wikipedia.org/wiki/Merge_sort。

MapReduce性能是以map和reduce的运行时间为基础的。这是因为典型环境下集群节点数目和节点插槽数目这类参数是不可修改的。

其他可能对MapReduce性能构成潜在影响的因素具体如下。

I/O 模式:也就是从存储系统获取数据的方式。从底层存储系统读取数据有以下两种模式。

直接 I/O:通过硬件控制器把数据从本地硬盘缓存中直接读到内存,因而不需要进程间通信成本。

流式I/O:通过特定进程间通信手段,如TCP/IP和JDBC,从其他正在运行进程(典型情况是存储系统进程)读取数据。

从提高性能的角度看,使用直接I/O比流式I/O更高效。

输入数据解析:是指从存储系统获取数据时,从原始数据到键值对的转换过程。数据解析过程的目标是把原始数据按照原来的格式解码,并转换为可供Java等编程语言处理的数据对象。

输入数据可以解码为(Java 或者其他语言)对象,这样当对象实例创建后,对象内容可以改变,典型的情况是使用对对象实例的引用(这样的对象叫做可变对象),输入数据也可以解码为一经创建其内容就不可改变的对象(叫做不可变对象)。在上百万条记录的情况下,不可变对象的解码过程会明显比可变对象的解码过程慢,这是因为在前者解码过程中产生了大量不可变对象。因此,这会导致系统性能的降低。

输入数据存储:当MapReduce获取数据并进行进一步处理时,所在的存储系统必须保证高速访问和数据可用性(如HDFS和HBase)。如果选用的不是那些推荐的与MapReduce一起使用的存储文件系统,那么输入数据的访问会潜在地影响MapReduce性能。

使用 Hadoop 框架时,许多因素可能会影响整个系统的性能和作业的运行时间。这些因素可能是Hadoop MapReduce 引擎的一部分,也可能是引擎之外的。

Hadoop 配置参数通常会影响并发运行的任务数,并决定作业的运行时间,因为Hadoop集群被建立且作业开始执行后,其他因素就不可改变了。如果Hadoop框架配置不当,可能无法充分利用集群资源,并因此影响MapReduce作业性能。这是因为大量的配置参数控制着Hadoop框架的行为。

一项 Hadoop 作业经常由许多实现不同算法的子模块组成,这些子模块要么以串行方式连接,要么以并行方式连接。如果Hadoop框架配置不当,可能会影响内部任务完成的协作方式。所有这类参数(将在第2章讨论)设置的影响都依赖于map和reduce函数的代码、集群资源,当然还有输入数据。

MapReduce作业的性能也可能受Hadoop集群节点数的影响,以及受所有节点中运行map和reduce任务的可用资源的影响。每个节点的容量决定了一个节点可以执行的mapper和recducer任务的数量。因此,如果节点资源利用不充分或者过度利用,都会直接影响MapReduce任务的性能。1.5小结

在本章中,我们学习了MapReduce编程模型,并回顾了其内部工作原理。然后,我们关注了 Hadoop MapReduce 并了解了其主要组件。我们还谈到了影响 Hadoop MapReduce性能的内外部因素。

在下一章中,我们将深入了解 Hadoop 的可调参数,并学习 Hadoop 性能指标(metrics)和性能检测工具。第2章Hadoop参数概述

一旦运行了 Hadoop 作业,了解集群资源是否得到了充分的利用就非常重要了。幸好,Hadoop框架提供了几个参数,可以用于对作业进行调优并指定作业在集群上的运行方式。

性能调优涉及4个方面:CPU利用率、内存占用情况、磁盘I/O和网络流量。本章会描述与这几个方面相关的大多数参数,然后介绍优化 Hadoop 执行的技术并定义一些配置参数。

拥有效率监测工具至关重要,当问题正在发生或者已经发生时它会发出警告,并且给出可视的指示来表明 Hadoop 集群正在做什么以及做了什么。本章将重点介绍使用配置参数进行Hadoop性能调优的方法,并介绍几款监测Hadoop服务的工具。

本章将介绍以下内容:

研究Hadoop 的可调参数;

与CPU 利用率、内存、磁盘I/O 以及网络相关的Hadoop 配置参数;

Hadoop 性能指标;

Hadoop 监测工具。2.1研究Hadoop参数

正如第1章中提到的那样,有很多因素会对Hadoop MapReduce 性能产生影响。一般说来,与工作负载相关的Hadoop性能优化需要关注以下3个主要方面:系统硬件、系统软件,以及Hadoop基础设施组件的配置和调优/优化。

需要指出的是,Hadoop被归类为高扩展性解决方案,但却不足以归类为高性能集群解决方案。系统管理员可以通过各种配置选项来配置和调优 Hadoop 集群。性能配置参数主要关注CPU利用率、内存占用情况、磁盘I/O和网络流量。除了Hadoop主要性能参数以外,其他系统参数,如机架间带宽,也可能影响集群的整体性能。

Hadoop可以按照用户需要进行配置和定制,可以通过对安装完成后自动生成的配置文件进行修改来满足应用和集群的特定需要。

配置文件分为两类,即只读默认配置文件和站点特定配置文件。

第一类包括core-default.xm、hdfs-default.xml和 mapred-default.xml。

第二类包括core-site.xml、hdfs-site.xml 和mapred-site.xml。

Hadoop 配置文件中有大量变量,通过定义或者修改这些变量,可以满足控制Hadoop配置的需要。这些变量定义在配置文件core-site.xml、hdfs-site.xml和 mapred-site.xml 中。其中一些变量用于指定系统中特定文件的路径,而其他变量则用于从不同角度调整 Hadoop 框架,而且可以从不同粒度深入其内部。每个配置文件都有多个用XML格式表示的名称-值对(name-value pair),它们从不同角度定义Hadoop的工作方式。

从系统硬件的角度看,要衡量合理的硬件配置,需要关注性能、可扩展性及成本要求。从软件的角度看,选择运行Hadoop必需的操作系统、JVM(Java虚拟机)、特定的 Hadoop 版本以及其他软件组件对于性能以及环境的稳定有着重要的意义。任何Hadoop项目,如果要充分获得Hadoop软硬件分布式解决方案带来的好处,其设计、构建、配置以及调优阶段都意义重大。2.1.1 配置文件mapred-site.xml

mapred-site.xml 是提高Hadoop MapReduce性能的关键配置文件。这个配置文件包含了与CPU、内存、磁盘I/O和网络相关的参数。

1.与CPU相关的参数

表2-1所示的两个参数与CPU利用率关联最为密切。通过修改这些变量,可以指定由TaskTracker节点并发运行的map/reduce任务的最大数量。这两个参数默认值为2。表2-1

理论上,上述默认值的增加有助于提高CPU利用率,从而提高性能,但这需要根据集群资源精巧地设置,如CPU(是否考虑超线程因素)和可用内存;否则,就会有MapReduce作业和集群性能整体降级的风险。

用户经常会问的一个典型问题是:mapper/reducer 数量设置为多少才能获得最佳性能?要设置这个值,需要考虑TaskTracker资源(如CPU、内存和磁盘I/O)利用率。而且,还要考虑运行的作业是否是CPU密集型的。

为了厘清这些参数设置,我们假设你拥有10个Hadoop集群节点,每个节点有1个四核CPU。这样,全部守护进程应该不超过10(节点)× 4(CPU 核)= 40 个。考虑到需要分别为DataNode守护进程和TaskTracker守护进程各预留1个CPU核,因此留给map/reduce任务的CPU核还剩38个。

不必把mapper和reducer的数量设置为相同的值,因为该项设置依赖于每项任务的CPU利用率,也依赖mapper和reducer完成作业并得到最后结果的方式。你可以把CPU资源分配给mapper和reducer各50%,也可以分配三分之二给mapper,三分之一给reducer,或者其他能够使集群运行最优的分配方式。

如果把该值设为−1,Hadoop 将使用管理员为 mapper和reducer任务分配的全部内存。如果将这个值设置为超过实际CPU核的数目,将会导致密集的CPU上下文切换(参见第4章),这会造成集群性能显著降级。

2.与磁盘I/O相关的参数

为了优化磁盘I/O操作,你需要判断是否需要使用数据压缩,默认情况下这个开关项处于关闭状态。可以通过修改控制压缩的参数默认值来启用数据压缩。mapred.compress.map.output变量启用map输出压缩,mapred.output.compress变量启用作业输出压缩,mapred.map.output.compression.codec变量用于定义压缩的编解码方式,如表2-2所示。表2-2

启用map任务的输出压缩可以有效减少写入存储系统的中间数据量。因此,这会在shuffle阶段和写入阶段加速磁盘写操作,从而减少数据传输的总时间。用压缩技术加速磁盘写操作会在压缩/解压过程中带来额外的CPU开销。

实际经验表明,只有当输入数据量很大而且容易拆分时(如文本文件),才应该启用压缩;否则会造成集群性能的降级。

要获得磁盘I/O的平衡并大幅提升I/O性能,可以使用向多个位置写入的功能,把数据写到每个节点的所有磁盘上。与使用RAID 0数据分条技术相比,使用多个物理设备会带来大约50%的性能提升。

表 2-3 所示的两个参数决定了 Hadoop 中用来存储数据的位置。可以使用mapred.local.dir 指定中间 map 输出数据的存储位置,而使用 dfs.data.dir指定HDFS数据的存储位置。表2-3

3.与内存相关的参数

内存资源非常重要,精确分配内存资源可以有效地避免内存交换,并优化Hadoop作业的运行。可以使用与内存相关的参数来设置为MapReduce作业预留的物理内存的数量。表2-4列出了常用的与内存相关的参数。表2-4

mapred.child.ulimit 默认值未指定。如果为这个参数指定值,则该值要大于(至少等于)参数mapred.child.java.opts的–Xmx值;否则,Java虚拟机可能无法启动。要正确设定此参数,其值应大于2×mapred.child.java.opts。

使用与内存相关的参数还可以优化合并与排序。有三个参数可以优化MapReduce的合并与排序的性能,如表2-5所示。表2-5

增加io.sort.mb和io.sort.factor的值会为排序与合并操作分配更多的内存。这会减少对磁盘的流量冲击,从而减少mapper和reducer任务的I/O时间。但是,上述变量的增加会导致每一个map任务需要的内存增加,当为每一任务分配的内存不足时,会增加内存垃圾收集活动的开销。

经验表明,磁盘溢写量很大时,以及 sort/shuffle 阶段 I/O 时间很长时,io.sort.factor值需要相应加大。当map 输出很大,造成map 端I/O很频繁时,可以考虑增加io.sort.mb的值。为了避免出现“任务耗尽内存”这样的错误,io.sort.mb的值应该大于0.25×mapred.child.java.opts且小于0.5×mapred.child.java.opts。

通过增加 mapred.job.reduce.input.buffer.percent 的值可以得到更多的内存缓冲区,从而在reduce阶段减少本地磁盘I/O时间。不过,前面已经提过,如果分配更多内存,就会在释放未用内存时增加垃圾收集的开销。因此,如果map输出很大,以及reduce排序阶段本地磁盘I/O很频繁,就应该分配更多的内存。

4.与网络相关的参数

Hadoop 有一个叫做“机架感知”(rack awareness)的概念。系统管理员可以为集群中每一个DataNode定义机架。Hadoop机架感知非常重要,因为它可以避免数据丢失,而一个好的机架感知配置可以改善网络性能。表 2-6 中给出的是使 Hadoop 建立机架感知的变量。表2-6

增加mapred.reduce.parallel.copies的值会增加网络流量,加速map输出的复制过程,但需要消耗更多CPU。建议只在 mapper任务产生的输出量非常大的时候才考虑增加这一参数的值。

Hadoop 机架感知特性是通过core-site.xml文件中的topology.script.file.name 参数配置的。该参数指向一个用户定义的脚本文件,用来决定机架到主机的映射(Rack1: DataNode1, DataNode2……Rack2:DataNode6, DataNode7……)。如果未配置topology.script.file.name参数,同一机架上所有节点的IP地址都传递为/default-rack。

访问http://hadoop.apache.org/docs/r1.2.1/cluster_setup.html#Hadoop+Rack+Awareness 可以学到更多有关 Hadoop 机架感知设置与配置的内容。2.1.2 配置文件hdfs-site.xml

hdfs-site.xml配置文件包含许多与HDFS存储系统相关的参数,通过修改这些参数可以达到对 Hadoop 安装定制并调优的目的。文件系统块大小的值是hdfs-site.xml文件中最常用的调优HDFS的参数。这一参数控制着每个map任务将会处理的输入分片的大小。输入分片的大小通过三个主要变量来指定:dfs.block.size (在 hdfs-site.xml 中)、mapred.min.split.size 和mapred.max.split.size(后两个都在mapred-site.xml中)。

默认情况下,dfs.block.size 设置为67108864 字节(64 MB)。增加此值会产生更大的输入分片,因而减少存放在每个DataNode上的块的数量。

map任务的总数依赖于输入数据的大小和总的输入分片的大小。而map输出的大小与 HDFS 块的大小成正比,如果加大块的大小的同时不对与数据溢流(spill)相关的属性做调整,可能会导致map侧数据溢流。

为了最大化数据吞吐量,块大小应该与输入数据相适应。对于非常大的输入文件,最好用大数据块(128MB甚至256MB),而对于小文件,用小一些的数据块更好。需要注意的是,通过调整dfs.block.size参数,在写入文件时,让同一文件系统上存在不同块大小的文件是可能的(要了解块大小的影响参见第5章)。

表2-7列出的是hdfs-site.xml配置文件中可以设置的主要参数。表2-7续表

改变块大小会对很多方面产生影响。多数情况下,采用更大的块大小来拆分文件会减少块的数量,从而减少NameNode上的元数据,这一点对非常大的文件显得非常重要。而且,这也为客户端不经过与NameNode交互而读写更多数据带来可能。

块减少,所需的存储文件的节点数也随之减少。这可能会使并行访问的总体吞吐量降低,还可能会使数据本地任务的调度更加困难。

并行吞吐量降低的同时可能意味着不能获得最大程度的并行性,这会降低运行成本但集群可能利用不够充分。这会增加任务拖延的可能性,而且一个任务的失败可能会导致很多任务返工。

块减少还意味着每个任务处理的数据量增大,从而产生额外的读写操作。2.1.3 配置文件core-site.xml

core-site.xml是Hadoop的主要配置文件之一,它包含了对整个Hadoop通用的配置。它在每个集群中的主机上都存在。

基本上,core-site.xml的变量可以改变或者定义分布式文件系统的名字、临时目录以及其他与网络配置相关的参数,如表2-8所示。表2-8续表

对于小规模集群,所有的服务器通常都是通过一台交换机连接起来的。因此,本地性指标只有两个:on-machine(联机)和off-machine(脱机)。从HDFS向NameNode的本地驱动器加载数据时,NameNode仅调度传输到本地DataNode的一份副本,然后从集群中随机挑选另外两台机器存储数据的复制件。

对于跨多个机架的大型Hadoop集群,就务必保证每个机架上都有数据的复制件。这样,因为复制件的存在,所以在发生交换机故障时才不会造成数据块不可用。

参数io.file.buffer.size用来设置I/O操作时Hadoop使用的缓冲区的大小。这个参数的默认值为 4096 字节(4 KB)。在现代系统上,为了获得性能增益,这个参数可以增加至65536 字节(64 KB)或者131071 字节(128 KB)。2.2Hadoop MapReduce性能指标

由于规模以及分布性的原因,诊断Hadoop程序的性能问题和监测Hadoop系统有着特有的难度。尽管Hadoop系统对外公开了原始指标(metric)和日志(log),但这些都难于解释,并不能被很多程序员完全理解。

当前,Hadoop 通过日志和指标 API 报告整体系统的粗略性能指标。但是,缺少了每个作业或者每个任务层面的重要指标,比如磁盘与网络I/O利用情况。在Hadoop系统上运行多个作业时,还缺乏反映每个任务的集群资源利用情况的性能指标。对集群管理员来说,这不仅会给测量集群利用情况带来困难,也不利于正确配置 Hadoop系统。

而且,Hadoop产生的日志非常庞大,手工处理极其困难,以至于难以回答诸如“为什么特定数量的 mapper/reducer 没有达到最优的吞吐量?”这种简单的问题。图2-1所示的截屏反映了某一段Hadoop作业的历史细节。图2-12.3性能监测工具

监测Hadoop集群节点的系统资源(如CPU利用率和磁盘平均数据传输率)有助于理解硬件资源的总体利用情况,并在诊断性能问题时找出瓶颈。Hadoop集群监测包括集群节点上系统资源使用情况的监测和核心服务指标的监测。最常监测的资源包括I/O带宽、每秒磁盘I/O操作的次数、平均数据传输率、网络延迟、平均内存和交换空间利用情况。

Hadoop性能监测建议收集性能计数器的数据,这样做是为了判断各种任务的响应时间是否在可接受的执行时间范围内。MapReduce任务的利用率平均百分比和一个时间段内的HDFS存储容量指明了集群资源是得到了最优利用还是利用不足。

Hadoop提供了大量用于监视与调试Hadoop服务的指标与信息源。这些系统与服务指标需要从集群节点收集并进行关联,以便分析 Hadoop 集群的整体状态,并诊断发现的问题。

有许多完全开源的监测系统(如Chukwa、Ganglia、Nagios及Ambari等)可以把 Hadoop 提供的各种指标和信息源整合起来,成为意义直观的面向服务的总结、图形以及警告,利用这些开源的监测系统可以提高你的监测经验。2.3.1 用Chukwa监测Hadoop

Chukwa(http://incubator.apache.org/chukwa/)是一个开源数据收集系统,用于监测和分析大型分布式系统。Chukwa构建于Hadoop之上,包含一个强大而灵活的工具集,用来监测、分析和观察结果。

Chukwa 的许多组件采用了插件方式,支持轻松定制与功能增强。它提供了用于处理所收集数据的标准框架,其收集容量与分析容量可以扩展到几千个节点。2.3.2 使用Ganglia监测Hadoop

Ganglia(http://ganglia.sourceforge.net/)初创于加利福尼亚大学伯克利分校,致力于提供一种可靠的资源消耗型计算集群性能监测解决方案。Ganglia可以监测成百上千个节点的集群。基本上,Ganglia收集每个受监测节点的CPU利用率和剩余磁盘空间等高阶变量。不仅如此,Ganglia还能监测发生故障的集群节点。

当前的Hadoop版本内置了对Ganglia(版本3.0+)的支持。它是一种高度可扩展的集群监测工具,提供单个集群、一组集群或者集群中某台机器的状态的图形化视图信息。

Hadoop上Ganglia的架构与实现支持集群联合体,可以监控联合体内每一集群内部的状态并对状态进行聚合。该架构包括Ganglia 收集器(Ganglia Collector),Ganglia收集器运行监测守护进程并收集每个集群的性能指标,还运行一个元守护进程(meta daemon),用来聚合所有集群的性能指标。Ganglia收集器提供Web用户界面,展现内存使用情况、磁盘使用情况、网络统计、正在运行的进程以及其他性能指标的实时动态视图。2.3.3 使用Nagios监测Hadoop

Nagios(http://www.nagios.org/)是一个流行的开源监测工具系统,主要用于高性能计算(High Performance Computing,HPC)和其他环境,设计目的是获取系统资源的性能指标。Nagios用来监测Hadoop集群资源以及应用程序和操作系统属性的状态,如CPU使用情况、磁盘空间及内存利用情况。

Nagios具有集成的内置通知系统,用来进行通知而不是系统性能指标的收集与跟踪。当前Nagios版本允许在目标主机上运行代理,并提供灵活、可定制的架构,用来收集有关Hadoop集群的状态的性能指标和信息数据。

Nagios用来提供以下几方面的监测信息。

获取Hadoop 基础设施组织的即时信息。

系统故障时产生并接收警告。

针对集群利用情况进行分析、报告并生成图形,对以后的硬件采购做出决策。

检测问题并参加后续的问题解决。

监测队列消耗情况,查找正在运行作业的节点的可用性。

Nagios被看做集群健康检查和告警监测工具。2.4用Apache Ambari监测Hadoop

Apache Ambari 项目(http://incubator.apache.org/ambari/)简化了Hadoop 管理和集群监测,其主要目标是在多实例环境下简化Hadoop集群的部署与管理。

Ambari提供了一组直观、易用的监测Hadoop集群的工具,隐藏了Hadoop框架的复杂性。它通过向管理员暴露RESTful API来允许与其他系统集成。而且,Ambari依赖Ganglia和Nagios的度量结果,在需要时(如节点故障、磁盘空间不足等)使用报警系统发送电子邮件,以引起管理员的注意。除此之外,Ambari通过安装安全(基于 Kerberos)的 Hadoop 集群,提供基于角色的用户认证、授权、审计,并与 LDAP和活动目录(Active Directory)集成进行用户管理,为Hadoop 安全提供支持。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载