Hadoop-操作与集群管理秘籍-全-
Hadoop 操作与集群管理秘籍(全)
零、前言
如今,许多组织都面临着大数据问题。 管理和处理大数据可能会给关系数据库系统等传统数据处理平台带来很多挑战。 Hadoop 旨在成为处理大数据问题的分布式和可扩展系统。 基于 Hadoop 的大数据平台使用 Hadoop 作为数据存储和处理引擎。 它通过将大数据输入转换为预期输出来解决问题。
Hadoop Operations and Cluster Management Cookbook为您提供了管理 Hadoop 集群的示例和分步指南。 它涵盖了设计、配置、管理和监视 Hadoop 集群的广泛主题。 本书的目标是帮助您更高效、更系统地管理 Hadoop 集群。
在前三章中,您将学习配置完全分布式 Hadoop 集群的实用方法。 后续的管理、强化和性能调整章节将涵盖本书的核心主题。 在这些章节中,您将学习管理 Hadoop 集群的实用命令和最佳实践。 本书的最后一个重要主题是 Hadoop 集群的监控。 在本书的最后,我们将介绍使用 AWS 云构建 Hadoop 集群的步骤。
这本书涵盖了哪些内容
第 1 章,大数据和 Hadoop介绍了定义大数据问题的步骤,并概述了构建基于 Hadoop 的大数据平台的步骤。
第 2 章,为 Hadoop 安装做准备介绍如何准备 Hadoop 集群配置。 主题包括选择适当的集群硬件、配置网络和安装 Linux 操作系统。
第 3 章,配置 Hadoop 集群介绍了在伪分布式模式和完全分布式模式下配置 Hadoop 集群的方法。 我们还将介绍验证 Hadoop 集群配置并对其进行故障排除的步骤。
第 4 章,管理 Hadoop 集群向您展示了如何管理 Hadoop 集群。 我们将学习集群维护任务和管理的实际步骤。 例如,我们将介绍 HDFS 文件系统的管理、MapReduce 作业、队列和配额的管理,等等。
第 5 章,加强 Hadoop 集群,介绍了保护 Hadoop 集群的方法。 我们将向您展示如何配置用于授权的 ACL 和用于身份验证的 Kerberos、配置 NameNode HA、从失败的 NameNode 恢复等等。
第 6 章,监视 Hadoop 集群解释了如何使用 Ganglia 和 Nagios 等各种工具监视 Hadoop 集群。
第 7 章,调优 Hadoop 集群以获得最佳性能介绍了调优 Hadoop 集群性能的最佳实践。 我们将调优内存配置文件、MapReduce 调度策略等,以实现 Hadoop 集群的最佳性能。
第 8 章,使用 Amazon EC2 和 S3构建 Hadoop 集群,向您展示了如何在 Amazon 云中配置 Hadoop 集群。 我们将解释在 EC2 上注册、连接和启动 VM 实例的步骤。 我们还将向您展示如何为 EC2 上的 Hadoop 集群配置自定义 AMI。
这本书你需要什么
这本书写得尽可能自成体系。 每一章和食谱都有在主题之前介绍的特定前提条件。
一般来说,在本书中,我们将使用以下软件包:
- CentOS 6.3
- Oracle JDK(Java 开发工具包)SE 7
- Hadoop 1.1.2
- HBase 0.94.5
- 同步,由 Elderman 更正@ELDER_MAN
- PIG 0.10.1
- 动物园管理员 3.4.5
- Manhout 0.7
这本书是给谁看的
本书面向 Hadoop 管理员和大数据架构师。 它可能是一本对 Hadoop 程序员很有帮助的书。
阅读本书并不要求您具备扎实的 Hadoop 知识,但您需要了解基本的 Linux 命令,并对分布式计算概念有一个大致的了解。
公约
在这本书中,你会发现许多区分不同信息的文本样式。 以下是这些风格的一些示例,并解释了它们的含义。
文本中的代码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄如下所示:“使用您喜欢的文本编辑器打开文件$HADOOP_HOME/conf/mapred-site.xml。”
代码块设置如下:
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
</property>
当我们希望您注意代码块的特定部分时,相关行或项将以粗体显示:
<property>
<name>fs.default.name</name>
<value>hdfs://master:54310</value>
</property>
任何命令行输入或输出都如下所示:
hadoop namenode -format
新术语和重要单词以粗体显示。 例如,您在屏幕、菜单或对话框中看到的文字会出现在文本中,如下所示:“通过单击链接分析此职务,我们将转到一个网页。”
备注
警告或重要说明会出现在这样的框中。
提示
提示和技巧如下所示。
读者反馈
欢迎读者的反馈。 让我们知道你对这本书的看法-你喜欢什么或不喜欢什么。 读者反馈对于我们开发真正能让您获得最大收益的图书非常重要。
要向我们发送一般反馈,只需发送电子邮件至<[feedback@packtpub.com](mailto:feedback@packtpub.com)>,并通过消息主题提及书名。
如果有一个您擅长的主题,并且您有兴趣撰写或投稿一本书,请参阅我们位于www.Packtpub.com/Authors上的作者指南。
客户支持
现在您已经成为 Packt 图书的拥有者,我们有很多东西可以帮助您从购买中获得最大价值。
勘误表
虽然我们已经竭尽全力确保内容的准确性,但错误还是会发生。 如果您在我们的一本书中发现错误--可能是文本或代码中的错误--如果您能向我们报告,我们将不胜感激。 通过这样做,您可以将其他读者从挫折中解救出来,并帮助我们改进本书的后续版本。 如果您发现任何勘误表,请访问http://www.packtpub.com/submit-errata,选择您的图书,单击勘误表提交表链接,然后输入勘误表的详细信息。 一旦您的勘误表被核实,您提交的勘误表将被接受,勘误表将被上传到我们的网站上,或添加到该标题勘误表部分下的任何现有勘误表列表中。 通过从http://www.packtpub.com/support中选择您的书目,可以查看任何现有勘误表。
盗版
在互联网上盗版版权材料是所有媒体持续存在的问题。 在 Packt,我们非常重视版权和许可证的保护。 如果您在互联网上发现任何形式的非法复制我们的作品,请立即提供我们的位置、地址或网站名称,以便我们采取补救措施。
请拨打<[copyright@packtpub.com](mailto:copyright@packtpub.com)>与我们联系,并提供疑似盗版材料的链接。
我们感谢您在保护我们的作者方面的帮助,以及我们为您提供有价值内容的能力。
问题
如果您对本书的任何方面有任何问题,可以拨打<[questions@packtpub.com](mailto:questions@packtpub.com)>与我们联系,我们将尽最大努力解决。
一、大数据和 Hadoop
在本章中,我们将介绍:
- 定义大数据问题
- 构建基于 Hadoop 的大数据平台
- 从 Hadoop 备选方案中选择
简介
如今,许多组织都面临着大数据问题。 管理和处理大数据可能会给关系数据库系统等传统数据处理平台带来很多挑战。 Hadoop 被设计为分布式和可伸缩系统,用于处理大数据问题。
大数据平台的设计、实施和部署需要系统架构师和管理员明确定义大数据问题。 基于 Hadoop 的大数据平台使用 Hadoop 作为数据存储和处理引擎。 它通过将大数据输入转换为预期输出来解决问题。 一方面,大数据问题决定了应该如何设计大数据平台,比如应该将哪些模块或子系统集成到平台中等等。 另一方面,平台的架构设计决定了平台的复杂度和效率。
不同的大数据问题具有不同的属性。 基于 Hadoop 的大数据平台能够处理大多数大数据问题,但可能不适合其他平台。 由于这些和许多其他原因,我们需要从 Hadoop 替代方案中进行选择。
定义大数据问题
通常,大数据的定义是大型数据,超出了常用软件工具在可容忍的运行时间内收集、管理和处理的能力。 更正式地说,大数据的定义应该超越数据的大小,包括其他属性。 在本食谱中,我们将以正式的方式概述定义大数据的属性。
做好准备
理想情况下,数据具有以下三个重要属性:体积、速度和变化。 在本书中,我们将大数据的值属性视为第四个重要属性。 而且,Value 属性也解释了大数据问题存在的原因。
How to Do It…
定义大数据问题涉及以下步骤:
-
Estimate the volume of data. The volume should not only include the current data volume, for example in gigabytes or terabytes, but also should include the expected volume in the future.
现实世界中有两种类型的数据:静态和非静态数据。 静态数据的数量,例如国家人口普查数据和人类基因组数据,不会随着时间的推移而改变。 而对于非静态数据,例如流式日志数据和社交网络流式数据,容量会随着时间的推移而增加。
-
Estimate the velocity of data. The velocity estimate should include how much data can be generated within a certain amount of time, for example during a day. For static data, the velocity is zero.
大数据的速度属性定义了可以生成数据的速度。 此属性不仅会影响数据量,还会决定数据处理系统处理数据的速度。
-
Identify the data variety. In other words, the data variety means the different sources of data, such as web click data, social network data, data in relational databases, and so on.
多样性意味着数据在语法或语义上是不同的。 不同之处在于需要将针对每种数据类型专门设计的模块集成到大数据平台中。 例如,从 Web 获取数据需要网络爬虫,需要数据转换模块将数据从关系型数据库传输到非关系型大数据平台。
-
Define the expected value of data.
大数据的价值属性定义了我们可以从中获得什么以及如何使用大数据。 例如,可以从在线点击数据中挖掘频繁项目集,以便更好地营销和更有效地部署广告。
…的工作原理
大数据平台可以用 IPO(http://en.wikipedia.org/wiki/IPO_Model)模型来描述,该模型包括三个组件:输入、流程、输出。 对于大数据问题,体积、速度和种类属性一起定义系统的输入,值属性定义输出。
另请参阅
- 构建基于 Hadoop 的大数据平台秘诀
构建基于 Hadoop 的大数据平台
Hadoop于 2006 年在雅虎首次作为大数据处理系统开发。 这个想法是基于 Google 的 MapReduce,它最初是由 Google 基于其专有的 MapReduce 实现发布的。 在过去的几年中,Hadoop 已经成为部署大数据应用的广泛使用的平台和运行时环境。 在本食谱中,我们将概述构建基于 Hadoop 的大数据平台的步骤。
做好准备
Hadoop 被设计为并行和弹性。 它通过利用由商用硬件组成的计算资源的强大功能,重新定义了管理和处理数据的方式。 并且它可以自动从故障中恢复。
How to Do It…
使用以下步骤构建基于 Hadoop 的大数据平台:
-
Design, implement, and deploy data collection or aggregation subsystems. The subsystems should transfer data from different data sources to Hadoop-compatible data storage systems such as HDFS and HBase.
子系统需要根据大数据问题的输入属性(包括数量、速度和种类)进行设计。
-
设计、实施和部署 Hadoop 大数据处理平台。 平台应使用 HDFS 或 HBase 上的大数据,并产生预期且有价值的输出。
-
设计、实施和部署结果交付子系统。 交付子系统应将分析结果从与 Hadoop 兼容的格式转换为适合最终用户的格式。 例如,我们可以将 Web 应用设计为使用图表、图形或其他类型的动态 Web 应用来可视化分析结果。
…的工作原理
下图描述了基于 Hadoop 的大数据系统的体系结构:

虽然 Hadoop 借鉴了 Google 的 MapReduce 的想法,但它不仅仅是 MapReduce。 典型的基于 Hadoop 的大数据平台包括Hadoop 分布式文件系统(HDFS)、并行计算框架(MapReduce)、通用实用程序、面向列的数据存储表(HBase)、高级数据管理系统(Pig和Hie)、大数据分析库(Mah.。 分布式协调系统(ZooKeeper)、工作流管理模块(Oozie)、诸如Sqoop的数据传输模块、诸如Flume的数据聚集模块以及诸如Avro的数据串行化模块。
HDFS 是 Hadoop 的默认文件系统。 它被设计为提供对应用数据的高吞吐量访问的分布式文件系统。 HDFS 上的数据存储为数据块。 在几个计算节点上复制数据块,并计算它们的校验和。 如果出现校验和错误或系统故障,可以从位于其他节点上的备份块恢复错误或丢失的数据块。
MapReduce 提供了一个编程模型,可以将复杂的计算转换为一组键-值对上的计算。 它通过调度作业、监视活动和重新执行失败的任务来协调节点集群上的任务处理。
在典型的 MapReduce 作业中,从节点上的多个映射任务并行执行,生成在本地计算机上缓冲的结果。 一旦部分或全部映射任务完成,Shuffle过程就开始了,该过程通过基于键排序和组合键-值对来聚合映射任务输出。 然后,最常见的是通过网络将洗牌后的数据分区复制到减速机。 然后,Reduce 任务将在混洗后的数据上运行,并生成最终结果(如果多个连续的 MapReduce 作业是流水线的,则为中间结果)。 作业完成后,最终结果将存储在多个文件中,具体取决于作业中使用的减速机数量。 工作流程的剖析可以在下面的图表中描述:

还有更多...
HDFS 有两种类型的节点:NameNode和DataNode。 NameNode 跟踪文件系统元数据,如数据块的位置。 出于效率原因,元数据保存在主机器的主存储器中。 DataNode 保存物理数据块,并与客户端通信以读取和写入数据。 此外,它还定期向集群中的 NameNode 报告其主存数据块的列表,以进行验证和验证。
MapReduce 框架有两种类型的节点,主节点和从节点。 JobTracker是主节点上的守护进程,TaskTracker是从节点上的守护进程。 主节点是 MapReduce 作业的管理器节点。 它将作业拆分成较小的任务,这些任务将由 JobTracker 分配给从节点上的 TaskTracker 运行。 当从节点接收到任务时,其 TaskTracker 将派生一个 Java 进程来运行该任务。 同时,TaskTracker 还负责跟踪和报告个别任务的进度。
Hadoop 公共
Hadoop Common 是用于基于 Hadoop 的大数据平台基础的组件和接口的集合。 它提供以下组件:
- 分布式文件系统和 I/O 操作接口
- 通用并行计算接口
- (木材)采运作业
- 安全管理
Apache HBase
Apache HBase 是一个开源、分布式、版本化和面向列的数据存储。 它构建在 Hadoop 和 HDFS 之上。 HBase 支持随机、实时访问大数据。 它可以扩展到托管非常大的表,包含数十亿行和数百万列。 有关 HBase 的更多文档可以从http://hbase.apache.org获得。
Apache Mahout
Apache Mahout 是一个基于 Hadoop 的开源可伸缩机器学习库。 它有一个非常活跃的社区,而且还在发展中。 目前,该库支持四种用例:推荐挖掘、聚类、分类和频繁项集挖掘。 有关 Mahout 的更多文档可以从http://mahout.apache.org获取。
ApachePIG
Apache Pig 是一个表达大数据分析程序的高级系统。 它通过将 Pig 语句编译成一系列 MapReduce 作业来支持大数据。 Pigg 使用Pig****拉丁语作为编程语言,可扩展且易于使用。 有关 PIG 的更多文档,请参阅http://pig.apache.org。
ApacheHive
Apache Have 是一个高级系统,用于管理和分析存储在基于 Hadoop 的系统中的大数据。 它使用一种类似 SQL 的语言,称为HiveQL。 与 Apache Pig 类似,配置单元运行时引擎将 HiveQL 语句转换为一系列 MapReduce 作业以供执行。 有关 Hive 的更多信息,请参阅http://hive.apache.org。
Apache 动物园管理员
Apache zooKeeper 是一个用于大规模分布式系统的集中式协调服务。 它维护配置和命名信息,并为分布式系统中的应用提供分布式同步和组服务。 有关 ZooKeeper 的更多文档可以从http://zookeeper.apache.org获得。
Apache Oozie
Apache oozie 是一个可伸缩的工作流****管理和协调****服务,用于 Hadoop 作业。 它具有数据感知能力,并根据作业的依赖关系协调作业。 此外,Oozie 已经与 Hadoop 集成,可以支持所有类型的 Hadoop 作业。 有关 Oozie 的更多信息可以从http://oozie.apache.org获得。
====___ApacheSqop
Apache Sqoop 是用于在 Apache Hadoop 和结构化数据存储(如关系数据库)之间移动数据的工具。 它提供命令行套件来将数据从关系数据库传输到 HDFS,反之亦然。 有关 Apache Sqoop 的更多信息,请参阅http://sqoop.apache.org。
ApacheFlume
Apache Flume 是用于在分布式系统中收集日志数据的工具。 它具有灵活而健壮的容错体系结构,可以将数据从日志服务器流式传输到 Hadoop。 更多信息可以从http://flume.apache.org获得。
_>Apache Avro
Apache Avro 是一个用于 Hadoop 的快速、功能丰富的数据序列化系统。 串行化数据与数据模式耦合,这便于其使用不同的编程语言进行处理。 有关 Apache Avro 的更多信息可以在http://avro.apache.org上找到。
从 Hadoop 备选方案中选择
尽管 Hadoop 非常成功地解决了大多数大数据问题,但在许多情况下它并不是最佳选择。 在本食谱中,我们将介绍几个 Hadoop 替代方案。
做好准备
Hadoop 作为大数据平台有以下缺点:
- 作为一个开源软件,Hadoop 很难配置和管理,主要原因是软件的不稳定,以及缺乏适当维护的文档和技术支持
- Hadoop 不是实时、响应迅速的大数据应用的最佳选择
- Hadoop 不太适合大型图表数据集
由于上述缺点以及其他原因,如特殊的数据处理要求,我们需要做出另一种选择。
提示
对于未归类为大数据的数据,Hadoop 不是一个很好的选择;例如,具有以下属性的数据:小型数据集和需要事务和同步处理的数据集。
How to Do It…
我们可以使用以下指导原则选择 Hadoop 替代方案:
- 如果没有合格的 Hadoop 管理员并且有足够的预算部署大数据平台,请选择 Enterprise Hadoop。
- 如果应用需要实时数据处理,请选择 Spark 或 Storm。
- 如果应用需要处理大型图形数据集,请选择 GraphLab。
…的工作原理
Enterprise Hadoop 指的是一些面向 Hadoop 的公司发布的 Hadoop。 与社区 Hadoop 发行版相比,Enterprise Hadoop 发行版是企业级的,易于配置,有时还会添加新功能。 此外,这些公司提供的培训和支持服务使组织更容易采用 Hadoop 大数据平台。 著名的面向 Hadoop 的公司包括:Cloudera、Horntonworks、MapR、HAdapt等。
-
Cloudera是提供企业级 Hadoop 大数据解决方案的最著名公司之一。 它提供 Hadoop 咨询、培训和认证服务。 它也是 Hadoop 代码库的最大贡献者之一。 他们的大数据解决方案使用 Cloudera Desktop 作为集群管理界面。 您可以从www.cloudera.com了解更多信息。
-
Hortonworks和MapR都提供了特色 Hadoop 发行版和基于 Hadoop 的大数据解决方案。 您可以从www.hortonworks.com和www.mapr.com获取更多详细信息。
-
HAdapt将结构化、半结构化和非结构化数据集成到统一的数据操作平台的目标使有别于其他面向 Hadoop 的公司。 HAdapt 统一了 SQL 和 Hadoop,使得处理不同种类的数据变得容易。 您可以在http://hadapt.com/了解更多信息。
-
Spark是一个实时内存大数据处理平台。 它可以比 Hadoop 快 40 倍。 因此,它是迭代式和响应式大数据应用的理想之选。 此外,Spark 可以与 Hadoop 集成,并且与 Hadoop 兼容的存储 API 使其能够访问任何 Hadoop 支持的系统。 有关 Spark 的更多信息可以从http://spark-project.org/了解。
-
Storm是另一个著名的实时大数据处理平台。 它是由 Twitter 开发并开源的。 详情请查看http://storm-project.net/。
-
GraphLab is an open source distributed system developed at Carnegie Mellon University. It was targeted for handling sparse iterative graph algorithms. For more information, please visit: http://graphlab.org/.
提示
MapReduce 框架通过将数据拆分成多个分布式节点来并行计算。 一些大型的自然图形数据,如社交网络数据,存在难以划分的问题,因此很难进行 Hadoop 并行处理。 如果使用 Hadoop,可能会严重影响性能。
-
Other Hadoop-like implementations include Phoenix (http://mapreduce.stanford.edu/), which is a shared memory implementation of the MapReduce data processing framework, and Haloop (http://code.google.com/p/haloop/), which is a modified version of Hadoop for iterative data processing.
提示
Phoenix 和 Haloop 没有一个活跃的社区,不建议将它们用于生产部署。
还有更多...
随着大数据问题席卷全球,人们设计了许多系统来应对这一问题。 两个不遵循 MapReduce 路线的著名系统是消息传递接口(MPI)和高性能集群计算(HPCC)。
MPI
MPI 是用于消息传递的库规范。 与 Hadoop 不同,MPI 是为在大规模并行机和工作站集群上实现高性能而设计的。 此外,MPI 缺乏容错能力,当数据变大时性能会受到限制。 有关 mpi 的更多文档,请参阅http://www.mpi-forum.org/。
HPCC
HPCC 是 HPCC Systems 开发的开源大数据平台,被 LexisNexis Risk Solutions 收购。 它通过对商用硬件进行集群来实现高性能。 该系统包括使用索引数据文件的并行批处理和高性能在线查询应用的配置。 HPCC 平台包含两个集群处理子系统:Data Refinery子系统和Data Delivery子系统。 数据精炼子系统负责海量原始数据的综合处理,数据交付子系统负责交付干净的数据进行在线查询和分析。 有关 HPCC 的更多信息可在http://hpccsystems.com/上找到。
二、准备安装 Hadoop
在本章中,我们将介绍:
- 为集群节点选择硬件
- 设计集群网络
- 配置集群管理器计算机
- 创建 kickstart 文件和引导介质
- 安装 Linux 操作系统
- 安装 Java 和其他工具
- 配置 SSH
简介
Hadoop 集群的配置是一项系统工程,尤其是其规模大、分布广。 需要在选择合适的存储和计算硬件、设计互连网络、安装和配置操作系统等方面下功夫。
在 Hadoop 集群中,不同类型的节点可能需要不同的硬件配置。 例如,主节点上的JobTracker调度作业并将任务分配给适当的从节点执行,而主节点上的NameNode管理文件和数据块的元数据。 此外,主节点是默认集群配置中的关键故障点,默认集群配置仅配置一个主节点。 对主节点的一个关键要求是响应和可靠。 另一方面,从节点负责托管数据块并在数据块上运行任务。 由于内置的集群级故障恢复能力,对从节点的可靠性要求不像主节点那么严格。 但是从节点应该有足够的存储空间和计算能力来满足存储和计算需求。
同样,不同的 Hadoop 集群大小可能有不同的配置要求。 例如,对于最多有 100 个从节点的中小型集群,NameNode、JobTracker 和 Second daryNameNode 守护进程可以放在同一台主计算机上。 当集群大小增长到数百个甚至数千个从节点时,建议将这些守护进程放在不同的机器上。 在本书中,我们假设构建一个具有 5 个从节点的集群,这使得将 NameNode、JobTracker 和 Second daryNameNode 守护进程放在同一台物理机上是合理的。
Hadoop 集群中的节点通过交换机和路由器等网络设备互连。 在 MapReduce 作业的不同阶段,数据将通过网络从一个节点传输到另一个节点。 影响 Hadoop 集群性能的因素有很多,其中一些因素的影响比其他因素更大。 例如,设备故障导致的网络分段会大大降低集群的性能,而网络速度和时延对集群性能的影响相对较小。 因此,高可用性和弹性的网络体系结构对于 Hadoop 集群至关重要。
Hadoop 在 Linux 上运行(虽然支持 Windows 操作系统,但在撰写本书时它仍然不稳定)。 在 Hadoop 安装过程之前,我们需要在所有集群节点上安装和配置 Linux。 如果您有使用 Linux 的经验,您可能知道按照安装说明在一台机器上安装 Linux 是很简单的。 例如,我们可以将下载的操作系统 ISO 映像刻录到 DVD 光盘上,然后使用此 DVD 引导和安装操作系统。 但是,这种简单直接的安装方法效率太低,不适用于具有大量节点的 Hadoop 集群。 在本章中,我们将探索更实用、更高效的安装方法。
安装 Linux 操作系统后,需要进行一些操作系统配置。 例如,我们需要配置用户、组和系统安全性,如防火墙和 SELinux。 我们还需要安装所需的 Hadoop 依赖软件 Java,以及一些可以提高集群管理效率的可选工具。
为集群节点选择硬件
Hadoop 集群包含两种类型的节点:主节点和从节点。 默认情况下,NameNode、Second daryNameNode 和 JobTracker 守护进程驻留在主节点上,DataNode 和 TaskTracker 守护进程驻留在从节点上。 为这些计算和存储节点正确选择硬件可以最大限度地提高 Hadoop 集群的效率。 在本食谱中,我们将列出有关计算节点硬件选择的建议。
怎么做……
尽管对主节点和从节点有特殊要求,但没有为这两种类型的节点选择最佳硬件的黄金标准。 可以说,硬件配置与待处理大数据的属性密切相关。 此外,随着 Hadoop 集群需求的变化,硬件的选择是一个经验性和适应性的过程。 例如,如果对 Hadoop 集群的吞吐量要求很高,我们可能需要选择高端 CPU 和硬盘。 如果我们有大量潜在的 Hadoop 用户,我们可能需要升级主节点和从节点的硬件配置。
根据经验,我们建议中小型 Hadoop 集群使用以下配置:
|节点类型
|
节点组件
|
推荐规格
|
| --- | --- | --- |
| 主节点 | 中央处理机 | 2 个四核,2.0 GHz |
| RAM(主存储器) | 16 GB |
| 硬盘 / 同 hard disk | 2 个 1TB SATA II 7200 rpm 硬盘或固态硬盘* |
| 网卡 | 1Gbps 以太网 |
| 从节点 | 中央处理机 | 2 个四核 |
| RAM(主存储器) | 16 GB |
| 硬盘 / 同 hard disk | 4 个 1TB 硬盘 |
| 网卡 | 1Gbps 以太网*HDD 代表硬盘驱动器,SSD 代表固态驱动器 |
它是如何工作的.
在 Hadoop 主节点上,NameNode 将元数据(如每个文件的权限)保存在主内存中。 主节点所需的内存量取决于要创建和跟踪的文件系统对象的数量(例如,文件和数据块副本的数量)。 当集群较大时,内存需求会很高。 Second daryNameNode 为从 NameNode 镜像的最新文件系统检查点保留备份,因此其内存需求与 NameNode 相似。
提示
在默认配置中,主节点是单个故障点。 建议采用高端计算硬件和二次电源。
在 Hadoop 中,每个从节点同时执行多个 map 或 duce 任务。 并行映射/还原任务的最大数量称为映射/还原槽,Hadoop 管理员可以对其进行配置。 每个插槽都是一个由 CPU、内存和磁盘 I/O 资源组成的计算单元。 当 JobTracker 为从节点分配任务时,其 TaskTracker 将为该任务分叉 JVM,分配预先配置的计算资源量。 此外,每个派生的 JVM 还会产生一定的内存需求。 根据经验,Hadoop 作业可能会消耗每个 CPU 核心 1 GB 到 2 GB 的内存。 对于大多数 Hadoop 作业,更高的数据吞吐量要求可能会导致更高的 I/O 操作。 这就是为什么高端和并行硬盘可以帮助提升集群性能。 要最大限度地提高并行度,建议为每个 CPU 核心分配两个插槽。 例如,如果我们的从节点有两个四核 CPU,我们可以为该节点总共分配2 x 4 x 2 = 16个插槽(仅映射、仅减少或两者都分配)。
提示
在简单的等式中,第一个2表示从节点的 CPU 数,数字4表示每个 CPU 的核数,另一个2表示每个 CPU 核的插槽数。
另请参阅
集群网络设计
该网络是 Hadoop 集群的主干。 它的稳定性对集群的性能至关重要。 在本食谱中,我们将概述一些设计 Hadoop 集群网络的一般规则。
怎么做……
中小型集群的网络体系结构可以简单到只需将集群节点与一台或多台交换机连接起来。 连接冗余可以增加网络的可靠性。
提示
警告!
Hadoop 集群中的计算节点应该配置在同一网段内(局域网(LAN))。 不建议使用可能导致开销的高级功能,例如 VLAN。 也不建议使用路由器连接节点。
具有数百或数千个节点的 Hadoop 集群的网络体系结构要复杂得多。 在大型集群中,物理节点通常非常小,例如刀片服务器,它们可以安装在机架上。 每个机架都有一个本地交换机,用于互连同一机架上的节点。 然后,这些机架与更先进的交换机互连。
同一机架上的节点可以与 1 Gbps(千兆字节/秒)以太网交换机互连。 然后,集群级别交换机将机架交换机与更快的链路(例如 10 Gbps 光纤链路)和其他网络(例如 InfiniBand)连接起来。 集群级交换机还可以与其他集群级交换机互连,甚至上行链路到另一更高级别的交换基础设施。 随着集群规模的不断增大,网络也将变得越来越大、越来越复杂。 网络高可用性的连接冗余也会增加其复杂性。 在本书中,我们假定讨论基本的网络架构设计方法。 如果您想了解更多先进的网络设计技术,请参考相关书籍和在线材料。
一般来说,中型集群的网络架构可以用下图来描述:

在此图中,我们假设有一台 Hadoop 集群管理员机器,客户端通过网关连接到集群,通过该网关可以提交 Hadoop 作业。
它是如何工作的.
随着网络设备带宽的增加,Hadoop 可以跨互联节点加载和复制大型数据集。 弹性和可扩展的网络架构可以确保 Hadoop 集群的高数据吞吐量和性能要求。
配置集群管理器计算机
正如我们前面提到的,在大量机器上安装 Linux 最有效的方式是通过网络安装。 在本书中,我们假设使用管理员计算机作为安装服务器。 我们将学习配置此服务器的步骤,包括配置以下两项服务:DHCP 和 FTP。
做好准备
在开始之前,我们假设集群管理员机器已经安装了 64 位 Red Hat 兼容的 Linux 操作系统。 机器的主机名是hadoop.admin,并且已经创建了管理用户hdadmin。 该用户应该具有安装软件包、配置系统服务等的sudo权限。 我们还假设此计算机上已安装命令行文本编辑器等管理工具。 我们将在接下来的食谱中直接使用这些工具和命令。
提示
在本书中,我们假设使用CentOS 6.3(对应于 Red Hat Enterprise Linux(RHEL)6.3)作为 Linux 发行版。 我们将对所有管理命令遵循 Red Hat 语法。 如果您使用的是 CentOS 以外的 Linux 发行版,如 Debian,请参考相应的文档。
-
以
hdadmin身份登录到管理员计算机,并使用以下命令更改计算机的主机名:sudo sed -i 's/^HOSTNAME.*$/HOSTNAME=hadoop.admin/'/etc/sysconfig/network -
Create directories with the following command:
mkdir -v ~/mnt ~/isoimages ~/repo提示
我们将使用目录
~/mnt作为 ISO 映像的挂载点。~/isoimages目录将用于包含原始镜像文件,~/repo目录将用作网络安装的存储库文件夹。 -
Install the DHCP and FTP servers on the machine with the following commands:
sudo yum –y install dhcp sudo yum -y install vsftpd提示
我们将在安装过程中使用 DHCP 服务器分配 IP 地址和引导操作系统,并使用 FTP 服务器托管安装包。
-
Download the latest ISO image from a mirror.
提示
CentOS 官网提供全球镜像列表,包括北美、欧洲国家、南美、亚洲、大洋洲、中东、非洲等地区。
选择最近的镜像后,我们可以使用 HTTP 或 FTP 下载镜像。 让我们通过单击所选镜像对应行中的链接来选择 FTP 作为下载方法。 然后依次选择6.3|isos|x86_64。 在这个目录中,如下面的截图所示,我们选择下载两个 ISO 镜像文件。 镜像文件
CentOS-6.3-x86_64-minimal.iso包含所有必要的安装包。CentOS-6.3-x86_64-netinstall.iso镜像文件包含用于通过网络引导的 PXE 网络引导文件。![Getting ready]()
提示
如果您不确定集群机器的架构,请参考产品硬件菜单。
或者,我们可以使用以下
rsync来下载镜像:rsync rsync://mirror.its.dal.ca/centos/6.3/isos/x86_64/CentOS-6.3-x86_64-netinstall.iso ~/isoimages我们也可以使用以下
wget命令下载镜像文件:wget http://mirror.its.dal.ca/centos/6.3/isos/x86_64/CentOS-6.3-x86_64-netinstall.iso -P ~/isoimages -
使用以下命令挂载镜像文件:
sudo mount ~/isoimages/ CentOS-6.3-x86_64-minimal.iso ~/mnt -
使用以下命令将所有文件复制到用于 FTP 托管的
~/repo目录:cp -r ~/mnt/* ~/repo -
Unmount the ISO image with the following command:
sudo umount ~/mnt最小映像的目录树如下所示:
├── EFI │ ├── BOOT │ │ ├── BOOTX64.conf │ │ ├── BOOTX64.efi │ │ ├── splash.xpm.gz │ │ └── TRANS.TBL │ └── TRANS.TBL ├── images │ ├── efiboot.img │ ├── efidisk.img │ ├── install.img │ ├── TRANS.TBL │ └── updates.img ├── isolinux │ ├── boot.msg │ ├── grub.conf │ ├── initrd.img │ ├── isolinux.bin │ ├── isolinux.cfg │ ├── memtest │ └── vmlinuz ├── Packages │ ├── ... ├── ...netinstall镜像的目录树如下所示:├── images │ ├── install.img │ ├── pxeboot │ │ ├── initrd.img │ │ ├── TRANS.TBL │ │ └── vmlinuz │ └── TRANS.TBL └── isolinux ├── boot.msg ├── grub.conf ├── initrd.img ├── isolinux.bin ├── isolinux.cfg ├── memtest ├── ... └── vmlinuz 3 directories, 16 files提示
从目录树中我们可以看到,最小安装镜像文件包含用于系统安装的软件包和引导镜像。
netinstall软件包仅包含用于引导的文件,包括images/pxeboot目录中的网络引导文件。
怎么做……
以下配方将解释如何配置 DHCP 服务器:
-
使用您喜欢的文本编辑器打开文件
/etc/dhcp/dhcpd.conf并更改以下内容:# Domain name option domain-name "hadoop.cluster"; # DNS hostname or IP address option domain-name-servers dlp.server.world; # Default lease time default-lease-time 600; # Maximum lease time max-lease-time 7200; # Declare the DHCP server to be valid. authoritative; # Network address and subnet mask subnet 10.0.0.0 netmask 255.255.255.0 { # Range of lease IP address, should be based # on the size of the network range dynamic-bootp 10.0.0.200 10.0.0.254; # Broadcast address option broadcast-address 10.0.0.255; # Default gateway option routers 10.0.0.1; } -
Start the DHCP server with the following command:
sudo service dhcpd start备注
DHCP 服务器启动时会显示以下消息:
启动 dhcpd:[确定]
-
使 DHCP 服务器在系统重新启动后继续运行:
sudo chkconfig dhcpd --level 3 on
使用下面的配方配置 FTP 服务器:
-
使用您喜欢的文本编辑器打开文件
/etc/vsftpd/vsftpd.conf,并根据以下列表更改内容:# The FTP server will run in standalone mode. listen=YES # Use Anonymous user. anonymous_enable=YES # Disable change root for local users. chroot_local_user=NO # Disable uploading and changing files. write_enable=NO # Enable logging of uploads and downloads. xferlog_enable=YES # Enable port 20 data transfer. connect_from_port_20=YES # Specify directory for hosting the Linux installation packages. anon_ropot=~/repo -
Start the FTP server with the following command:
$ sudo service vsftpd start备注
服务器将启动,并显示以下消息:
正在启动 vsftpd:[确定]
-
Verify the FTP configuration with the following command:
$ ftp hadoop.admin备注
如果我们收到以下消息,则配置成功:
正在尝试 10.0.0.1...。
已连接到 hadoop.admin(10.0.0.1)。
220(vsFTPd 3.0.0)
名称(nowesis157:hdadmin):
另请参阅
创建 kickstart 文件和引导介质
在具有 kickstart 文件的大量节点上安装 Linux 有几个好处。 例如,通过指定要安装的软件包列表并为安装后过程配置系统设置,可以自动执行安装过程。
在本节中,我们将介绍使用操作系统映像创建 kickstart 文件和 USB 引导介质的步骤。
做好准备
Kickstart 文件是用于自动安装 Linux 的纯文本文件。
-
Prepare a USB flash drive with storage capacity larger than 512MB. The drive should have a single
vfatfilesystem partition. We can use the following command to check the filesystem type:blkid备注
我们应该会看到类似以下内容的消息:
/dev/sdb1 SEC_TYPE=“MSDOS”LABEL=“LIVE”UUID=“07D9-051C”type=“vFAT”
-
如果
TYPE属性不是vfat,请使用以下命令清除驱动器的前几个块:dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 -
使用以下命令登录到管理计算机:
ssh hdadmin@hadoop.admin
怎么做……
我们将使用以下步骤创建 kickstart 文件:
-
使用以下命令安装
kickstart文件:sudo yum install system-config-kickstart -
使用您喜欢的文本编辑器创建包含以下内容的
ks.cfg文件:#!/bin/bash # Kickstart for CentOS 6.3 for Hadoop cluster. # Install system on the machine. install # Use ftp as the package repository url --url ftp://hadoop.admin/repo # Use the text installation interface. text # Use UTF-8 encoded USA English as the language. lang en_US.UTF-8 # Configure time zone. timezone America/New_York # Use USA keyboard. keyboard us # Set bootloader location. bootloader --location=mbr --driveorder=sda rhgb quiet # Set root password rootpw --password=hadoop ################################ # Partion the hard disk ################################ # Clear the master boot record on the hard drive. zerombr yes # Clear existing partitions. clearpart --all --initlabel # Create /boot partition, size is in MB. part /boot --fstype ext3 --size 128 # Create / (root) partition. part / --fstype ext3 --size 4096 --grow --maxsize 8192 # Create /var partition. part /var --fstype ext3 --size 4096 --grow --maxsize 8192 # Create Hadoop data storage directory. part /hadoop --fstype ext3 --grow # Create swap partition, 16GB, double size of the main memory. # Change size according to your hardware memory configuration. part swap --size 16384 ################################# # Configure Network device. ################################# # Use DHCP and disable IPv6. network --onboot yes --device eth0 --bootproto dhcp --noipv6 # Disable firewall. firewall --disabled # Configure authorization. authconfig --enableshadow # Put Selinux in permissive mode. selinux --permissive ############################################ # Specify packages to install. ############################################ # Automatically resolve package dependencies, # exclude installation of documents and ignore missing packages. %packages --resolvedeps --excludedocs --ignoremissing # Install core packages. @Base # Don't install OpenJDK. -java # Install wget. wget # Install the vim text editor. vim # Install the Emacs text editor. emacs # Install rsync. rsync # install nmap network mapper. nmap %end #################################### # Post installation configuration. #################################### # Enable post process logging. %post --log=~/install-post.log # Create Hadoop user hduser with password hduser. useradd -m -p hduser hduser # Create group Hadoop. groupadd hadoop # Change user hduser's current group to hadoop. usermod -g hadoop hduser # Tell the nodes hostname and ip address of the admin machine. echo "10.0.0.1 hadoop.admin" >> /etc/hosts # Configure administrative privilege to hadoop group. # Configure the kernel settings. ulimit -u ######################### # Startup services. ######################### service sshd start chkconfig sshd on %end # Reboot after installation. reboot # Disable first boot configuration. firstboot --disable -
Put the kickstart file into the root directory of the FTP server with the command:
cp ks.cfg ~/repo这将使 kickstart 文件在安装过程中可用。
现在,我们将使用以下配方创建 USB 引导介质:
-
使用文本编辑器打开文件
~/isolinux/grub.conf并添加以下内容:default=0 splashimage=@SPLASHPATH@ timeout 0 hiddenmenu title @PRODUCT@ @VERSION@ kernel @KERNELPATH@ ks=ftp://hadoop.admin/ks.cfg initrd @INITRDPATH@ -
使用以下命令从
isolinux目录创建 ISO 文件:mkisofs -o CentOS6.3-x86_64-boot.iso \ -b ~/repo/isolinux/isolinux.bin \ -c ~/repo/isolinux/boot.cat \ -no-emul-boot \ -boot-load-size 4 -
Plug in a USB flash drive on the administrator machine and write the bootable ISO image into the USB flash drive with the following command (assuming the USB drive corresponds to the
/dev/sdbdevice file):dd if=~/CentOS6.3-x86_64-boot.iso of=/dev/sdb提示
警告!
请确保您有 USB 闪存驱动器上数据的备份,当我们将 ISO 映像文件写入驱动器时,所有信息都将被擦除。
它是如何工作的.
Kickstart 文件指定许多安装选项,例如安装介质、网络配置、防火墙配置等。 以#开头的行将被视为注释。
该文件包含%packages部分,该部分指定要安装的软件包。 在本节中,可以指定要安装的特定程序包和程序包组。 例如,在我们的 kickstart 文件中,我们配置为使用@Base安装 Linux 基本软件包。 此外,如果不打算安装某个软件包,我们可以在该软件包之前添加一个破折号。 例如,如果我们不想安装 OpenJDK,我们可以用-java指定。
提示
对于 Hadoop 集群,基本包就足够了,因此我们忽略了 kickstart 文件中不必要的包。
%post部分允许我们在安装后指定配置和命令。 当我们需要在安装操作系统后进行一些管理配置时,这非常有用。 例如,我们可能希望为 Hadoop 创建一个常规用户,该用户具有运行 Hadoop 命令和配置 SSHD 和 FTP 等系统服务的权限。
USB 引导介质用于引导系统并自动启动安装过程。 我们可以在grub.conf文件中指定以下内核启动选项:
ks=ftp://hadoop.admin/ks.cfg
此选项告知 kickstart 文件的位置。 找到 kickstart 文件并将其传输到本地计算机后,将开始自动安装。
还有更多...
除了 FTP 之外,还有其他安装方法,例如,我们也可以使用 NFS 和 HTTP。 这些方法与 FTP 的区别只在于对应的存储库 URL 的配置不同。 例如,如果我们要使用 HTTP 服务器,可以在配置中进行以下两个更改:
- 在 kickstart 文件中,将
url --url ftp://hadoop.admin/repo更改为url --url http://hadoop.admin:80/repo。 - 在
grub.conf文件中,将内核选项从ks=ftp://hadoop.admin/ks.cfg更改为ks=http://hadoop.admin:80/ks.cfg。
另请参阅
- 第 2 章,《为 Hadoop 安装做准备》中的安装 Linux 操作系统配方
安装 Linux 操作系统
虽然有多种方法可以在机器上安装 Linux,但借助 kickstart 文件通过网络进行安装是最有效的选择。 安装过程可以自动化,只需要最少的人工干预。 Kickstart 文件可以保存在服务器上,并在安装过程中由各个机器读取。 在配方中,我们将概述在网络上的许多 Hadoop 节点上安装 Linux 的步骤。
做好准备
在开始之前,我们需要验证 DHCP 服务器和 FTP 服务器是否在管理计算机上正常运行。
在管理员计算机上使用以下命令检查 DHCP 服务器是否工作正常:
ps -ef | grep dhcp
如果该命令输出非空,则表示正常工作,否则需要使用以下命令启动服务:
sudo service dhcpd start
同样,可以使用以下命令检查管理员计算机上的 FTP 服务器:
ftp hadoop.admin
我们应该能够匿名登录,并在根目录中列出 kickstart 文件和安装包。
此外,我们假设集群节点已经过物理配置。 例如,机架和网络设备都工作正常,没有任何问题。
怎么做……
使用以下方法在计算机上安装 Linux:
-
插入 USB 闪存驱动器引导介质并打开计算机电源。
-
Press F9 to select the boot device.
提示
不同的 BIOS 版本可能有不同的快捷键。 如果F9不起作用,请参考相关产品手册。
-
从启动设备列表中,选择USB或Removable Devices。
-
安装开始后,您可以取出引导介质并在下一台计算机上开始安装。
它是如何工作的.
Linux 系统被设计为灵活的。 其引导过程由以下几个阶段组成:
- 打开物理机
- 选择引导介质
- 阶段 1-引导加载程序
- 阶段 2-引导加载程序
- 加载内核镜像
- 系统初始化
在我们开机并选择作为引导介质之后,引导加载程序(在我们的示例中为 GRUB)将开始工作。 GRUB 包含两个引导加载阶段。 在阶段 1 中,可执行程序将运行并加载阶段 2。然后,阶段 2 将加载驻留在引导介质上的内核。 安装操作系统时,内核启动安装过程的功能非常有限,例如,查找软件包的位置。 在我们的示例中,内核选项 kickstart 文件包含安装过程的所有规范。 因此,从 USB 引导介质引导后,一切都将自动完成。
提示
将引导介质与安装程序包库分开的一个优点是,可以并行在多台机器上进行安装,以减少总安装时间。
还有更多...
在 kickstart 文件的帮助下,我们可以在许多机器上自动安装 Linux。 这种方法的一个缺点是我们需要手动引导每台机器。 这是单调乏味的,需要大量的重复性工作。 更糟糕的是,在现实中,我们可能会发现很多服务器甚至没有安装显示器或视频卡。 这使得使用此方法不切实际。 因此,我们需要探索替代方法。
在本部分中,我们将介绍在 DHCP 和 TFTP 服务器的帮助下自动执行安装过程的步骤。 DHCP 服务器被配置为引导服务器,其功能类似于 USB 驱动器引导介质,而 TFTP 被配置为托管实际的操作系统软件包。
为网络引导配置 DHCP
我们在上一节中提到了 DHCP 服务器的基本配置。 要启用 DHCP 的网络引导,我们将使用 TFTP 的预引导执行环境(PXE)方法。
创建包含以下内容的 DHCP 配置文件/etc/dhcpd.conf:
option domain-name "hadoop.cluster";
default-lease-time 5000;
max-lease-time 7200;
# Enable network booting and bootp protocol.
allow booting;
allow bootp;
# IP address allocations.
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.200 10.0.0.253;
option broadcast-address 10.0.0.255;
# Gateway address
option routers 10.0.0.1;
# indicate the dns you want to use
option domain-name-servers 10.0.0.1;
}
group {
next-server 10.0.0.1;
host tftpclient {
# tftp client hardware address
hardware ethernet 00:10:DC:27:6C:15;
filename "/pxelinux.0";
}
}
为网络引导配置 TFTP:
-
使用以下命令登录到管理员计算机:
ssh hdadmin@hadoop.admin -
使用以下命令安装 TFTP 服务器:
sudo yum install tftpd -
Open the file
/etc/xinetd.d/tftpdwith your favorite text editor and edit the content to be similar to the following:service tftp { socket_type = dgram protocol = udp wait = yes user = hdadmin server = /usr/sbin/in.tftpd server_args = -c -s /tftpboot disable = no per_source = 11 cps = 100 2 }备注
在此文件中,我们通过将
disable原语设置为no来启用 TFTP 服务。 -
使用以下命令创建 TFTP 引导镜像目录:
mkdir -p ~/tftp/boot/centos6.3 -
使用以下命令挂载 Net Install ISO 映像:
sudo mount ~/isoimages/CentOS-6.3-x86_64-netinstall.iso ~/mnt -
使用以下命令将 PXE 引导文件复制到引导镜像目录:
cp ~/mnt/images/pxeboot/* ~/tftp/boot/centos6.3 -
使用以下命令启动 TFTP 服务器:
sudo service tftpd start -
Test the TFTP configuration with the following command:
tftp hadoop.admin提示
如果我们可以登录并列出文件,则 TFTP 配置正确。
-
通过打开集群机器的电源开始安装过程。
安装 Java 等工具
Hadoop 是使用 Java 构建的,因此在安装 Hadoop 之前需要 Java。
做好准备
在 Linux 下,OpenJDK 提供了一个开源的 Java 实现。 但是如果我们使用 OpenJDK for Hadoop,就会造成层次低、解决困难的问题。 因此,不建议将 OpenJDK 用于 Hadoop 安装。 相反,建议使用 Oracle 的 Java。
-
Check if OpenJDK has been installed in the system with the command:
rpm –qa | grep openjdk提示
如果没有给出输出,则表示尚未安装 OpenJDK。
-
如果系统中安装了 Java,我们可以使用
java -version检查它的版本
-
如果使用 OpenJDK,我们应该能够得到类似于以下内容的输出:
java version "1.7.0_09-icedtea" OpenJDK Runtime Environment (fedora-2.3.4.fc17-x86_64) OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode) -
在确认我们是否使用 OpenJDK 之后,我们需要删除该软件包并重新安装从 Oracle 官网下载的版本。
-
To remove OpenJDK, we can use the following command:
sudo yum uninstall java-1.x.y-openjdk在此命令中,
1.x.y是要删除的 OpenJDK 版本,例如 1.7.0。提示
警告!
此命令可能具有破坏性,特别是在安装了一些相关软件包的情况下。 在这种情况下,它将提示您确认删除 OpenJDK 以及相关的软件包。 如果您不想删除所有软件包,请对问题回答no。
-
Alternatively, we can use the following
rpmcommand to remove the package:sudo rpm -e java-1.x.y-openjdk此命令将仅删除 OpenJDK 软件包,而不考虑依赖的软件包。
提示
请注意,此命令可能会破坏软件包依赖关系,导致依赖软件无法正常工作。
-
作为另一种替代方法,我们可以调整
PATH环境变量,让两个 Java 版本在系统上共存,同时让系统更喜欢来自 Oracle 的 Java。 -
Suppose we have both OpenJDK and Oracle Java installed in
/usr/openjdkand/usr/jdkrespectively. We can set thePATHenvironment variable to be the following:PATH=/usr/jdk/bin:/usr/openjdk/bin:$PATH或者,如果我们只想使用 Oracle Java,可以将路径设置为:
PATH=/usr/jdk/bin:$PATH -
要从甲骨文下载 JAVA,请访问:http://www.oracle.com/technetwork/java/javase/downloads/index.html。
-
选择Java SE Development Kit 7 Downloads,即 Java 1.7.x(Hadoop 可以使用版本高于或等于 1.6.0 的 Java)。
-
接下来,单击Accept License Agreement单选按钮,并为 64 位 Linux 计算机选择jdk-7u11-linux-x64.rpm。
-
The preceding operations are shown in the following screenshot:

怎么做……
使用以下配方安装 Java 和其他工具:
-
使用以下命令安装 Oracle Java(假设我们将下载的 Java 包保存到主目录:
sudo yum localinstall ~/java-package-*.rpm -
Verify the installation with the following command:
java –version如果正确安装了 Java,则输出应与以下内容类似:
java version "1.6.0_33" Java(TM) SE Runtime Environment (build 1.6.0_33-b04) Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode) -
Use the following command to install necessary tools:
sudo yum –y install wget rsync nmap提示
如果已在安装启动文件中指定了这些软件包,则此步骤将是可选的。
它是如何工作的.
GNUwget是软件工具,用于使用 HTTP、HTTPS 和 FTP 协议传输文件。 它不是交互式的,可以从命令行和脚本下载文件。 有关更多信息,请访问http://www.gnu.org/software/wget/。
rsync是一个提供快速增量文件传输的开源工具。 它被广泛用于 Linux 下的文件复制和同步。 有关 rsync 的更多信息,请访问http://rsync.samba.org/。
Network Mapper(nmap)是著名的网络探测和安全审计工具。 我们可以使用 nmap 扫描大型网络并识别安全问题。 例如,要扫描本地计算机上的服务,可以使用以下命令:
nmap localhost
我们得到类似于以下内容的输出:
Starting Nmap 6.01 ( http://nmap.org ) at 2013-01-26 23:52 EST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0021s latency).
rDNS record for 127.0.0.1: localhost.localdomain
Not shown: 995 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds
备注
输出告诉我们本地机器正在运行以下服务:ftp、ssh、smtp、rpcbind(远程过程调用服务)和jpp(Java 打包服务)。
同样,我们可以使用以下命令扫描 IP 段10.0.1.*:
nmap 10.0.0.*
该命令将为我们提供从10.0.0.1到10.0.0.255的 IP 网段下每台主机的服务信息。
还有更多...
在 Linux 下,我们可以使用man命令来获取命令的用法。 例如,要获得wget的用法,我们可以使用man wget。
如果需要有关命令的更详细信息,我们可以使用info命令。 例如,命令info wget提供了有关wget命令的更多详细信息。
配置 SSH
SSH 是用于安全数据连接和远程命令执行的事实上的标准协议。 安装 Hadoop 需要正确配置 SSH。 在本节中,我们将学习如何在集群节点上配置 SSH。 具体地说,我们正在讨论如何配置 SSH 以无密码登录到远程计算机。
做好准备
使用以下命令在所有集群节点(包括从节点和主节点)上启动 sshd 服务:
sudo service sshd start
使用以下命令使服务在系统重新启动后仍然有效:
sudo chkconfig sshd on
验证sshd是否与主节点的命令一起正常工作:
ssh hduser@slave1
如果是首次登录主机,我们将收到类似以下内容的消息:
The authenticity of host 'hdslave.host(10.0.0.1)' can't be established.
RSA key fingerprint is 7c:e0:61:3b:b6:70:07:ab:65:f9:bf:2d:90:77:1b:57.
Are you sure you want to continue connecting (yes/no)?
我们需要键入yes,然后提供用户hduser登录到主机的密码。
怎么做……
使用下面的配方配置无密码登录:
-
使用以下命令从集群管理员机器登录到主节点:
ssh hduser@master -
Use a text editor to modify the SSHD service configuration file
/etc/ssh/ssh_configby changing the following line:# StrictHostKeyChecking ask致:
StrictHostKeyChecking no -
使用以下命令重新启动 sshd 服务器:
sudo service sshd restart -
Generate private and public keys with the command:
ssh-keygen按输入三次,直到该命令结束。 将生成公钥文件
~/.ssh/id_rsa.pub和私钥文件~/.ssh/id_rsa。 -
使用以下命令将公钥文件复制到远程计算机:
ssh-copy-id slave1 -
Test the configuration with the following command:
ssh hduser@slave1备注
如果我们无需输入密码即可登录,则配置成功!
它是如何工作的.
当我们运行命令ssh-copy-id hdslave.host时,我们实际上将本地计算机上的公钥文件的内容附加到远程计算机上的文件~/.ssh/authorized_keys中。 下次登录时,远程机器上文件~/.ssh/authorized_keys中的公钥字符串和本地私钥将用于登录身份验证过程。
还有更多...
无密码登录失败的配置可能由许多原因引起,例如,防火墙(更具体地说,是 iptables)、SELinux 的配置,甚至是 SSHD 服务器本身的配置。 我们将讨论处理这些潜在问题的方法。
错误的 SSH 设置
如果/etc/ssh_config文件包含以下行:
RSAAuthentication no
PubkeyAuthentication no
表示已禁用公钥授权。 我们需要将这两行更改为以下内容:
RSAAuthentication yes
PubkeyAuthentication yes
使用以下命令确保已在远程计算机上成功重新启动 sshd 服务:
sudo service sshd restart
手动检查远程主机上的~/.ssh/authorized_hosts文件,并查看是否附加了本地计算机的公钥字符串。 如果没有,我们可以使用以下命令将本地计算机的公钥手动附加到远程计算机上的~/.ssh/authorized_hosts:
scp ~/.ssh/id_rsa.pub hduser@hdslave.host:~/
ssh hduser@hdslave.host -C "cat ~/id_rsa.pub >> ~/.ssh/authorized_hosts"
从远程计算机注销并重新登录,如果问题仍然存在,请转到下一节。
错误的 iptables 配置
使用以下命令检查iptables的状态:
sudo iptables -L
如果未打印任何规则,请转到下一步,否则,请使用以下命令刷新所有现有规则以禁用 iptables:
sudo iptables -F
如果问题仍然存在,请转到下一节。
SELinux 配置错误
安全增强型 Linux(SELinux)是 Linux 的一项功能,提供支持访问控制安全策略的机制。 处于强制模式的 SELinux 可以阻止无密码登录操作。 我们可以使用以下命令检查当前的 SELinux 状态:
getenforce
如果我们得到类似于以下内容的输出:
Enforcing
输出表示 SELinux 当前处于强制模式,我们需要使用命令将其置于许可模式:
sudo setenforce 0
或者,我们可以通过编辑/etc/selinux/config文件来禁用 SELinux,并将SELINUX=enforcing更改为SELINUX=disabled。 请注意,需要重新启动系统才能使更改在此方法中生效。
另请参阅
- 创建 kickstart 文件和引导介质配方
三、配置 Hadoop 集群
在本章中,我们将介绍:
- 选择 Hadoop 版本
- 在伪分布式模式下配置 Hadoop
- 在完全分布式模式下配置 Hadoop
- 正在验证 Hadoop 安装
- 配置 ZooKeeper
- 安装 HBase
- 安装配置单元
- 安装清管器
- 安装 Mahout
简介
完成所有准备任务后,我们就可以在本章中配置 Hadoop 集群了。 首先,我们将给您一些关于选择合适的 Hadoop 发布版本的提示。 然后,我们将向您展示如何在伪分布式和全分布式模式下配置 Hadoop 集群。 如果您没有配置 Hadoop 集群的经验,伪分布式模式是一个非常好的起点。 在此模式下,我们将所有 Hadoop 守护进程配置为在一台机器上运行,这可以让我们第一次感受到 Hadoop 集群正在工作,同时将配置困难降至最低。 接下来,我们将向您展示如何验证 Hadoop 集群。 验证 Hadoop 集群配置的重要性永远不会被过分强调。 我们通常使用此步骤来确认 Hadoop 集群是否按预期运行。 最后几个菜谱将向您展示如何在集群中安装一些组件。
选择 Hadoop 版本
作为一个开源项目,Hadoop 在过去几年中得到了积极的开发。 新版本正在定期发布。 这些新版本要么修复了社区贡献的 bug,带来了更稳定的 Hadoop 软件堆栈,要么添加了新功能,以实现更成熟的企业级分发。
在本节中,我们将回顾 Hadoop 版本的历史,指出这些版本的特性。 更重要的是,我们将给出选择合适 Hadoop 发行版的提示。
做好准备
一般而言,Hadoop 发行版的发行版本号由三部分组成:版本号、主要版****修订版号和次版本号****修订版。
备注
有时修订号可以有第四部分,例如 0.20.203.0,但这种情况相对较少。
Hadoop 版本名称可以用下图描述:

怎么做……
下表显示了 Hadoop 主要版本的功能:
|功能\版本
|
2.0.x.2.0.x
|
1.1.x
|
0.23.x 0.23.x
|
0.20.x 0.20.x
|
| --- | --- | --- | --- | --- |
| 马厩 / 赛马训练场 / 组织 / 牛棚 | | 肯定的回答 / 赞成 / 是 | | 肯定的回答 / 赞成 / 是 |
| MRv1 | | 肯定的回答 / 赞成 / 是 | | 肯定的回答 / 赞成 / 是 |
| MRv2 | 肯定的回答 / 赞成 / 是 | | 肯定的回答 / 赞成 / 是 | |
| Kerberos 安全性 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | |
| HDFS 联合 | 肯定的回答 / 赞成 / 是 | | 肯定的回答 / 赞成 / 是 | |
| NameNode HA | 肯定的回答 / 赞成 / 是 | | 肯定的回答 / 赞成 / 是 | |
| HDFS 附加 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | |
| HDFS 符号链接 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | 肯定的回答 / 赞成 / 是 | |
该表告诉我们 Hadoop 正在快速发展,随着时间的推移,安全性、HDFS 联合和NameNode HA等新功能不断增加。 我们可以从该表中学到的另一个教训是,最新的稳定版本 1.1.x 并不包含所有功能。 尽管 2.0.x 版是功能最丰富的 Hadoop 发行版,但它仍然处于阿尔法状态,需要进一步改进。
那么,您应该为您的部署选择哪个版本呢? 一般来说,我们需要考虑两个属性:稳定性和特性。 对于生产部署,我们肯定希望部署一个稳定的版本,并且我们希望使用包含所有必需功能的版本。 显然,我们目前最理想也是唯一的选择是版本 1.1.x,特别是本书撰写时的版本 1.1.2。
另请参阅
- 有关 Hadoop 版本的更多信息,请参阅http://hadoop.apache.org/releases.html
在伪分布式模式下配置 Hadoop
伪分布式模式指的是只包含一个节点的 Hadoop 集群配置。 此模式对调试和验证目的很有帮助。 在本食谱中,我们将概述在伪分布式模式下配置 Hadoop 的步骤。
做好准备
在伪分布式模式下配置 Hadoop 之前,我们假设有一台机器,例如,Hadoop 集群的主节点,安装了 Linux。 我们还假设所有必要的工具都已安装并正确配置。
-
The most important dependent software is Java, which is the programming language and library that Hadoop is based on. To check that Java has been properly installed, we can use the following command:
$ java -version您应该有类似于以下内容的输出:
java version "1.7.0_13" Java(TM) SE Runtime Environment (build 1.7.0_13-b20) Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) -
If you have installed OpenJDK other than the Oracle's official Java, the output will be similar to the following:
Java version "1.7.0_09-icedtea" OpenJDK Runtime Environment (fedora-2.3.4.fc17-x86_64) OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)提示
如果您已经安装了 OpenJDK,请参考第 2 章,准备 Hadoop 安装中的安装 Java 和其他工具食谱。
-
Download the desired Hadoop distribution. In this book, we assume that we're using Hadoop release 1.1.2. To download a Hadoop release, please visit the following URL:
http://www.apache.org/dyn/closer.cgi/hadoop/common/
选择合适的镜像站点(或使用镜像顶部的建议链接)。 点击适当的 Hadoop 版本开始下载。 我们建议下载文件名以
tar.gz结尾的.gzip存档文件。 -
或者,我们可以在 Linux 下使用以下命令下载 Hadoop 版本:
wget http://mirror.quintex.com/apache/hadoop/common/hadoop-1.1.2/hadoop-1.1.2.tar.gz -P ~ -
最后,我们假设已经正确配置了
ssh无密码登录。
怎么做……
要在伪分布式模式下配置 Hadoop,请执行以下步骤:
-
将 Hadoop 归档文件复制到
/usr/local目录:sudo cp hadoop-1.1.2.tar.gz /usr/local -
Decompress the Hadoop package archive:
cd /usr/local sudo tar xvf hadoop-1.1.2.tar.gz未压缩的存档文件将包含以下文件和文件夹:
CHANGES.txt c++ hadoop-examples-1.1.2.jar lib LICENSE.txt conf hadoop-minicluster-1.1.2.jar libexec NOTICE.txt contrib hadoop-test-1.1.2.jar sbin README.txt hadoop-ant-1.1.2.jar hadoop-tools-1.1.2.jar share bin hadoop-client-1.1.2.jar ivy src build.xml hadoop-core-1.1.2.jar ivy.xml webapps备注
该文件夹包含多个
.jar文件和文件夹,如bin、sbin和conf。.jar文件hadoop-core-1.1.2.jar和hadoop-tools-1.1.2.jar包含 Hadoop 的核心类。 文件hadoop-examples-1.1.2.jar和hadoop-test-1.1.2.jar包含示例 MapReduce 作业。conf文件夹包含集群配置文件,bin文件夹包含启动和停止集群的命令和脚本,sbin文件夹包含执行特定任务的脚本。 -
创建 Hadoop 根目录的软链接:
sudo ln -s hadoop-1.1.2 hadoop -
Use your favorite text editor to open the file
~/.bashrcand add the following contents:export JAVA_HOME=/usr/java/latest export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$JAVA_HOME/bin:HADOOP_HOME/bin备注
我们假设 Oracle Java 已安装在
/usr/java/latest目录下。 -
使用以下命令重新加载配置文件
~/.bashrc:. ~/.bashrc -
使用您喜欢的文本编辑器打开文件
$HADOOP_HOME/conf/hadoop-env.sh,并将JAVA_HOME环境变量更改为以下内容:export JAVA_HOME=/usr/Java/latest -
使用您喜欢的文本编辑器打开文件
$HADOOP_HOME/conf/core-site.xml,并添加以下内容:<configuration> <property> <name>fs.default.name</name> <value>hdfs://localhost:54310</value> </property> <property> <name>mapred.job.tracker</name> <value>localhost:54311</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/tmp/</value> </property> </configuration> -
使用您喜欢的文本编辑器打开文件
$HADOOP_HOME/conf/hdfs-site.xml,并向该文件添加以下内容:<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.data.dir</name> <value>/hadoop/data/</value> </property> </configuration> -
使用您喜欢的文本编辑器打开文件
$HADOOP_HOME/conf/mapred-site.xml,并添加以下内容:<configuration> <property> <name>mapred.system.dir</name> <value>/hadoop/mapred</value> </property> </configuration> -
使用以下命令要求
localhost运行 Second DaryNameNode 守护进程:
```sh
sudo echo "localhost" > $HADOOP_HOME/conf/masters
```
- 使用以下命令将
localhost配置为单个从节点:
```sh
sudo echo "localhost" > $HADOOP_HOME/conf/slaves
```
使用以下步骤启动和停止 Hadoop 集群:
-
Format the HDFS filesystem from NameNode with the following command:
hadoop namenode -format我们将得到类似于以下内容的输出:
13/02/14 01:43:12 INFO namenode.NameNode: STARTUP_MSG: /************************************************************ STARTUP_MSG: Starting NameNode STARTUP_MSG: host = localhost/127.0.0.1 STARTUP_MSG: args = [-format] STARTUP_MSG: version = 1.1.2 STARTUP_MSG: build = https://svn.apache.org/repos/asf/hadoop/common/branches/branch-1.0 -r 1393290; compiled by 'hortonfo' on Wed Oct 3 05:13:58 UTC 2012 ************************************************************/ 13/02/14 01:43:13 INFO util.GSet: VM type = 64-bit 13/02/14 01:43:13 INFO util.GSet: 2% max memory = 17.77875 MB 13/02/14 01:43:13 INFO util.GSet: capacity = 2^21 = 2097152 entries 13/02/14 01:43:13 INFO util.GSet: recommended=2097152, actual=2097152 13/02/14 01:43:13 INFO namenode.FSNamesystem: fsOwner=shumin 13/02/14 01:43:13 INFO namenode.FSNamesystem: supergroup=supergroup 13/02/14 01:43:13 INFO namenode.FSNamesystem: isPermissionEnabled=true 13/02/14 01:43:13 INFO namenode.FSNamesystem: dfs.block.invalidate.limit=100 13/02/14 01:43:13 INFO namenode.FSNamesystem: isAccessTokenEnabled=false accessKeyUpdateInterval=0 min(s), accessTokenLifetime=0 min(s) 13/02/14 01:43:13 INFO namenode.NameNode: Caching file names occuring more than 10 times 13/02/14 01:43:13 INFO common.Storage: Image file of size 112 saved in 0 seconds. 13/02/14 01:43:14 INFO common.Storage: Storage directory /hadoop/tmp/dfs/name has been successfully formatted. 13/02/14 01:43:14 INFO namenode.NameNode: SHUTDOWN_MSG: /************************************************************ SHUTDOWN_MSG: Shutting down NameNode at localhost/127.0.0.1 ************************************************************/ -
Start the HDFS daemons with the following command:
start-dfs.sh我们将得到类似于以下内容的输出:
starting namenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-namenode-localhost.out localhost: starting datanode, logging to /usr/local/hadoop/Hadoop/libexec/../logs/hadoop-hduser-datanode-localhost.out localhost: starting secondarynamenode, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-secondarynamenode-localhost.out备注
输出显示以下 HDFS 守护程序已启动:
NameNode、DataNode 和 Second daryNameNode。
-
Start the MapReduce daemons with the following command:
start-mapred.sh输出将类似于以下内容:
starting jobtracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-jobtracker-localhost.out localhost: starting tasktracker, logging to /usr/local/hadoop/libexec/../logs/hadoop-hduser-tasktracker-localhost.out备注
输出显示 JobTracker 和 TaskTracker MapReduce 守护进程已启动。
-
With the
jpscommand, we can get a list of all running daemons as follows:10984 SecondaryNameNode 11272 TaskTracker 11144 JobTracker 26966 NameNode 10855 DataNode 27183 Jps备注
到目前为止,所有 Hadoop 守护进程都已启动。
-
使用以下命令停止 MapReduce 后台进程:
stop-mapred.sh -
使用以下命令停止 HDFS 守护程序:
stop-hdfs.sh
它是如何工作的.
在类 Unix 操作系统下,系统运行时配置和环境变量是通过纯文本文件指定的。 这些文件称为运行配置文件,表示它们在程序运行时提供配置。 例如,用户主目录下的.bashrc文件是 bash shell 的运行配置文件。 每次打开 bash 终端时,它都会自动源(加载)。 因此,在此文件中,我们可以为运行的 bash 环境指定命令和环境变量。
提示
.bashrc 或.bash_profile
在 Linux 下,bash shell 为一个用户提供了两个运行配置文件.bashrc和.bash_profile。 这两个文件的不同之处在于,.bash_profile是针对登录 shell 执行的,而.bashrc是针对交互式非登录 shell 执行的。 更具体地说,当我们在本地或从远程机器输入用户名和密码登录到系统时,将执行.bash_profile,并初始化 bash shell 进程。 另一方面,如果我们在登录机器后打开一个新的 bash 终端,或者在命令行中输入bash命令,那么在我们看到终端窗口上的命令提示符之前,将使用.bashrc文件进行初始化。 在本配方中,我们使用了.bashrc文件,以便在打开新的 bash 流程后可以使用新的配置。 或者,我们也可以在使用source命令创建或更改配置文件后手动创建源文件。
下表显示了在伪分布式模式下配置 Hadoop 集群的配置文件:
|文件夹 / 卷宗 / 文件 / 锉刀
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| hadoop-env.sh | 配置 Hadoop 使用的环境变量 |
| core-site.xml | 配置整个 Hadoop 集群的参数 |
| hdfs-site.xml | 配置 HDFS 及其客户端的参数 |
| mapred-site.xml | 配置 MapReduce 及其客户端的参数 |
| masters | 配置 Second DaryNameNode 的主机 |
| slaves | 配置从节点主机列表 |
以下列表说明了配置文件:
hadoop-env.sh指定用于运行 Hadoop 的个环境个变量。 例如,Java 安装的主目录JAVA_HOME、与 Hadoop 运行时选项和集群日志记录相关的主目录,等等。core-site.xml指定 HDFS NameNode 和 MapReduce JobTracker 的 URI。fs.default.name属性的hdfs://localhost:54310值将默认文件系统的位置指定为使用端口54310的localhost上的 HDFS。 我们可以指定其他文件系统方案,比如使用file:///home/hduser/hadoop的本地文件系统、使用s3://a-bucket/hadoop的 Amazon web 服务 S3,等等。mapred.job.tracker属性的localhost:54311值指定集群的 JobTracker 的 URI。hdfs-site.xml指定与 HDFS 相关的配置。 例如,dfs.replication配置 HDFS 上的数据块的复制因子。 例如,值2指定每个数据块将在文件系统上复制两次。dfs.data.dir属性指定主机 Linux 文件系统上数据目录的位置。mapred-site.xml指定 MapReduce 框架的配置。 例如,我们可以配置jvm个任务的总数、map个插槽的数量,以及减少从节点上的插槽、减少每个任务的内存量等。masters文件指定将运行 Second daryNameNode 守护进程的台主机。 在我们的单节点配置中,我们将localhost放入此文件。 第二个 daryNameNode 守护进程将在localhost上启动,该守护进程已使用jps命令进行了验证。slaves文件指定运行由任务跟踪器控制的任务的从节点。 在我们的伪分布式模式配置中,localhost是集群中唯一的从节点。
Hadoop 提供了许多 bash 脚本,以方便启动和停止集群。 下表显示了这些脚本:
|书法 / 笔迹 / 手书 / 剧本
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| start-dfs.sh | 此是启动 HDFS 守护进程的脚本,包括 NameNode、Second daryNameNode 和 DataNode。 将在默认文件夹${hadoop.tmp.dir}下为每个守护进程创建一个 PID 文件。 例如,如果用户hduser用于运行脚本,则将为 NameNode 守护进程创建/hadoop/tmp/hadoop-hduser-namenode.pid文件。 |
| stop-dfs.sh | 此是停止 HDFS 守护进程的脚本。 此命令将尝试查找 HDFS 守护进程的 PID 文件,并终止具有 PID 文件的进程。 因此,如果缺少 PID 文件,此脚本将不起作用。 |
| start-mapred.sh | 这个是启动 MapReduce 守护进程的脚本,包括 JobTracker 和 TaskTracker 守护进程。 与start-hdfs.sh脚本类似,将为每个守护进程创建 PID 文件。 |
| stop-mapred.sh | 这是停止 Hadoop MapReduce 守护进程的脚本。 与stop-dfs.sh脚本类似,该脚本将尝试查找 PID 文件,然后终止这些进程。 |
| start-all.sh | 它等于等于start-dfs.sh加上start-mapred.sh。 |
| stop-all.sh | 它等于等于stop-dfs.sh加上stop-mapred.sh。 |
还有更多...
目前,Hadoop 还提供rpm格式。 因此,我们可以使用以下命令安装 Hadoop:
sudo rpm -ivh http://www.poolsaboveground.com/apache/hadoop/common/stable/hadoop-1.1.2-1.x86_64.rpm
安装文件的位置与 tarball 方法不同,我们可以使用以下命令检查文件布局:
rpm -ql hadoop
然后,我们可以使用以下命令在单节点中配置 Hadoop 集群:
sudo hadoop-setup-single-node.sh
另请参阅
在完全分布式模式下配置 Hadoop
要在完全分布式模式下配置 Hadoop 集群,我们需要配置所有主机和从机。 虽然与伪分布式模式不同,但配置体验将是相似的。 在本食谱中,我们将概述在完全分布式模式下配置 Hadoop 的步骤。
做好准备
在本书中,我们建议配置一个具有一个主节点和五个从节点的 Hadoop 集群。 master节点的主机名为1,从节点的主机名为slave1、slave2、slave3、slave4和slave5。
在开始之前,我们假设 Linux 已经安装在所有集群节点上,并且我们应该在主节点上使用以下命令验证无密码登录:
ssh hduser@slave1
ssh hduser@slave2
...
提示
与伪分布式模式不同,在完全分布式模式下配置 Hadoop 集群需要成功配置集群中的所有节点。 否则,集群将无法按预期工作。
我们应该谨慎对待集群节点的互联互通。 连接问题可能是由防火墙、网络等的配置引起的。
假设$HADOOP_HOME/conf/slaves文件包含从节点的主机名,我们可以使用以下命令检查从主节点到所有从节点的无密码登录:
for host in 'cat $HADOOP_HOME/conf/slaves'; do
echo 'Testing ssh from master to node ' $host
ssh hduser@$host
done
怎么做……
使用以下配方在完全分布式模式下配置 Hadoop:
-
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master -
将 Hadoop 归档文件复制到
/usr/local目录:sudo cp hadoop-1.1.2.tar.gz /usr/local -
解压缩 Hadoop 存档:
cd /usr/local sudo tar xvf hadoop-1.1.2.tar.gz -
为 Hadoop 根目录创建适当的软链接:
sudo ln -s hadoop-1.1.2 hadoop -
使用您喜欢的文本编辑器打开
~/.bashrc文件,并添加以下内容:export JAVA_HOME=/usr/java/latest export HADOOP_HOME=/usr/local/Hadoop export PATH=$PATH:$JAVA_HOME/bin:HADOOP_HOME/bin -
使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/hadoop-env.sh文件,并添加以下内容:export JAVA_HOME=/usr/java/latest -
使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/core-site.xml文件,并添加以下内容:<configuration> <property> <name>fs.default.name</name> <value>hdfs://master:54310</value> </property> <property> <name>mapred.job.tracker</name> <value>master:54311</value> </property> </configuration> -
使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/hdfs-site.xml文件,然后将以下内容添加到文件中:<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.data.dir</name> <value>/hadoop/data/</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/tmp/</value> </property> </configuration> -
使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/mapred-site.xml文件,并添加以下内容:<configuration> <property> <name>mapred.tasktracker.map.tasks.maximum</name> <value>6</value> </property> <property> <name>mapred.tasktracker.reduce.tasks.maximum</name> <value>6</value> </property> <property> <name>mapred.map.child.java.opts</name> <value>-Xmx512m</value> </property> <property> <name>mapred.reduce.child.java.opts</name> <value>-Xmx512m</value> </property> </configuration> -
Configure the
$HADOOP_HOME/conf/mastersfile with the following command:
```sh
sudo echo "master" > $HADOOP_HOME/conf/masters
```
这将配置主节点以运行 Second daryNameNode。
- 使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/slaves文件,并将所有从节点主机名添加到该文件中,如下所示:
```sh
slave1
slave2
slave3
...
```
- Copy the configured Hadoop directory to all the slave nodes with the following command:
```sh
for host in 'cat $HADOOP_HOME/conf/slaves
do
echo 'Configuring hadoop on slave node ' $host
sudo scp -r /usr/local/hadoop-1.1.2 hduser@$host:/usr/local/
echo 'Making symbolic link for Hadoop home directory on host ' $host
sudo ssh hduser@$host -C "ln -s /usr/local/hadoop-1.1.2 /usr/local/hadoop"
done
```
### 备注
`for-loop`命令会递归地将`/usr/local/hadoop-1.1.2`目录复制到`$HADOOP_HOME/conf/slaves`文件中指定的每个节点,并在每个节点上为 Hadoop 目录创建一个符号链接。 我们可以获得以下输出信息:
```sh
Configuring hadoop on slave node slave1
Making symbolic link for Hadoop home directory on host host slave1
Configuring hadoop on slave node slave2
Making symbolic link for Hadoop home directory on host host slave2
Configuring hadoop on slave node slave3
Making symbolic link for Hadoop home directory on host host slave3
Configuring hadoop on slave node slave4
Making symbolic link for Hadoop home directory on host host slave4
...
```
- 使用以下命令将 bash 配置文件复制到每个从节点:
```sh
for host in cat $HADOOP_HOME/conf/slaves; do
echo 'Copying local bash run configuration file to host ' $host
sudo cp ~/.bashrc $host:~/
done
```
备注
for-loop命令将 bash run 配置文件从主节点复制到集群中的所有从节点。 我们可以获得以下输出消息:
Copying local bash run configuration file to host slave1
Copying local bash run configuration file to host slave2
Copying local bash run configuration file to host slave3
...
使用以下配方启动 Hadoop 集群:
-
Format the HDFS filesystem on the master node with the following command:
hadoop namenode -format提示
如果这是第一次格式化 HDFS,该命令应该会自动完成。 如果您正在重新格式化现有的文件系统,它将要求您允许格式化该文件系统。 例如,输出信息将包含类似以下内容的消息:
Re-format filesystem in /tmp/hadoop-shumin/dfs/name ? (Y or N)在这种情况下,我们需要按Y确认文件系统的重新格式化。 请注意,当您按下Enter键后,所有数据都将被清除。
-
Check the directory structure of the formatted NameNode with the following command:
tree /hadoop/dfs/输出将类似于以下内容:
/hadoop/dfs/ └── name ├── current │ ├── edits │ ├── fsimage │ ├── fstime │ └── VERSION └── image └── fsimage 3 directories, 5 files备注
树形列表显示了格式化 HDFS 文件系统的目录结构,该文件系统包含主内存中的文件系统
image(在/hadoop/dfs/name/image目录中)和当前活动的image(镜像到/hadoop/dfs/name/current文件夹)。 -
Start HDFS cluster daemons with the following command:
start-dfs.sh我们将得到类似于以下内容的输出:
starting namenode, logging to /usr/local/hadoop/logs/hadoop-hdu ser-namenode-master.out slave1: starting datanode, logging to /usr/local/hadoop/logs/h adoop-hduser-datanode-sslave1.out slave2: starting datanode, logging to /usr/local/hadoop/logs/ hadoop-hduser-datanode-slave2.out slave3: starting datanode, logging to /usr/local/hadoop/logs/ hadoop-hduser-datanode-slave3.out slave4: starting datanode, logging to /usr/local/hadoop/logs/ hadoop-hduser-datanode-slave4.out slave5: starting datanode, logging to /usr/local/hadoop/logs/ hadoop-hduser-datanode-slave5.out master: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hduser-secondarynamenode-hadoop-master.out备注
输出消息显示在主节点上启动了 NameNode 和 Second daryNameNode 守护进程,在每个从节点上启动了一个 DataNode 守护进程。
-
Start the MapReduce cluster daemons with the following command:
start-mapred.sh输出将类似于以下内容:
starting jobtracker, logging to /usr/local/hadoop/logs/hadoop-hduser-jobtracker-master.out slave1: starting tasktracker, logging to /usr/local/Hadoop/logs/hadoop-hduser-tasktracker-slave1.out slave2: starting tasktracker, logging to /usr/local/Hadoop/logs/hadoop-hduser-tasktracker-slave2.out slave3: starting tasktracker, logging to /usr/local/Hadoop/logs/hadoop-hduser-tasktracker-slave3.out slave4: starting tasktracker, logging to /usr/local/Hadoop/logs/hadoop-hduser-tasktracker-slave4.out slave5: starting tasktracker, logging to /usr/local/Hadoop/logs/hadoop-hduser-tasktracker-slave5.out备注
输出消息显示在主节点上启动了 JobTracker 守护进程,在每个从节点上启动了 TaskTracker 守护进程。
-
On the master node, check the status of the Hadoop daemons with the following command:
jps输出将类似于以下内容:
19512 NameNode 19930 JobTracker 19708 SecondaryNameNode 20276 Jps -
On a slave node, we can check the status of the daemon processes with the same command, and the output will be similar to the following:
3949 Jps 3639 TaskTracker 3501 DataNode提示
前两个步骤中突出显示的守护程序必须存在。 否则会出现配置问题。 您可以查看菜谱验证 Hadoop 安装以获得故障排除和调试建议。
-
List all the available TaskTrackers with the following command:
hadoop job -list-active-trackers输出消息将类似于以下内容:
tracker_slave1:slave1/10.0.0.2:38615 tracker_slave2:slave2/10.0.0.3:39618 tracker_slave3:slave3/10.0.0.4:48228 tracker_slave4:slave4/10.0.0.5:42954 tracker_slave5:slave5/10.0.0.6:43858 -
Check the status of each node in the HDFS cluster with the following command:
hadoop dfsadmin -report输出消息将类似于以下内容:
Configured Capacity: 13500319031296 (12.28 TB) Present Capacity: 12015141961728 (10.93 TB) DFS Remaining: 4067084627968 (3.7 TB) DFS Used: 7948057333760 (7.23 TB) DFS Used%: 66.15% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Datanodes available: 5 (5 total, 0 dead) Name: 192.168.1.14:50010 Decommission Status : Normal Configured Capacity: 964306395136 (898.08 GB) DFS Used: 590553788416 (550 GB) Non DFS Used: 97300185088 (90.62 GB) DFS Remaining: 276452421632(257.47 GB) DFS Used%: 61.24% DFS Remaining%: 28.67% Last contact: Sat Feb 16 00:34:17 EST 2013 ... Name: 192.168.1.17:50010 Decommission Status : Normal Configured Capacity: 964262363136 (898.04 GB) DFS Used: 617057673216 (574.68 GB) Non DFS Used: 81531011072 (75.93 GB) DFS Remaining: 265673678848(247.43 GB) DFS Used%: 63.99% DFS Remaining%: 27.55% Last contact: Sat Feb 16 00:34:15 EST 2013
备注
输出显示集群中有5个 DataNode,并报告每个 DataNode 的状态,如容量和使用率。
使用以下两个步骤停止正在运行的 Hadoop 集群:
-
Stop the MapReduce daemons with the following command on the master node:
stop-mapred.sh我们将获得类似以下内容的输出消息:
stopping jobtracker slave3: stopping tasktracker slave2: stopping tasktracker slave5: stopping tasktracker slave4: stopping tasktracker slave1: stopping tasktracker备注
输出显示主节点上的 JobTracker 守护进程和从节点上的 TaskTracker 守护进程正在停止。
-
Stop the HDFS daemons with the following command on the master node:
stop-dfs.sh输出消息将类似于以下内容:
stopping namenode slave3: stopping datanode slave4: stopping datanode slave2: stopping datanode slave1: stopping datanode slave5: stopping datanode localhost: stopping secondarynamenode
备注
输出显示主节点上的 NameNode 和 Second daryNameNode 守护进程以及从节点上的 DataNode 守护进程正在停止。
它是如何工作的.
下表显示了此配方中使用的属性:
|性质 / 财产 / 所有权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| fs.default.name | 默认文件系统的 URI。 |
| mapred.job.tracker | JobTracker 的 URI,例如localhost:54310。 |
| dfs.replication | 指定块应复制到多少个节点。 此属性的默认值为3。 |
| dfs.data.dir | 数据节点上数据块的本地存储目录。 |
| hadoop.tmp.dir | 许多其他目录的基目录。 |
| mapred.tasktracker.map.tasks.maximum | TaskTracker 守护程序可以运行的最大并行映射任务数。 |
| mapred.tasktracker.reduce.tasks.maximum | TaskTracker 守护程序可以运行的最大并行 Reduce 任务数。 |
| mapred.map.child.java.opts | map任务子进程的 Java 选项。 |
| mapred.reduce.child.java.opts | Reduce 任务子进程的 Java 选项。 |
还有更多...
或者,我们也可以使用以下步骤配置全分布式 Hadoop 集群:
-
使用以下命令在管理员计算机上下载 Hadoop
rpm包:wget http://www.poolsaboveground.com/apache/hadoop/common/stable/hadoop-1.1.2-1.x86_64.rpm -P ~/repo -
使用以下命令登录主节点:
ssh hduser@master -
使用以下命令在所有节点上安装 Hadoop:
for host in master slave1 slave2 slave3 slave4 slave5; do echo 'Installing Hadoop on node: ' $host sudo rpm -ivh ftp://hadoop.admin/repo/hadoop-1.1.2-1.x86_64.rpm done -
通过修改位于
/etc/hadoop文件夹中的配置文件来配置 Hadoop 集群。
另请参阅
验证 Hadoop 安装
在验证步骤之前,不会完成 Hadoop 集群的配置。 验证在 Hadoop 集群的配置中扮演着重要的角色;例如,它可以帮助我们找出配置问题。
验证 Hadoop 集群配置的最直接方法是从主节点运行 MapReduce 作业。 或者,有两种方法可以验证集群配置。 一个来自 Web 界面,另一个来自命令行。 在本食谱中,我们将列出验证 Hadoop 集群配置的步骤。
做好准备
要从 Web 界面验证配置,需要使用 Firefox 或 Google Chrome 等 Web 浏览器。 有时,如果 GUI Web 浏览器不可用,我们可以使用基于命令行的 Web 浏览器,如elinks和lynx。 在本书中,我们假定使用elinks作为说明。
我们假设已经使用以下命令安装了elinks:
sudo yum install elinks
使用以下命令启动所有 Hadoop 守护程序:
start-dfs.sh
start-mapred.sh
怎么做……
使用以下步骤运行 MapReduce 作业:
-
使用以下命令登录主节点:
ssh hduser@master -
Run a sample MapReduce job with the following command:
hadoop jar $HADOOP_HOME/hadoop-examples*.jar pi 20 100000提示
在此命令中,
hadoop-examples*jar是一个.jar文件,其中包含一些示例 MapReduce 作业,如pi。 选项20是要运行的任务数,100000指定每个任务的样本大小。如果该作业完成时没有任何问题,我们可以说 Hadoop 集群正在工作。 但这还不够,因为我们还需要确保所有从节点都可用于运行任务。
使用以下步骤通过 Web 用户界面验证 Hadoop 集群配置:
-
Open the
master:50030/jobtracker.jspURL with a web browser. The web page will be similar to the following screenshot:![How to do it...]()
-
Check the status of each slave node by clicking on the link, which leads us to a web page similar to the following screenshot:
![How to do it...]()
从这个屏幕截图中,我们可以很容易地检查从节点上活动的 TaskTracker 的状态。 例如,我们可以看到失败任务的计数、MapReduce 插槽的数量、心跳秒数等等。
-
Check the status of slave DataNodes by opening the
master:50070URL. The web page will be similar to the following screenshot:![How to do it...]()
-
By clicking on the Live Nodes link we can see the details of each node as shown in the following screenshot:
![How to do it...]()
-
Run an example
teragenjob to generate 10 GB data on the HDFS with the following command:hadoop jar $HADOOP_HOME/hadoop-examples-1.1.2.jar teragen $((1024*1024*1024* 10/100)) teraout备注
在此命令中,
hadoop-examples-1.1.2.jar是 Java 存档文件,它提供了许多 Hadoop 示例。 选项$((1024*1024*1024* 10/100))告诉我们总数据大小为 10 GB 时将生成多少行数据。 -
When the job is running, we can check the status of the job by opening the following URL:
http://master:50030/jobdetails.jsp?jobid=job_201302160219_0003&refresh=30备注
在此 URL 中,
job_201302160219_0003是作业 ID,refresh=30表示应该刷新网页的频率。作业状态网页将类似于以下屏幕截图:
![How to do it...]()
-
After the
teragenjob finishes, we can check the node storage space usage by opening the URLhttp://master:50070/dfsnodelist.jsp?whatNodes=LIVE. The web page will be similar to the following screenshot:![How to do it...]()
有时,基于命令行的 Web 浏览器可能比 GUI 浏览器更方便。 例如,我们可以使用elinks master:50030命令检查主节点上 MapReduce 的状态,并使用elinks master:50070命令检查 HDFS 的状态。
使用以下步骤从命令行验证 Hadoop 集群的配置:
-
List all available TaskTrackers with the following command:
hadoop job -list-active-trackers示例输出类似于以下内容:
tracker_slave1:localhost/127.0.0.1:53431 tracker_slave4:localhost/127.0.0.1:52644 tracker_slave3:localhost/127.0.0.1:37775 tracker_slave2:localhost/127.0.0.1:56074 tracker_slave5:localhost/127.0.0.1:43541备注
输出确认所有配置的 TaskTracker 在 Hadoop 集群中都处于活动状态。
-
Check the status of the HDFS cluster with the following command:
hadoop fsck /输出将类似于以下内容:
FSCK started by hduser from /10.0.0.1 for path / at Sat Feb 16 03:03:44 EST 2013 ...............................Status: HEALTHY Total size: 7516316665 B Total dirs: 15 Total files: 31 Total blocks (validated): 125 (avg. block size 60130533 B) Minimally replicated blocks: 125 (100.0 %) Over-replicated blocks: 0 (0.0 %) Under-replicated blocks: 0 (0.0 %) Mis-replicated blocks: 0 (0.0 %) Default replication factor: 2 Average block replication: 2.0 Corrupt blocks: 0 Missing replicas: 0 (0.0 %) Number of data-nodes: 5 Number of racks: 1 FSCK ended at Sat Feb 16 03:03:44 EST 2013 in 12 milliseconds The filesystem under path '/' is HEALTHY
备注
输出给我们的信息与 Web 界面中的信息相同,最后一行告诉我们root文件系统是HEALTHY。
它是如何工作的.
Hadoop 提供命令和 Web 界面,供系统管理员检查集群状态。 当我们启动 Hadoop 守护进程时,将启动一个内置的 Web 服务器,并使用一些预写的.jsp脚本文件来响应来自 Web 浏览器的用户请求。 可以在$HADOOP_HOME/webapps目录下找到.jsp文件。 如果您有编程经验,您可以利用.jsp文件来开发个性化的 Hadoop 集群管理工具。
还有更多...
在这一部分中,我们列出了几个典型的 Hadoop 配置问题,并给出了解决这些问题的建议。
无法启动 HDFS 后台进程
有许多可能的原因可能导致此问题。 例如,主节点上的 NameNode 尚未格式化,在这种情况下,我们可以使用以下命令在启动集群之前格式化 HDFS:
hadoop namenode -format
提示
警告!
使用此命令格式化文件系统时要小心。 它将擦除文件系统上的所有数据。 在使用此方法之前,请务必尝试其他方法。
一般而言,要解决此问题,我们需要检查 HDFS 是否已正确配置以及守护进程是否正在运行。 这可以使用以下命令来完成:
jps
提示
如果此命令的输出不包含 NameNode 和 Second daryNameNode 守护进程,我们需要检查 HDFS 的配置。
要解决 HDFS 启动问题,我们可以打开一个新终端,并使用以下命令监视主节点上的 NameNode 日志文件:
tail -f $HADOOP_HOME/logs/hadoop-hduser-namenode-master.log
当向日志文件追加新日志时,此命令将以动态方式显示日志文件的内容。 如果发生错误,我们可以得到类似以下内容的错误消息:
2013-02-16 11:44:29,860 ERROR org.apache.hadoop.hdfs.server.namenode.NameNode: java.net.UnknownHostException: Invalid hostname for server: master1
at org.apache.hadoop.ipc.Server.bind(Server.java:236)
at org.apache.hadoop.ipc.Server$Listener.<init>(Server.java:302)
at org.apache.hadoop.ipc.Server.<init>(Server.java:1488)
at org.apache.hadoop.ipc.RPC$Server.<init>(RPC.java:560)
at org.apache.hadoop.ipc.RPC.getServer(RPC.java:521)
at org.apache.hadoop.hdfs.server.namenode.NameNode.initialize(NameNode.java:295)
at org.apache.hadoop.hdfs.server.namenode.NameNode.<init>(NameNode.java:529)
at org.apache.hadoop.hdfs.server.namenode.NameNode.createNameNode(NameNode.java:1403)
at org.apache.hadoop.hdfs.server.namenode.NameNode.main(NameNode.java:1412)
2013-02-16 11:44:29,865 INFO org.apache.hadoop.hdfs.server.namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at master/10.144.150.104
************************************************************/
或者,以下命令也会给出相同的错误:
hadoop jobtracker
备注
前面的消息显示 NameNode 的主机名错误。 应该是master而不是master1。
集群缺少从节点
此问题很可能是由主机名解析引起的。 为了确认,我们可以使用以下命令检查/etc/hosts文件的内容:
cat /etc/hosts
输出应与以下内容类似:
10.0.0.1 master
10.0.0.2 slave1
10.0.0.3 slave2
10.0.0.4 slave3
10.0.0.5 slave4
10.0.0.6 slave5
备注
如果 IP 地址和主机名映射不存在或在此文件中指定错误,纠正错误可以解决此问题。
无法启动 MapReduce 后台进程
以下两个原因可能导致此问题:
-
The HDFS daemons are not running, which can cause the MapReduce daemons to ping the NameNode daemon at a regular interval, which can be illustrated with the following log output:
13/02/16 11:32:19 INFO ipc.Client: Retrying connect to server: master/10.0.0.1:54310\. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS) 13/02/16 11:32:20 INFO ipc.Client: Retrying connect to server: master/10.0.0.1:54310\. Already tried 1 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS) 13/02/16 11:32:21 INFO ipc.Client: Retrying connect to server: master/10.0.0.1:54310\. Already tried 2 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS) 13/02/16 11:32:22 INFO ipc.Client: Retrying connect to server: master/10.0.0.1:54310\. Already tried 3 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS) 13/02/16 11:32:23 INFO ipc.Client: Retrying connect to server: master/10.0.0.1:54310\. Already tried 4 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=10, sleepTime=1 SECONDS).备注
要解决此问题,我们可以参考无法启动 HDFS 守护进程部分中的提示。
-
Configuration problems of MapReduce can cause the
MapReduce daemons can't be startedproblem. Recall that we have configurations for the number of themapslots and reduce slots as well as the amount of memory in the$HADOOP_HOME/conf/mapred-site.xmlfile. Before starting a cluster, we need to make sure that the total amount of configured memory should be smaller than the total amount of system memory.备注
例如,假设从主机有 4 GB 内存,我们配置了 6 个映射插槽和 6 个 Reduce 插槽,每个插槽有 512 MB 内存。 因此,我们可以使用以下公式计算配置的任务内存总量:
6 × 512 + 6x512 = 6GB
由于 6 GB 的内存大于 4 GB 的系统内存,系统将不会启动。 要解决此问题,我们可以减少
map个插槽的数量,并将插槽从 6 个减少到 3 个。 此配置为我们提供了 3 GB 的总配置内存,这比系统总内存 4 GB 要小,因此 MapReduce 守护进程应该能够成功启动。
另请参阅
配置 ZooKeeper
ZooKeeper提供高度可靠的集中式服务,用于维护配置信息、命名以及提供分布式同步和组服务。 在本食谱中,我们将概述安装 ZooKeeper 的步骤。
做好准备
确保 Hadoop 已正确配置。 请参考本章前面有关在集群上安装 Hadoop 的食谱。
使用以下命令以hduser身份从 Hadoop 管理员计算机登录到主节点:
ssh hduser@master
使用以下命令下载 ZooKeeper 存档文件:
wget http://www.gtlib.gatech.edu/pub/apache/zookeeper/stable/zookeeper-3.4.5.tar.gz -P ~/repo
怎么做……
使用以下步骤配置 ZooKeeper:
-
使用以下命令登录主节点:
ssh hduser@master -
使用以下命令将下载的归档文件复制到
/usr/local:sudo wget ftp://hadoop.admin/repo/zookeeper-3.4.5.tar.gz -P /usr/local -
使用以下命令解压缩文件:
cd /usr/local/ sudo tar xvf zookeeper-3.4.5.tar.gz -
使用以下命令创建符号链接:
sudo ln -s /usr/local/zookeeper-3.4.5 /usr/local/zookeeper -
打开
~/.bashrc文件并添加以下行:ZK_HOME=/usr/local/zookeeper export PATH=$ZK_HOME/bin:$PATH -
使用以下命令加载配置文件:
. ~/.bashrc -
使用以下命令为 ZooKeeper 创建数据和日志目录:
sudo mkdir -pv /hadoop/zookeeper/{data,log} -
Create Java configuration file
$ZK_HOME/conf/java.envwith the following content:JAVA_HOME=/usr/java/latest export PATH=$JAVA_HOME/bin:$PATH提示
文件名
java.env是必需的。 它将由动物园管理员装载。 -
Create the
$ZK_HOME/conf/zookeeper.cfgfile and add the following lines to it:tickTime=2000 clientPort=2181 initLimit=5 syncLimit=2 server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888 server.4=slave3:2888:3888 server.5=slave4:2888:3888 server.6=slave5:2888:3888 dataDir=/hadoop/zookeeper/data dataLogDir=/hadoop/zookeeper/log提示
高亮显示的部分使每个节点都知道 ZooKeeper 集合中的其他节点。
-
使用以下命令在所有从节点上配置 ZooKeeper:
```sh
for host in cat $HADOOP_HOME/conf/slaves; do
echo 'Configuring ZooKeeper on ' $host
scp ~/.bashrc hduser@$host:~/
sudo scp -r /usr/local/zookeeper-3.4.5 hduser@$host:/usr/local/
echo 'Making symbolic link for ZooKeeper home directory on ' $host
sudo ssh hduser@$host -C "ln -s /usr/local/zookeeper-3.4.5 /usr/local/zookeeper"
done
```
- 使用以下命令在主节点上启动 ZooKeeper:
```sh
zkServer.sh start
```
- 使用以下命令验证 ZooKeeper 配置:
```sh
zkCli.sh -server master:2181
```
- 使用以下命令停止 ZooKeeper:
```sh
zkServer.sh stop
```
另请参阅
- 第 3 章,配置 Hadoop 集群中的安装 HBase配方
- 从http://zookeeper.apache.org/doc/r3.4.5/zookeeperAdmin.html获取有关 ZooKeeper 的更多文档
安装 HBase
HBase是基于 Hadoop 的数据库。 它是一个分布式、可扩展的大数据存储系统。 在本节中,我们将列出在 Hadoop 集群中安装 HBase 的步骤。
做好准备
要安装 HBase,我们假设 Hadoop 已经配置好,没有任何问题。
从镜像站点下载 HBase。 与下载 Hadoop 类似,HBase 托管在世界各地的镜像上。 访问链接http://www.apache.org/dyn/closer.cgi/hbase/,并选择最近的镜像(建议位于顶部的镜像是最佳选择)。 选择镜像后,点击链接选择 HBase 版本;我们建议使用稳定版本。 例如,单击链接http://mirror.quintex.com/apache/hbase/stable/,您可以看到可下载的文件,如以下屏幕截图所示:

单击文件链接hbase-0.94.5.tar.gz将文件下载到管理员计算机。 然后,使用以下命令将文件复制到 FTP 存储库:
cp hbase-0.94.5.tar.gz ~/repo
或者,我们可以使用以下命令下载该文件:
wget http://mirror.quintex.com/apache/hbase/stable/hbase-0.94.5.tar.gz -P ~/repo
怎么做……
使用以下配方安装 HBase:
-
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master -
使用以下命令解压缩 HBase 存档:
cd /usr/local sudo wget ftp://hadoop.admin/repo/hbase-0.94.5.tar.gz -P /usr/local sudo tar xvf hbase-0.94.5.tar.gz -
使用以下命令创建符号链接:
ln -s hbase-0.94.5 hbase -
使用您喜欢的文本编辑器打开
~/.bashrc文件,并将以下行附加到文件中:export HBASE_HOME=/usr/local/hbase export PATH=$HBASE_HOME/bin:$PATH -
打开
$HBASE_HOME/conf/hbase-env.sh文件,将JAVA_HOME设置为:export JAVA_HOME=/usr/java/latest -
使用您喜欢的文本编辑器打开
$HBASE_HOME/conf/hbase-site.xml文件,并向该文件添加以下内容:<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>hbase.rootdir</name> <value>hdfs://master:54310/hbase</value> </property> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.tmp.dir</name> <value>/hadoop/hbase</value> </property> <property> <name>hbase.ZooKeeper.quorum</name> <value>master</value> </property> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/hadoop/zookeeper</value> </property> </configuration> -
打开
$HBASE_HOME/conf/regionservers文件并添加以下行:slave1 slave2 slave3 slave4 slave5 -
使用以下命令将 HDFS 配置文件链接到 HBase 配置目录:
sudo ln -s $HADOOP_HOME/conf/hdfs-site.xml $HBASE_HOME/conf/hdfs-site.xml -
使用以下命令替换 HBase 的从属
.jar文件:rm -i $HBASE_HOME/lib/hadoop-core*.jar $HBASE_HOME/lib/zookeeper-*.jar cp -i $HADOOP_HOME/hadoop-core*.jar $HADOOP_HOME/lib/commons-*.jar $ZK_HOME/zookeeper-*.jar $HBASE_HOME/lib/ -
使用以下命令配置所有从节点:
```sh
for host in 'cat $HBASE_HOME/conf/regionservers'; do
echo 'Configuring HBase on ' $host
scp ~/.bashrc hduser@$host:~/
sudo scp -r /usr/local/hbase-0.94.5 hduser@$host:/usr/local/
echo 'Making symbolic link for HBase home directory on ' $host
sudo ssh hduser@$host -C "ln -s /usr/local/hbase-0.94.5 /usr/local/hbase"
echo 'Making symbolic link for hdfs-site.xml to the HBase configuration directory on ' $host
sudo ssh hduser@$host -C "ln -s /usr/local/hadoop-1.1.2/conf/hdfs-site.xml /usr/local/hbase-0.94.5/conf/hdfs-site.xml"
done
```
- 使用以下命令启动 HBase 守护程序:
```sh
start-hbase.sh
```
- 使用以下命令连接到正在运行的 HBase:
```sh
hbase shell
```
- 使用以下 HBase shell 命令验证 HBase 安装:
```sh
hbase(main):001:0> create 'test', 'c'
0 row(s) in 0.2410 seconds
hbase(main):001:0> put 'test', 'r1', 'c:a', 'v1'
0 row(s) in 0.0320 seconds
hbase(main):003:0> scan 'test'
ROW COLUMN+CELL row1 column=c:a, timestamp=124455459102, value=v1 r1
1 row(s) in 0.2130 seconds
hbase(main):006:0> disable 'test'
0 row(s) in 9.4210 seconds
hbase(main):007:0> drop 'test'
0 row(s) in 8.3412 seconds
hbase(main):010:0> exit
```
- To stop HBase, use the following command:
```sh
stop-hbase.sh
```
将会发出以下信息:
```sh
stopping hbase...............
```
它是如何工作的.
在配置中,hbase.rootdir属性指定 HBase 数据存储的根目录,hbase.zookeeper.property.dataDir属性指定 ZooKeeper 数据存储的根目录。
另请参阅
- 第 3 章,配置 Hadoop 集群中的安装 ZooKeeper配方
- 有关 HBase 的更多文档,请访问:http://wiki.apache.org/hadoop/Hbase
安装 Hive
作为一种顶级抽象语言,Hieve提供了一个方便的工具,用于使用类似 SQL 的语言操作 HDFS 上的数据存储。 在本节中,我们将讨论如何在 Hadoop 集群上安装配置单元。
做好准备
在安装配置单元之前,我们需要确保 Hadoop 已正确安装。 有关 Hadoop 集群的配置,请参阅前面几节。
在管理员计算机上使用类似于以下命令的命令从镜像站点下载配置单元:
wget http://apache.osuosl.org/hive/stable/hive-0.9.0.tar.gz -P ~/repo
怎么做……
使用以下步骤安装配置单元:
-
使用以下命令以
hduser身份从 Hadoop 管理员计算机登录到主节点:ssh hduser@master -
使用以下命令将档案复制到
/usr/local:sudo wget ftp://hadoop.admin/repo/hive-0.9.0.tar.gz /usr/local -
使用以下命令解压缩配置单元存档:
cd /usr/local tar xvf hive-0.9.0.tar.gz -
使用以下命令创建符号链接:
ln -s /usr/local/hive-0.9.0 /usr/local/hive -
使用您喜欢的文本编辑器打开
~/.bashrc文件,并向该文件添加以下行:export HIVE_HOME=/usr/local/hive export PATH=$HIVE_HOME/bin:$PATH -
使用以下命令启动配置单元:
hive
另请参阅
- 第 3 章,配置 Hadoop 集群中的安装 Pig配方
- 从https://cwiki.apache.org/confluence/display/Hive/Home获取有关配置单元的更多文档
安装清管器
与配置单元类似,Pig为操作 Hadoop 数据提供了一个方便的工具。 在本食谱中,我们将讨论 Apache Pig 的安装。
做好准备
在安装 Pig 之前,我们需要确保 Hadoop 已正确安装。 有关 Hadoop 集群的配置,请参阅前面几节。
在管理员计算机上使用以下命令从镜像站点下载 Pig 存档文件:
wget http://www.motorlogy.com/apache/pig/stable/pig-0.10.1.tar.gz ~/repo
怎么做……
使用以下步骤配置 PIG:
-
使用以下命令以
hduser身份从 Hadoop 管理员计算机登录到主节点:ssh hduser@master -
使用以下命令将档案复制到
/usr/local:sudo wget ftp://hadoop.admin/repo/pig-0.10.1.tar.gz /usr/local -
使用以下命令解压缩 Pig 存档文件:
cd /usr/local sudo tar xvf pig-0.10.1.tar.gz -
使用以下命令创建指向 Pig 目录的符号链接:
sudo ln -s /usr/local/pig-0.10.1 /usr/local/pig -
使用您喜欢的文本编辑器打开
~/.bashrc文件,并将以下行添加到文件中:export PIG_HOME=/usr/local/pig export PATH=$PIG_HOME/bin:$PATH -
使用以下命令在本地模式下运行 Pig:
pig -x local -
使用以下命令在 MapReduce 模式下运行 Pig:
pig -
或者,我们可以使用以下命令:
pig -x mapreduce
备注
在 MapReduce 模式下运行的 PIG 将利用 Hadoop 提供的分布式计算能力。
另请参阅
- 第 3 章,配置 Hadoop 集群中的安装配置单元配方
- 有关 PIG 的更多文档,请访问:http://pig.apache.org/docs/r0.10.0/
安装 Mahout
ApacheMahout是一个机器学习库,可以在大数据上扩展机器学习算法。 它在 Hadoop 大数据堆栈之上实施。 它已经实现了广泛的机器学习算法。 在本食谱中,我们将概述配置 Apache Mahout 的步骤。
做好准备
在安装 Mahout 之前,我们需要确保 Hadoop 已正确安装。
在主节点上使用以下命令从镜像站点下载 Mahout:
wget http://www.eng.lsu.edu/mirrors/apache/mahout/0.7/mahout-distribution-0.7.tar.gz -P ~/repo
怎么做……
使用下面的配方安装 Mahout:
-
使用以下命令以
hduser身份从 Hadoop 管理员计算机登录到主节点:ssh hduser@master -
使用以下命令将档案复制到
/usr/local:sudo wget ftp://hadoop.admin/repo/mahout-distribution-0.7.tar.gz /usr/local -
使用以下命令解压缩 Mahout 存档:
cd /usr/local sudo tar xvf mahout-distribution-0.7.tar.gz -
使用以下命令创建指向 Mahout 目录的符号链接:
sudo ln -s /usr/local/mahout-distribution-0.7 /usr/local/mahout -
使用您喜欢的文本编辑器打开
~/.bashrc文件,并向该文件添加以下行:export MAHOUT_HOME=/usr/local/pig export PATH=$MAHOUT_HOME/bin:$PATH -
使用以下命令加载配置:
. ~/.bashrc -
使用以下命令安装Maven:
sudo yum install maven -
Compile and install Mahout core with the following commands:
cd $MAHOUT_HOME sudo mvn compile sudo mvn install提示
默认情况下,
install命令将运行所有测试;我们可以忽略这些测试,以使用命令sudo``mvn -DskipTests install加快安装过程。 -
使用以下命令编译 Mahout 示例:
cd examples sudo mvn compile
使用以下步骤验证 Mahout 配置:
-
使用以下命令下载示例数据:
wget http://archive.ics.uci.edu/ml/databases/synthetic_control/synthetic_control.data -P ~/ -
使用以下命令启动 Hadoop 集群:
start-dfs.sh start-mapred.sh -
使用以下命令将下载的数据放入 HDFS:
hadoop fs -mkdir testdata hadoop fs -put ~/synthetic_control.data testdata -
使用以下命令运行
kmeans集群:mahout org.apache.mahout.clustering.syntheticcontrol.kmeans.Job
另请参阅
- 有关 Mahout 的更多文档可以从https://cwiki.apache.org/confluence/display/MAHOUT/Mahout+Wiki获得。
四、管理 Hadoop 集群
在本章中,我们将介绍:
- 管理 HDFS 集群
- 配置 Second DaryNameNode
- 管理 MapReduce 集群
- 管理 TaskTracker
- 停用数据节点
- 更换从节点
- 管理 MapReduce 作业
- 从 Web 用户界面检查作业历史记录
- 将数据导入 HDFS
- 在 HDFS 上操作文件
- 配置 HDFS 配额
- 配置 CapacityScheduler
- 配置公平调度程序
- 配置 Hadoop 守护程序日志记录
- 配置 Hadoop 审核日志记录
- 升级 Hadoop
简介
从功能的角度来看,Hadoop 集群由HDFS集群和MapReduce集群组成。 HDFS 集群由 Hadoop 的默认文件系统组成。 它有一个或多个NameNodes来跟踪文件系统元数据,而实际数据块存储在由DataNode管理的分布式从节点上。 同样,MapReduce集群在主节点上有一个JobTracker守护进程,在从节点上有多个TaskTracker。 JobTracker 管理 MapReduce 作业的生命周期。 它将作业拆分成较小的任务,并安排任务由 TaskTracker 运行。 TaskTracker 通过分叉一个或多个 JVM 进程并行执行 JobTracker 分配的任务。 作为 Hadoop 集群管理员,您将负责管理 HDFS 集群和 MapReduce 集群。
通常,系统管理员应该维护集群的运行状况和可用性。 更具体地说,对于 HDFS 集群,这意味着管理 NameNode 和 DataNode,以及管理用于 MapReduce 的 JobTracker 和 TaskTracker。 其他管理任务包括管理 Hadoop 作业,例如使用调度器配置作业调度策略。
在本章结束时,我们将介绍配置 Hadoop 日志记录和进行系统升级的主题。 日志记录为诊断集群故障或性能问题提供了洞察力,而系统升级在保持软件最新方面起着重要作用。
管理 HDFS 集群
HDFS 的运行状况对于基于 Hadoop 的大数据平台至关重要。 HDFS 问题可能会对集群的效率产生负面影响。 更糟糕的是,它可能会使集群无法正常运行。 例如,网络分段导致的 DataNode 不可用可能会导致一些复制不足的数据块。 当这种情况发生时,HDFS 会自动复制这些数据块,这会给集群带来大量开销,并导致集群太不稳定而无法使用。 在本菜谱中,我们将展示管理 HDFS 集群的命令。
做好准备
在开始之前,我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤检查具有hadoop fsck的 HDFS 集群的状态:
-
Check the status of the root filesystem with the following command:
hadoop fsck /我们将得到类似于以下内容的输出:
FSCK started by hduser from /10.147.166.55 for path / at Thu Feb 28 17:14:11 EST 2013 .. /user/hduser/.staging/job_201302281211_0002/job.jar: Under replicated blk_-665238265064328579_1016\. Target Replicas is 10 but found 5 replica(s). .................................Status: HEALTHY Total size: 14420321969 B Total dirs: 22 Total files: 35 Total blocks (validated): 241 (avg. block size 59835360 B) Minimally replicated blocks: 241 (100.0 %) Over-replicated blocks: 0 (0.0 %) Under-replicated blocks: 2 (0.8298755 %) Mis-replicated blocks: 0 (0.0 %) Default replication factor: 2 Average block replication: 2.0248964 Corrupt blocks: 0 Missing replicas: 10 (2.0491803 %) Number of data-nodes: 5 Number of racks: 1 FSCK ended at Thu Feb 28 17:14:11 EST 2013 in 28 milliseconds The filesystem under path '/' is HEALTHY输出显示某些百分比的数据块未充分复制。 但是因为 HDFS 可以自动复制这些数据块,所以 HDFS 文件系统和
'/'目录都是HEALTHY。 -
Check the status of all the files on HDFS with the following command:
hadoop fsck / -files我们将得到类似于以下内容的输出:
FSCK started by hduser from /10.147.166.55 for path / at Thu Feb 28 17:40:35 EST 2013 / <dir> /home <dir> /home/hduser <dir> /home/hduser/hadoop <dir> /home/hduser/hadoop/tmp <dir> /home/hduser/hadoop/tmp/mapred <dir> /home/hduser/hadoop/tmp/mapred/system <dir> /home/hduser/hadoop/tmp/mapred/system/jobtracker.info 4 bytes, 1 block(s): OK /user <dir> /user/hduser <dir> /user/hduser/randtext <dir> /user/hduser/randtext/_SUCCESS 0 bytes, 0 block(s): OK /user/hduser/randtext/_logs <dir> /user/hduser/randtext/_logs/history <dir> /user/hduser/randtext/_logs/history/job_201302281451_0002_1362090421087_hduser_random-text-writer 23995 bytes, 1 block(s): OK /user/hduser/randtext/_logs/history/job_201302281451_0002_conf.xml 22878 bytes, 1 block(s): OK /user/hduser/randtext/part-00001 1102231864 bytes, 17 block(s): OK Status: HEALTHY Hadoop will scan and list all the files in the cluster.此命令扫描 HDFS 上的所有文件,并打印大小和状态。
-
Check the locations of file blocks with the following command:
hadoop fsck / -files -locations此命令的输出将包含以下信息:
![How to do it...]()
第一行告诉我们,文件
part-00000总共有17个块,每个块有2个复制(复制因子已设置为2)。 下面几行列出了每个块在 DataNode 上的位置。 例如,数据块blk_6733127705602961004_1127已在主机10.145.231.46和10.145.223.184上复制。 数字50010是数据节点的端口号。 -
使用以下命令检查包含机架信息的文件块的位置:
hadoop fsck / -files -blocks -racks -
使用以下命令删除损坏的文件:
hadoop fsck -delete -
使用以下命令将损坏的文件移动到
/lost+found:hadoop fsck -move
使用以下步骤检查具有hadoop dfsadmin的 HDFS 集群的状态:
-
Report the status of each slave node with the following command:
hadoop dfsadmin -report输出将类似于以下内容:
Configured Capacity: 422797230080 (393.76 GB) Present Capacity: 399233617920 (371.82 GB) DFS Remaining: 388122796032 (361.47 GB) DFS Used: 11110821888 (10.35 GB) DFS Used%: 2.78% Under replicated blocks: 0 Blocks with corrupt replicas: 0 Missing blocks: 0 ------------------------------------------------- Datanodes available: 5 (5 total, 0 dead) Name: 10.145.223.184:50010 Decommission Status : Normal Configured Capacity: 84559446016 (78.75 GB) DFS Used: 2328719360 (2.17 GB) Non DFS Used: 4728565760 (4.4 GB) DFS Remaining: 77502160896(72.18 GB) DFS Used%: 2.75% DFS Remaining%: 91.65% Last contact: Thu Feb 28 20:30:11 EST 2013 ...输出的第一部分显示 HDFS 集群的摘要,包括配置的容量、当前容量、剩余容量、已用空间、复制不足的数据块数、副本损坏的数据块数以及丢失的块数。
输出信息的以下部分显示了每个 HDFS 从节点的状态,包括 DataNode 计算机的名称(IP:port)、委托状态、配置的容量、HDFS 和非 HDFS 使用的空间量、HDFS 剩余空间以及从节点与主节点联系的时间。
-
使用以下命令刷新所有数据节点:
hadoop dfsadmin -refreshNodes -
Check the status of the safe mode using the following command:
hadoop dfsadmin -safemode get我们将能够获得以下输出:
Safe mode is OFF输出告诉我们 NameNode 未处于安全模式。 在这种情况下,文件系统既是可读的,也是可写的。 如果 NameNode 处于安全模式,则文件系统将为只读(写保护)。
-
Manually put the NameNode into safe mode using the following command:
hadoop dfsadmin -safemode enter此命令对系统维护非常有用。
-
Make the NameNode to leave safe mode using the following command:
hadoop dfsadmin -safemode leave如果 NameNode 已长期处于安全模式或已手动置于安全模式,则需要使用此命令让 NameNode 退出此模式。
-
Wait until NameNode leaves safe mode using the following command:
hadoop dfsadmin -safemode wait当我们想要等待 HDFS 完成数据块复制或等待新委托的 DataNode 准备好提供服务时,此命令非常有用。
-
Save the metadata of the HDFS filesystem with the following command:
hadoop dfsadmin -metasave meta.log将在目录
$HADOOP_HOME/logs下创建meta.log文件。 其内容将类似于以下内容:21 files and directories, 88 blocks = 109 total Live Datanodes: 5 Dead Datanodes: 0 Metasave: Blocks waiting for replication: 0 Metasave: Blocks being replicated: 0 Metasave: Blocks 0 waiting deletion from 0 datanodes. Metasave: Number of datanodes: 5 10.145.223.184:50010 IN 84559446016(78.75 GB) 2328719360(2.17 GB) 2.75% 77502132224(72.18 GB) Thu Feb 28 21:43:52 EST 2013 10.152.166.137:50010 IN 84559446016(78.75 GB) 2357415936(2.2 GB) 2.79% 77492854784(72.17 GB) Thu Feb 28 21:43:52 EST 2013 10.145.231.46:50010 IN 84559446016(78.75 GB) 2048004096(1.91 GB) 2.42% 77802893312(72.46 GB) Thu Feb 28 21:43:54 EST 2013 10.152.161.43:50010 IN 84559446016(78.75 GB) 2250854400(2.1 GB) 2.66% 77600096256(72.27 GB) Thu Feb 28 21:43:52 EST 2013 10.152.175.122:50010 IN 84559446016(78.75 GB) 2125828096(1.98 GB) 2.51% 77724323840(72.39 GB) Thu Feb 28 21:43:53 EST 2013 21 files and directories, 88 blocks = 109 total ...
它是如何工作的.
当 NameNode 进入安全模式时,HDFS 文件系统将受到写保护。 当 HDFS 集群启动时,它将首先进入安全模式。 NameNode 将检查每个数据块的复制因子。 如果数据块的副本计数小于配置的值(默认为3),则该数据块将被标记为复制不足。 最后,将计算复制不足因子,即复制不足的数据块的百分比。 如果百分比数字大于阈值,NameNode 将保持安全模式,直到为复制不足的数据块创建足够的新副本,从而使复制不足因子低于阈值。
我们可以使用以下命令获取fsck命令的用法:
hadoop fsck
使用信息将类似于以下内容:
Usage: DFSck <path> [-move | -delete | -openforwrite] [-files [-blocks [-locations | -racks]]]
<path> start checking from this path
-move move corrupted files to /lost+found
-delete delete corrupted files
-files print out files being checked
-openforwrite print out files opened for write
-blocks print out block report
-locations print out locations for every block
-racks print out network topology for data-node locations
By default fsck ignores files opened for write, use -openforwrite to report such files. They are usually tagged CORRUPT or HEALTHY depending on their block allocation status.
我们可以使用以下命令获取dfsadmin命令的用法:
hadoop dfsadmin
输出将类似于以下内容:
Usage: java DFSAdmin
[-report]
[-safemode enter | leave | get | wait]
[-saveNamespace]
[-refreshNodes]
[-finalizeUpgrade]
[-upgradeProgress status | details | force]
[-metasave filename]
[-refreshServiceAcl]
[-refreshUserToGroupsMappings]
[-refreshSuperUserGroupsConfiguration]
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
[-setSpaceQuota <quota> <dirname>...<dirname>]
[-clrSpaceQuota <dirname>...<dirname>]
[-setBalancerBandwidth <bandwidth in bytes per second>]
[-help [cmd]]
还有更多的…
除了使用命令行之外,我们还可以使用 Web 用户界面来检查 HDFS 集群的状态。 例如,我们可以通过打开链接http://master:50070/dfshealth.jsp来获取 HDFS 的状态信息。
我们将看到一个网页,其中显示 HDFS 集群的摘要,例如配置的容量和剩余空间。 例如,该网页将类似于以下屏幕截图:

通过单击Live Nodes链接,我们可以检查每个 DataNode 的状态。 我们将看到一个类似于以下屏幕截图的网页:

通过单击每个节点的链接,我们可以浏览 HDFS 文件系统的目录。 该网页将类似于以下屏幕截图:

该网页显示文件/user/hduser/randtext已被分成五个分区。 我们可以通过单击part-0000x链接来浏览每个分区的内容。
另请参阅
- 第 3 章,配置 Hadoop 集群中的验证 Hadoop 安装配方
- 取消数据节点配方
- 在 HDFS上操作文件的秘诀
配置 Second daryNameNode
Hadoop NameNode 是单点故障。 通过配置Second NameNode,可以定期备份文件系统映像和编辑日志文件。 在 NameNode 出现故障的情况下,可以使用备份文件来恢复 NameNode。 在本食谱中,我们将概述配置Second DaryNameNode的步骤。
做好准备
我们假设 Hadoop 已正确配置。
使用以下命令从集群管理计算机登录到主节点:
ssh hduser@master
怎么做……
执行以下步骤配置 Second daryNameNode:
-
使用以下命令停止集群:
stop-all.sh -
Add or change the following into the file
$HADOOP_HOME/conf/hdfs-site.xml:<property> <name>fs.checkpoint.dir</name> <value>/hadoop/dfs/namesecondary</value> </property>如果未显式设置此属性,则默认检查点目录将为
${hadoop.tmp.dir}/dfs/namesecondary。 -
Start the cluster using the following command:
start-all.shNameNode 数据目录的树结构如下所示:
${dfs.name.dir}/ ├── current │ ├── edits │ ├── fsimage │ ├── fstime │ └── VERSION ├── image │ └── fsimage ├── in_use.lock └── previous.checkpoint ├── edits ├── fsimage ├── fstime └── VERSION并且 Second daryNameNode 数据目录的树结构如下所示:
${fs.checkpoint.dir}/ ├── current │ ├── edits │ ├── fsimage │ ├── fstime │ └── VERSION ├── image │ └── fsimage └── in_use.lock
还有更多...
为了增加冗余,我们可以将 NameNode 配置为在多个位置写入文件系统元数据。 例如,我们可以通过更改文件$HADOOP_HOME/conf/hdfs-site.xml中的以下属性来添加用于备份的 NFS 共享目录:
<property>
<name>dfs.name.dir</name>
<value>/hadoop/dfs/name,/nfs/name</value>
</property>
备注
/nfs/name是远程计算机上的 NFS 共享目录。
另请参阅
- 管理 HDFS 集群配方
- 取消数据节点配方
管理 MapReduce 集群
典型的 MapReduce 集群由一个运行 JobTracker 的主节点和多个运行 TaskTracker 的从节点组成。 管理 MapReduce 集群的任务包括维护运行状况以及 TaskTracker 和 JobTracker 之间的成员关系。 在本食谱中,我们将概述管理 MapReduce 集群的命令。
做好准备
我们假设 Hadoop 集群已经正确配置并运行。
使用以下命令从集群管理计算机登录到主节点:
ssh hduser@master
怎么做……
要管理 MapReduce 集群,请执行以下步骤:
-
List all the active TaskTrackers using the following command:
hadoop -job -list-active-trackers备注
此命令可以帮助我们检查集群中 TaskTracker 的注册状态。
-
Check the status of the JobTracker safe mode using the following command:
hadoop mradmin -safemode get我们将获得以下输出:
Safe mode is OFF输出告诉我们 JobTracker 未处于安全模式。 我们可以向集群提交作业。 如果 JobTracker 处于安全模式,则不能向集群提交任何作业。
-
Manually let the JobTracker enter safe mode using the following command:
hadoop mradmin -safemode enter当我们想要维护集群时,此命令非常方便。
-
Let the JobTracker leave safe mode using the following command:
hadoop mradmin -safemode leave维护任务完成后,您需要运行此命令。
-
如果我们想要等待退出安全模式,可以使用以下命令:
hadoop mradmin -safemode wait -
使用以下命令重新加载 MapReduce 队列配置:
hadoop mradmin -refreshQueues -
使用以下命令重新加载活动的 TaskTracker:
hadoop mradmin -refreshNodes
它是如何工作的.
使用以下命令获取mradmin命令的用法:
hadoop mradmin
使用信息将类似于以下内容:
Usage: java MRAdmin
[-refreshServiceAcl]
[-refreshQueues]
[-refreshUserToGroupsMappings]
[-refreshSuperUserGroupsConfiguration]
[-refreshNodes]
[-safemode <enter | leave | get | wait>]
[-help [cmd]]
...
下表列出了命令选项的含义:
|选择 / 选择权 / 购买权 / 期权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| -refreshServiceAcl | 强制 JobTracker 重新加载服务 ACL。 |
| -refreshQueues | 强制 JobTracker 重新加载队列配置。 |
| -refreshUserToGroupsMappings | 强制 JobTracker 重新加载用户组映射。 |
| -refreshSuperUserGroupsConfiguration | 强制 JobTracker 重新加载超级用户组映射。 |
| -refreshNodes | 强制 JobTracker 刷新 JobTracker 主机。 |
| -help [cmd] | 显示一个命令或所有命令的帮助信息。 |
另请参阅
- 配置 Second DaryNameNode配方
- 管理 MapReduce 作业配方
管理 TaskTracker
TaskTracker 是在从节点上运行的 MapReduce 守护进程。 它们接受由主节点上的 JobTracker 分配的任务,并分叉 JVM 进程/线程来运行这些任务。 TaskTracker 还负责使用心跳报告任务的进度及其健康状态。
Hadoop 为 TaskTracker 维护三个列表:黑名单、灰名单、和排除列表。 TaskTracker 黑名单功能可以在 TaskTracker 处于不稳定状态或性能降级时将其列入黑名单。 例如,当特定作业的失败任务比率达到一定阈值时,该作业的 TaskTracker 将被列入黑名单。 类似地,Hadoop 通过识别潜在的问题节点来维护节点的灰色列表。
有时,需要将个 TaskTracker 排除在集群中。 例如,当我们调试或升级从节点时,我们希望将此节点与集群分开,以防它影响集群。 Hadoop 支持将 TaskTracker 从正在运行的集群中实时停用。
做好准备
我们假设 Hadoop 已正确配置。 MapReduce 和 HDFS 守护程序正在运行,没有任何问题。
使用以下命令从管理员计算机登录到集群主节点:
ssh hduser@master
在主节点上使用以下命令列出活动的跟踪器:
hadoop job -list-active-trackers
并且输出应类似于以下内容:
tracker_slave5:localhost/127.0.0.1:55590
tracker_slave1:localhost/127.0.0.1:47241
tracker_slave3:localhost/127.0.0.1:51187
tracker_slave4:localhost/127.0.0.1:60756
tracker_slave2:localhost/127.0.0.1:42939
怎么做……
执行以下步骤以配置心跳间隔:
-
使用以下命令停止 MapReduce 集群:
stop-dfs.sh -
Open the file
$HADOOP_HOME/conf/mapred-site.xmlwith your favorite text editor and add the following content into the file:<property> <name>mapred.tasktracker.expiry.interval</name> <value>600000</value> </property>该值以毫秒为单位。
-
使用以下命令将配置复制到从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml to slave node ' $host sudo scp $HADOOP_HOME/conf/mapred-site.xml hduser@$host:$HADOOP_HOME/conf done -
使用以下命令启动 MapReduce 集群:
start-mapred.sh
执行以下步骤以配置 TaskTracker 黑名单:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
通过在文件
$HADOOP_HOME/conf/hdfs-site.xml中添加或更改以下属性来设置作业将 TaskTracker 列入黑名单的任务失败次数:<property> <name>mapred.max.tracker.failures</name> <value>10</value> </property> -
通过在文件
$HADOOP_HOME/conf/hdfs-site.xml中添加或更改以下属性来设置可以将 TaskTracker 列入黑名单的最大成功作业数:<property> <name>mapred.max.tracker.blacklists</name> <value>5</value> </property> -
使用以下命令将配置文件复制到从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying hdfs-site.xml to slave node ' $host sudo scp $HADOOP_HOME/conf/hdfs-site.xml hduser@$host:$HADOOP_HOME/conf done -
使用以下命令启动 MapReduce 集群:
start-mapred.sh -
使用以下命令将 TaskTracker 列入黑名单:
hadoop job -list-blacklisted-trackers
执行以下步骤以停用 TaskTracker:
-
Set the TaskTracker exclude file by adding the following properties into the file:
<property> <name>mapred.hosts.exclude</name> <value>$HADOOP_HOME/conf/mapred-exclude.txt</value> </property>备注
$HADOOP_HOME/conf/mapred-exclude.txt文件将包含排除 TaskTracker 主机名,每行一个。 例如,如果要从集群中排除slave1和slave3,则该文件应包含以下两行:slave1 slave3 -
使用以下命令强制 JobTracker 重新加载 TaskTracker 列表:
hadoop mradmin -refreshNodes -
List all the active trackers again using the following command:
hadoop job -list-active-trackers我们将获得以下输出:
tracker_slave5:localhost/127.0.0.1:55590 tracker_slave4:localhost/127.0.0.1:60756 tracker_slave2:localhost/127.0.0.1:42939
它是如何工作的.
从节点上的 TaskTracker 定期联系主节点上的 JobTracker。 两次连续接触通信之间的间隔称为心跳。 更频繁的心跳配置可能会给集群带来更高的负载。 心跳属性的值应该根据集群的大小进行设置。
JobTracker 使用 TaskTracker 黑名单删除那些不稳定的 TaskTracker。 如果某个 TaskTracker 被列入黑名单,则该 TaskTracker 上当前运行的所有任务仍可完成,并且 TaskTracker 将通过心跳机制继续与 JobTracker 建立连接。 但 TaskTracker 不会被安排运行未来的任务。 如果被列入黑名单的 TaskTracker 重新启动,它将从黑名单中删除。
备注
列入黑名单的 TaskTracker 总数不应超过 TaskTracker 总数的 50%。
另请参阅
- 管理 MapReduce 集群的配方
- 管理 MapReduce 作业配方
- 取消数据节点配方
- 替换从节点配方
停用数据节点
与 TaskTracker 类似,有时需要从集群中临时禁用某个 DataNode,例如,因为该 DataNode 的存储空间已用完。 在本食谱中,我们将概述从活动 Hadoop 集群中停用 DataNode 的步骤。
做好准备
我们假设已经正确配置了 Hadoop。
使用以下命令从集群管理员计算机登录到主节点:
ssh hduser@master
提示
为了说明起见,我们假设将主机slave1上的 DataNode 从正在运行的 Hadoop 集群中停用。
怎么做……
要停用活动的 DataNode,请执行以下步骤:
-
Create the file
$HADOOP_HOME/conf/dfs-exclude.txtwith the following content:slave1备注
dfs-exclude.txt文件包含要从集群中停用的 DataNode 主机名,每行一个。 -
将以下属性添加到文件
$HADOOP_HOME/conf/hdfs-site.xml:<property> <name>dfs.hosts.exclude</name> <value>$HADOOP_HOME/conf/dfs-exclude.txt</value> </property> -
使用以下命令强制 NameNode 重新加载活动数据节点:
hadoop dfsadmin -refreshNodes -
获取每个活动数据节点的描述报告:
hadoop dfsadmin -report
它是如何工作的.
集群管理员可以使用dfsadmin命令来管理 DataNode。 我们可以使用以下命令获取此命令的用法:
hadoop dfsadmin
使用信息将类似于以下内容:
Usage: java DFSAdmin
[-report]
[-safemode enter | leave | get | wait]
[-saveNamespace]
[-refreshNodes]
[-finalizeUpgrade]
[-upgradeProgress status | details | force]
...
另请参阅
- 管理 HDFS 集群配方
- 配置 Second DaryNameNode配方
- 管理 TaskTracker配方
- 替换从节点配方
更换从节点
有时,我们需要用新硬件替换从节点。 例如,从节点不稳定,需要更多存储空间或更强大的 CPU,等等。 在本配方中,我们将概述替换从节点的步骤。
做好准备
我们假设更换的硬件已准备就绪,可以使用。 为了说明起见,我们假设本书中需要替换slave2。
怎么做……
执行以下步骤以更换从节点:
-
按照本章管理 TaskTracker配方中概述的步骤停用从节点上的 TaskTracker。
-
按照本章停用数据节点配方中概述的步骤停用从节点上的数据节点。
-
关闭从节点的电源,并将其更换为新硬件。
-
按照安装 Linux 操作系统、安装 Java 和其他工具以及配置第 2 章、准备 Hadoop 安装的配置 SSH 配方中概述的步骤在新节点上安装和配置 Linux 操作系统。
-
通过使用以下命令从主节点复制 Hadoop 目录和配置,在新节点上安装 Hadoop:
sudo scp -r /usr/local/hadoop-1.1.2 hduser@slave2:/usr/local/ sudo ssh hduser@slave2 -C "ln -s /usr/local/hadoop-1.1.2 /usr/local/hadoop" sudo scp ~/.bashrc hduser@slave2:~/ -
登录到
slave2并使用以下命令启动 DataNode 和 TaskTracker:ssh hduser@slave2 -C "hadoop DataNode &" ssh hduser@slave2 -C "Hadoop TaskTracker &" -
使用以下命令刷新数据节点:
hadoop dfsadmin -refreshNodes -
使用以下命令刷新 TaskTracker:
hadoop mradmin -refreshNodes -
使用以下命令报告实时数据节点的状态:
hadoop dfsadmin -report -
使用以下命令获取所有活动的 TaskTracker:
```sh
hadoop job -list-active-trackers
```
另请参阅
- 第 2 章,准备 Hadoop 安装的安装 Linux 操作系统配方
- 第 2 章、准备 Hadoop 安装的安装 Java 和其他工具配方
- 第 2 章、的配置 SSH配方准备 Hadoop 安装
- 第 3 章、配置 Hadoop 集群的在完全分布式模式下配置 Hadoop配方
- 管理 TaskTracker配方
- 取消数据节点配方
管理 MapReduce 作业
Hadoop 大数据平台接受客户端提交的作业。 在多用户环境中,可以同时提交和运行多个作业。 Hadoop 作业的管理包括检查作业状态、更改作业优先级、终止正在运行的作业等。 在本食谱中,我们将概述执行这些作业管理任务的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有 Hadoop 守护进程都在运行,没有任何问题。 我们还假设普通用户可以向集群提交 Hadoop 作业。
使用以下命令从集群管理员计算机登录到主节点:
ssh hduser@master
怎么做……
执行以下步骤以检查 Hadoop 作业的状态:
-
List all the running jobs using the following command:
hadoop job -list我们将能够获得类似于以下内容的输出:
1 jobs currently running JobId State StartTime UserName Priority SchedulingInfo job_201302152353_0001 4 1361405786524 hduser NORMAL NA备注
输出消息告诉我们,当前集群上正在运行一个具有
JobId``job_201302152353_0001的作业。 -
List all the submitted jobs since the start of the cluster with the following command:
hadoop job -list all我们将得到类似于以下内容的输出:
2 jobs submitted States are: Running : 1 Succeeded : 2 Failed : 3 Prep : 4 JobId State StartTime UserName Priority SchedulingInfo job_201302152353_0001 2 1361405786524 hduser NORMAL NA job_201302152353_0002 4 1361405860611 hduser NORMAL NA输出消息的
State列显示作业的状态。 例如,在前面的输出中,提交了两个作业,第一个作业JobId``job_201302152353_0001处于成功状态,第二个作业JobId``job_201302152353_0002处于准备状态。 这两个作业都具有正常优先级,并且没有调度信息。 -
We can check the status of the default queue with the following command:
hadoop queue -list如果没有添加队列,我们将得到类似于以下内容的输出:
Queue Name : default Queue State : running Scheduling Info : N/AHadoop 使用队列管理作业。 默认情况下,只有一个默认队列。 命令的输出显示集群只有一个默认队列,该队列处于运行状态,没有调度信息。
-
Check the status of a queue ACL with the following command:
hadoop queue -showacls如果尚未配置 ACL,我们将得到类似以下内容的输出:
Queue acls for user : hduser Queue Operations ===================== default submit-job,administer-jobs输出显示用户
hduser可以提交和管理默认队列中的作业。 -
Show all the jobs in the default queue using the following command:
hadoop queue -info default -showJobs我们将得到类似于以下内容的输出:
Queue Name : default Queue State : running Scheduling Info : N/A Job List JobId State StartTime UserName Priority SchedulingInfo job_201302152353_0001 2 1361405786524 hduser NORMAL NA -
Check the status of a job with the following command:
hadoop job -status job_201302152353_0001输出将类似于以下内容:
Job: job_201302152353_0001 file: hdfs://master:54310/user/hduser/.staging/job_201302152353_0001/job.xm l tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201302152353_000 1 map() completion: 1.0 reduce() completion: 1.0 Counters: 31 Job Counters Launched reduce tasks=1 SLOTS_MILLIS_MAPS=87845 Total time spent by all reduces waiting after reserving slots (ms)=0 Total time spent by all maps waiting after reserving slots (ms)= 0 Rack-local map tasks=8 Launched map tasks=10 Data-local map tasks=2 SLOTS_MILLIS_REDUCES=16263 File Input Format Counters Bytes Read=1180 File Output Format Counters Bytes Written=97 FileSystemCounters FILE_BYTES_READ=226 HDFS_BYTES_READ=2440 FILE_BYTES_WRITTEN=241518 HDFS_BYTES_WRITTEN=215 Map-Reduce Framework Map output materialized bytes=280 Map input records=10 Reduce shuffle bytes=252 Spilled Records=40 Map output bytes=180 Total committed heap usage (bytes)=2210988032 CPU time spent (ms)=9590 Map input bytes=240 SPLIT_RAW_BYTES=1260 Combine input records=0 Reduce input records=20 Reduce input groups=20 Combine output records=0 Physical memory (bytes) snapshot=2033074176 Reduce output records=0 Virtual memory (bytes) snapshot=5787283456 Map output records=20
通过执行以下步骤更改作业的状态:
-
Set the job
job_201302152353_0001to be on high priority using the following command:hadoop job -set-priority job_201302152353_0003 HIGH备注
可用优先级(按降序排列)包括:
VERY_HIGH、HIGH、NORMAL、LOW和VERY_LOW。作业的优先级将为
HIGH,如以下输出所示:4 jobs submitted States are: Running : 1 Succeeded : 2 Failed : 3 Prep : 4 JobId State StartTime UserName Priority SchedulingInfo job_201302152353_0001 2 1361405786524 hduser NORMAL NA job_201302152353_0002 2 1361405860611 hduser NORMAL NA job_201302152353_0003 1 1361408177470 hduser HIGH NA -
Kill the job
job_201302152353_0004using the following command:hadoop job -kill job_201302152353_0004使用 job status 命令,我们将获得以下输出:
3 jobs submitted States are: Running : 1 Succeeded : 2 Failed : 3 Prep : 4 Killed : 5 JobId State StartTime UserName Priority SchedulingInfo job_201302152353_0001 2 1361405786524 hduser NORMAL NA job_201302152353_0002 2 1361405860611 hduser NORMAL NA job_201302152353_0003 1 1361408177470 hduser HIGH NA job_201302152353_0004 5 1361407740639 hduser NORMAL NA备注
Killed : 5信息不在原始输出中,我根据终止作业的状态job_201302152353_0004将其放在那里。
执行以下步骤以提交 MapReduce 作业:
-
Create the job configuration file,
job.xml, with the following content:<?xml version="1.0" encoding="UTF-8" standalone="no"?> <configuration> <property> <name>mapred.input.dir</name> <value>randtext</value> </property> <property> <name>mapred.output.dir</name> <value>output</value> </property> <property> <name>mapred.job.name</name> <value>wordcount</value> </property> <property> <name>mapred.mapper.class</name> <value>org.apache.hadoop.mapred.WordCount$Map</value> </property> <property> <name>mapred.combiner.class</name> <value>org.apache.hadoop.mapred.WordCount$Reduce</value> </property> <property> <name>mapred.reducer.class</name> <value>org.apache.hadoop.mapred.WordCount$Reduce</value> </property> <property> <name>mapred.input.format.class</name> <value>org.apache.hadoop.mapred.TextInputFormat</value> </property> <property> <name>mapred.output.format.class</name> <value>org.apache.hadoop.mapred.TextOutputFormat</value> </property> </configuration>job.xml文件是指定作业配置的 XML 文件。 在此作业配置文件中,我们指定了作业的作业名称、映射器类、Reducer 类、组合器类、输入格式和输出格式。 我们使用了wordcount作为示例,因此我们还需要确保$HADOOP_HOME/hadoop-examples*.jar在CLASSPATH中可用。 -
Submit the job with the following command:
hadoop job -submit job.xml我们将得到类似于以下内容的输出:
13/03/01 11:55:53 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. 13/03/01 11:55:53 INFO util.NativeCodeLoader: Loaded the native-hadoop library 13/03/01 11:55:53 WARN snappy.LoadSnappy: Snappy native library not loaded 13/03/01 11:55:53 INFO mapred.FileInputFormat: Total input paths to process : 5 Created job job_201302281451_0012
它是如何工作的.
queue命令是用于JobQueueClient类的包装命令,并且job命令是用于JobClient类的包装命令。
我们可以通过以下命令获得queue命令的用法:
hadoop queue
Usage: JobQueueClient <command> <args>
[-list]
[-info <job-queue-name> [-showJobs]]
[-showacls]
同样,我们可以通过以下命令获得job命令的用法:
hadoop job
输出将类似于以下内容:
Usage: JobClient <command> <args>
[-submit <job-file>]
[-status <job-id>]
[-counter <job-id> <group-name> <counter-name>]
[-kill <job-id>]
[-set-priority <job-id> <priority>]. Valid values for priorities are: VERY_HIGH HIGH NORMAL LOW VERY_LOW
[-events <job-id> <from-event-#> <#-of-events>]
[-history <jobOutputDir>]
[-list [all]]
[-list-active-trackers]
[-list-blacklisted-trackers]
[-list-attempt-ids <job-id> <task-type> <task-state>]
[-kill-task <task-id>]
[-fail-task <task-id>]
还有更多...
我们讨论了用于 Hadoop 作业管理的最有用的命令。 实际上,还有更多与作业管理相关的命令,或者,我们可以使用 web UI 来管理 Hadoop 作业。
更多作业管理命令
-
Get the value of a counter:
hadoop job -counter <job-id> <group-name> <counter-name>例如,我们可以使用以下命令获取作业
job_201302281451_0002的计数器组FileSystemCounters的计数器HDFS_BYTES_WRITTEN:hadoop job -counter job_201302281451_0002 FileSystemCounters HDFS_BYTES_WRITTEN -
Query events of a MapReduce job with the following command:
hadoop job -events <job-id> <from-event-#> <#-of-events>例如,我们可以使用以下命令查询作业
job_201302281451_0002的前 10 个事件:hadoop job -events job_201302281451_0002 0 10我们将得到类似于以下内容的输出:
![More job management commands]()
-
Get the job history including job details, failed and killed jobs, and so on with the following command:
hadoop job -history我们将得到类似于以下内容的输出:
Hadoop job: 0012_1362156954465_hduser ===================================== Job tracker host name: job job tracker start time: Tue May 18 17:18:01 EDT 1976 User: hduser JobName: wordcount JobConf: hdfs://master:54310/user/hduser/.staging/job_201302281451_0012/job.xml Submitted At: 1-Mar-2013 11:55:54 Launched At: 1-Mar-2013 11:55:54 (0sec) Finished At: 1-Mar-2013 11:56:43 (48sec) Status: FAILED Counters: |Group Name |Counter name |Map Value |Reduce Value|Total Value| --------------------------------------------------------------- ===================================== Task Summary ============================ Kind Total Successful Failed Killed StartTime FinishTime Setup 1 1 0 0 1-Mar-2013 11:55:46 1-Mar-2013 11:55:49 (2sec) Map 45 0 38 7 1-Mar-2013 11:55:49 1-Mar-2013 11:56:34 (44sec) Reduce 0 0 0 0 Cleanup 1 1 0 0 1-Mar-2013 11:56:33 1-Mar-2013 11:56:36 (3sec) ============================ No Analysis available as job did not finish KILLED SETUP task list for 0012_1362156954465_hduser TaskId StartTime FinishTime Error ==================================================== FAILED MAP task list for 0012_1362156954465_hduser TaskId StartTime FinishTime Error InputSplits ==================================================== task_201302281451_0012_m_000000 1-Mar-2013 11:55:58 1-Mar-2013 11:56:33 (35sec) /default-rack/slave2,/default-rack/slave1 ... FAILED task attempts by nodes Hostname FailedTasks =============================== slave1 task_201302281451_0012_m_000000, task_201302281451_0012_m_000001, task_201302281451_0012_m_000002, task_201302281451_0012_m_000004, task_201302281451_0012_m_000005, task_201302281451_0012_m_000008, task_201302281451_0012_m_000010, task_201302281451_0012_m_000013, slave2 task_201302281451_0012_m_000000, task_201302281451_0012_m_000005, task_201302281451_0012_m_000008, task_201302281451_0012_m_000010, task_201302281451_0012_m_000019, task_201302281451_0012_m_000034, task_201302281451_0012_m_000036, task_201302281451_0012_m_000039, slave3 task_201302281451_0012_m_000000, task_201302281451_0012_m_000001, task_201302281451_0012_m_000002, task_201302281451_0012_m_000003, task_201302281451_0012_m_000004, task_201302281451_0012_m_000010, task_201302281451_0012_m_000012, task_201302281451_0012_m_000019, slave4 task_201302281451_0012_m_000000, task_201302281451_0012_m_000001, task_201302281451_0012_m_000003, task_201302281451_0012_m_000004, task_201302281451_0012_m_000010, task_201302281451_0012_m_000012, task_201302281451_0012_m_000013, task_201302281451_0012_m_000034, slave5 task_201302281451_0012_m_000002, task_201302281451_0012_m_000003, task_201302281451_0012_m_000005, task_201302281451_0012_m_000008, task_201302281451_0012_m_000012, task_201302281451_0012_m_000013, KILLED task attempts by nodes Hostname FailedTasks =============================== slave1 task_201302281451_0012_m_000003, task_201302281451_0012_m_000012, slave2 task_201302281451_0012_m_000002, task_201302281451_0012_m_000013, slave3 task_201302281451_0012_m_000005, slave5 task_201302281451_0012_m_000001, task_201302281451_0012_m_000004,
管理任务
我们将向您展示如何终止任务、检查任务尝试等。
-
Kill a task with the following command:
hadoop job -kill-task <task-id>例如,要终止任务
task_201302281451_0013_m_000000,可以使用以下命令:hadoop job -kill-task task_201302281451_0013_m_000000任务终止后,JobTracker 将在另一个节点上重新启动该任务。 取消的任务可以通过 Web 用户界面查看,如以下屏幕截图所示:
![Managing tasks]()
Hadoop JobTracker 可以在以下情况下自动终止任务:
- 任务在超时后不报告进度
- 推测性执行可以在多个节点上运行一个任务;如果其中一个任务成功,则同一任务的其他尝试将被终止,因为这些尝试的尝试结果将是无用的
- 作业/任务调度器(如公平调度器和容量调度器)需要空插槽用于其他池或队列
-
In many situations, we need a task to fail, which can be done with the following command:
hadoop job -fail-task <task-id>例如,要使任务
task_201302281451_0013_m_000000失败,可以使用以下命令:hadoop -job -fail-task task_201302281451_0013_m_000000 -
List task attempts with the following command:
hadoop job -list-attempt-ids <job-id> <task-type> <task-state>在此命令中,可用的任务类型为
map、reduce、setup和clean;可用的任务状态为running和completed。例如,要列出作业
job_201302281451_0014的所有已完成映射尝试,可以使用以下命令:hadoop job -list-attempt-ids job_201302281451_0014 map completed我们将得到类似于以下内容的输出:
attempt_201302281451_0014_m_000000_0 attempt_201302281451_0014_m_000001_0 attempt_201302281451_0014_m_000002_0 attempt_201302281451_0014_m_000009_0 attempt_201302281451_0014_m_000010_0 ...
通过 Web 用户界面管理作业
我们将从 Web 用户界面显示作业管理。
-
Check the status of a job by opening the JobTracker URL,
master:50030/jobtracker.jsp.我们将看到一个类似于以下屏幕截图的网页:
![Managing jobs through the web UI]()
备注
从该网页中,我们可以获得集群摘要信息、调度信息、正在运行的作业列表、已完成的作业列表和停用的作业列表。 通过单击特定的作业链接,我们可以查看作业的详细信息,也可以打开 URL
http://master:50030/jobdetails.jsp?jobid=job_201302281451_0004&refresh=30。 通过指定refresh parameter,我们可以告诉网页每 30 秒刷新一次。 -
Kill a job by opening the URL,
master:50030/jobdetails.jsp?jobid=job_201302281451_0007&action=kill.稍后,取消的作业将列在失败作业列表中,如以下屏幕截图所示:
![Managing jobs through the web UI]()
-
通过打开 URL
master:50030/jobdetails.jsp?jobid=job_201302281451_0007&action=changeprio&prio=HIGH将作业的优先级更改为HIGH。
另请参阅
- 第 3 章,配置 Hadoop 集群中的验证 Hadoop 安装配方
- 管理 HDFS 集群配方
- 管理 MapReduce 集群的配方
- 参考http://hadoop.apache.org/docs/r1.1.2/mapred_tutorial.html
从 Web 用户界面检查作业历史记录
Hadoop 在日志目录中跟踪所有个提交的作业。 作业历史记录日志包含每个作业的信息,如总运行时间和每个任务的运行时间。 在本节中,我们将向您展示如何通过 Web 用户界面检查作业历史记录日志。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在正常运行,没有任何问题。
怎么做……
执行以下步骤以从 Web 用户界面检查作业历史记录日志:
-
Open the job history URL,
http://master:50030/jobhistoryhome.jsp.我们将能够获得类似于以下屏幕截图的网页:
![How to do it...]()
在 web 用户界面上,我们可以根据用户名和作业名过滤作业,格式为用户名:作业名,如截图所示。
username应该是运行某个作业的用户名,job名称应该包含 Hadoop 作业的关键字。 -
From the web UI, we will be able to get a list of jobs in the Available Jobs in History section. By clicking on the Job Id link of a job, we can get the details of the job as shown in the following screenshot:
![How to do it...]()
此网页显示作业的详细信息,包括任务信息,如总任务数、成功任务数、失败任务数和已终止任务数。 该信息还包括 Hadoop 作业的四个阶段的开始时间和结束时间,包括设置、映射、减少和清理阶段。
该网页还包含该作业的计数器信息,如屏幕截图下部所示。
-
In addition to the summary of the job information, the web UI provides an interface for us to analyze a job. By clicking on the link Analyze This Job, we will go to a web page similar to the following screenshot:
![How to do it...]()
该网页包含每个任务的简单时间分析信息,例如,占用时间最短的最佳执行任务、执行最差的任务以及所有任务花费的平均时间。
-
To further check the information of a task, we can click on the link for the task, and we will get a web page similar to the following screenshot:
![How to do it...]()
-
We can get the counters of a task by clicking on the
Countersfield of the task as shown in the preceding screenshot, or we can get the same web page by opening URLhttp://master:50030/taskstats.jsp?tipid=task_201302281211_0001_m_000000.备注
在此 URL 中,
task_201302281211_0001_m_000000是我们要获取其计数器的任务 ID。我们将能够获得任务计数器,如以下屏幕截图所示:
![How to do it...]()
-
In addition to all these web services, the web UI provides a graphical display of the progress of Hadoop jobs and each phase as shown in the following screenshot:
![How to do it...]()
此屏幕截图显示每个 map 和 Reduce 任务的进度。 归约任务由三个阶段组成:置乱阶段、排序阶段和归约阶段,每个阶段占全部归约任务的 1/3。
它是如何工作的.
作业历史 URLmaster:50030/jobhistoryhome.jsp的含义可以在下表中解释:
菲尔德 (人名)
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| master | 运行 JobTracker 守护程序的计算机的主机名。 |
| 50030 | JobTracker 嵌入式 Web 服务器的端口号。 |
| jobhistoryhome.jsp | 提供作业历史记录服务的.jsp文件名。 |
Web 用户界面可以每五秒自动更新一次;可以通过更改$HADOOP_HOME/conf/mapred-site.xml文件中的mapreduce.client.completion.pollinterval属性来修改此间隔,如下所示:
<property>
<name>mapreduce.client.completion.pollinterval</name>
<value>5000</value>
</property>
下表显示了可用于检查作业、任务和尝试状态的 URL 摘要:
|统一资源定位器
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| master:50030/jobtracker.jsp | JobTracker。 |
| master:50030/jobhistoryhome.jsp | 工作历史记录。 |
| master:50030/jobtasks.jsp?jobid=<jobID>&type=map&pagenum=1 | 所有映射任务的列表。 |
| master:50030/jobtasks.jsp?jobid=<jobID>&type=reduce&pagenum=1 | 所有 Reduce 任务的列表。 |
| master:50030/taskdetails.jsp?tipid=<taskID> | 任务尝试详细信息。 |
| master:50030/taskstats.jsp?attemptid=<attempID> | 尝试计数器。 |
下表列出了jobID、taskID和attemptID的命名示例:
爱达荷 / 身份证件
|
例证 / 范例 / 榜样 / 例子
|
| --- | --- |
| jobID | job_201302281451_0001 |
| taskID | task_201302281451_0001_m_000000 |
| attemptID | attempt_201302281451_0001_m_000000_0 |
另请参阅
- 第 3 章,配置 Hadoop 集群中的验证 Hadoop 安装配方
- 管理 MapReduce 作业配方
将数据导入 HDFS
如果我们的大数据在本地文件系统上,我们需要将其移动到 HDFS。 在本节中,我们将列出将数据从本地文件系统移动到 HDFS 文件系统的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有 Hadoop 守护进程都在运行,没有任何问题。 我们假设本地系统上的数据位于目录/data中。
怎么做……
执行以下步骤将数据导入 HDFS:
-
Use the following command to create a data directory on HDFS:
hadoop fs -mkdir data此命令将在 HDFS 文件系统中创建一个目录
/user/hduser/data。 -
Copy the data file from the local directory to HDFS using the following command:
hadoop fs -cp file:///data/datafile /user/hduser/data或者,我们可以使用命令
hadoop fs -put /data/datafile /user/hduser/data。 -
使用以下命令验证 HDFS 上的数据文件:
hadoop fs -ls /user/hduser/data -
Move the data file from the local directory to HDFS with the following command:
hadoop fs -mv file:///data/datafile /user/hduser/data备注
如果使用此命令,本地副本将被删除。
-
Use the distributed copy to copy the large data file to HDFS:
hadoop distcp file:///data/datafile /user/hduser/data此命令将启动具有多个映射器的 MapReduce 作业,以并行运行复制任务。
它是如何工作的.
我们可以通过以下命令获得fs命令的用法:
hadoop fs
我们将得到类似于以下内容的输出:
Usage: java FsShell
[-ls <path>]
[-lsr <path>]
[-du <path>]
[-dus <path>]
[-count[-q] <path>]
[-mv <src> <dst>]
[-cp <src> <dst>]
[-rm [-skipTrash] <path>]
[-rmr [-skipTrash] <path>]
[-expunge]
[-put <localsrc> ... <dst>]
[-copyFromLocal <localsrc> ... <dst>]
[-moveFromLocal <localsrc> ... <dst>]
[-get [-ignoreCrc] [-crc] <src> <localdst>]
[-getmerge <src> <localdst> [addnl]]
[-cat <src>]
[-text <src>]
[-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]
[-moveToLocal [-crc] <src> <localdst>]
[-mkdir <path>]
[-setrep [-R] [-w] <rep> <path/file>]
[-touchz <path>]
[-test -[ezd] <path>]
[-stat [format] <path>]
[-tail [-f] <file>]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-chgrp [-R] GROUP PATH...]
[-help [cmd]]
提示
如果命令中没有明确指定默认文件系统架构,则这些数据导入命令的<src>和<dst>参数使用不同的默认文件系统架构。
-cp和-mv的默认<src>文件系统架构是hdfs:///,它是使用文件$HADOOP_HOME/conf/core-site.xml中的fs.default.name属性配置的,而-put、-copyFromLocal和-moveFromLocal的默认<src>文件系统架构是 file:///.
所有这些命令的默认<dst>文件系统架构为hdfs:///。
还有更多...
要将多个文件从本地目录复制到 HDFS,可以使用以下命令:
hadoop fs -copyFromLocal src1 src2 data
此命令将本地目录中的两个文件src1和src2复制到 HDFS 上的数据目录。
同样,我们可以将文件从本地目录移动到 HDFS。 它与前一个命令的唯一不同之处在于,本地文件将被删除。
hadoop fs -moveFromLocal src1 src2 data
此命令将把本地目录中的两个文件src1和src2移动到 HDFS。
虽然分布式拷贝可能比简单的数据导入命令更快,但由于可能会有很高的数据传输请求,它可能会给数据所在的节点带来很大的负载。 distcp在将数据从一个 HDFS 位置复制到另一个 HDFS 位置时会更有用。 例如:
hadoop distcp hdfs:///user/hduser/file hdfs:///user/hduser/file-copy
另请参阅
- 管理 HDFS 集群配方
- 在 HDFS上操作文件的秘诀
在 HDFS 上操作文件
除了从本地目录复制文件的命令外,HDFS 还提供了操作文件的命令。 在本节中,我们将向您展示如何操作文件,例如从 HDFS 下载文件、检查文件内容以及从 HDFS 中删除文件。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在正常运行,没有任何问题。
怎么做……
执行以下步骤以检查 HDFS 上的文件和目录的状态:
-
List files of the user's home directory on HDFS using the following command:
hadoop fs -ls .例如,此命令将在我的机器上显示以下输出:
Found 7 items drwx------ - hduser supergroup 0 2013-02-21 22:17 /user/hduser/.staging -rw-r--r-- 2 hduser supergroup 646 2013-02-21 22:28 /user/hduser/file1 -rw-r--r-- 2 hduser supergroup 848 2013-02-21 22:28 /user/hduser/file2 ...备注
要递归列出主目录中的文件,可以使用命令
hadoop fs -lsr ..。 -
Check the space usage of files and folders in the home directory with the following command:
hadoop fs -du .我们将得到类似于以下内容的输出:
Found 7 items 648521 hdfs://master:54310/user/hduser/.staging 646 hdfs://master:54310/user/hduser/file1 3671517 hdfs://master:54310/user/hduser/file2 ...第一列显示文件的大小(以字节为单位),第二列显示文件在 HDFS 上的位置。
有时,我们可以使用命令
hadoop fs -dus .获得目录的汇总使用情况。 它将显示目录的总空间使用情况,而不是目录中单个文件和文件夹的大小。 例如,我们可以获得类似于以下内容的一行输出:hdfs://master:54310/user/hduser 109810605367 -
Check the content of a file with the following command:
hadoop fs -cat file1这个命令可以方便地检查小文件的内容。 但是当文件很大时,不建议这样做。 相反,我们可以使用命令
hadoop fs -tail file1来检查最后几行的内容。或者,我们可以使用命令
hadoop fs -text file1以文本格式显示file1的内容。 -
使用下面的命令测试
file1是否存在、是否为空或是否为目录:hadoop fs -test -e file1 hadoop fs -test -z file1 hadoop fs -test -d file1 -
使用以下命令检查
file1的状态:hadoop fs -stat file1
执行以下步骤以操作 HDFS 上的文件和目录:
-
使用以下命令清空垃圾桶:
hadoop fs -expunge -
Merge files in a directory
dirand download it as one big file:hadoop fs -getmerge dir file1此命令类似于 Linux 中的
cat命令。 当我们希望将 MapReduce 输出作为一个文件而不是多个较小的分区文件时,它非常有用。例如,该命令可以将文件
dir/part-00000、dir/part-00001等合并到file1到本地文件系统。 -
Delete
file1under the current directory using the following command:hadoop fs -rm file1提示
请注意,此命令不会删除目录。 要删除目录,可以使用命令
hadoop fs -rmr dir。 它非常类似于 Linux 命令rm -r,该命令将递归地删除目录dir和目录本身中的所有内容。 所以要谨慎使用。 -
Download
file1from HDFS using the following command:hadoop fs -get file1目录
/user/hduser下的file1文件将被下载到本地文件系统上的当前目录。 -
Change the group membership of a regular file with the following command:
hadoop fs -chgrp hadoop file1在此命令中,我们假设组
hadoop存在。此外,我们还可以使用命令
hadoop fs -chgrp -R hadoop dir递归地更改目录dir的组成员身份。 -
Change the ownership of a regular file with the following command:
hadoop fs -chown hduser file1类似地,我们可以使用命令
hadoop fs -chown hdadmin -R dir递归地更改目录dir的所有权。 -
Change the mode of a file with the following command:
hadoop fs -chmod 600 file1提示
HDFS 下的文件和目录模式遵循与 Linux 下类似的规则。
-
使用以下命令将
file1的复制因子设置为3:hadoop fs -setrep -w 3 file1 -
使用以下命令创建空文件:
hadoop fs -touchz 0file
…的工作原理
我们可以通过以下命令了解fs命令的用法:
hadoop fs
我们将得到类似于以下内容的输出:
Usage: java FsShell
[-ls <path>]
[-lsr <path>]
[-du <path>]
[-dus <path>]
[-count[-q] <path>]
[-mv <src> <dst>]
[-cp <src> <dst>]
[-rm [-skipTrash] <path>]
[-rmr [-skipTrash] <path>]
[-expunge]
[-put <localsrc> ... <dst>]
[-copyFromLocal <localsrc> ... <dst>]
[-moveFromLocal <localsrc> ... <dst>]
[-get [-ignoreCrc] [-crc] <src> <localdst>]
[-getmerge <src> <localdst> [addnl]]
[-cat <src>]
[-text <src>]
[-copyToLocal [-ignoreCrc] [-crc] <src> <localdst>]
[-moveToLocal [-crc] <src> <localdst>]
[-mkdir <path>]
[-setrep [-R] [-w] <rep> <path/file>]
[-touchz <path>]
[-test -[ezd] <path>]
[-stat [format] <path>]
[-tail [-f] <file>]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-chgrp [-R] GROUP PATH...]
[-help [cmd]]
要获取每个命令的帮助,我们可以使用-help选项。 例如,我们可以通过以下内容获得 LIST 命令的帮助:
hadoop fs -help ls
此命令将为我们提供以下输出:
-ls <path>: List the contents that match the specified file pattern. If
path is not specified, the contents of /user/<currentUser>
will be listed. Directory entries are of the form
dirName (full path) <dir>
and file entries are of the form
fileName(full path) <r n> size
where n is the number of replicas specified for the file
and size is the size of the file, in bytes.
配置 HDFS 配额
在多用户环境中,配额可以强制公平共享计算资源。 HDFS 支持用户和目录配额。 在本配方中,我们将列出配置 HDFS 配额的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
怎么做……
执行以下步骤以管理 HDFS 配额:
-
Set the name quota on the home directory with the following command:
hadoop dfsadmin -setQuota 20 /usr/hduser此命令将主目录上的名称配额设置为 20,这意味着在主目录下最多可以创建 20 个文件(包括目录)。
如果达到配额,将显示类似以下内容的错误消息:
put: org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /user/hduser is exceeded: quota=20 file count=141 -
Set the space quota of the current user's home directory to be
100000000with the following command:hadoop dfsadmin -setSpaceQuota 100000000 /user/hduser如果目录
/user/hduser下的空间使用量超过了指定的配额,我们会收到类似如下的错误消息:put: org.apache.hadoop.hdfs.protocol.DSQuotaExceededException: The DiskSpace quota of /user/hduser is exceeded: quota=100000000 diskspace consumed=204.5g -
Check the quota status with the following command:
hadoop fs -count -q /user/hduser在设置配额之前,我们将得到类似于以下内容的输出:
none inf none inf 13 127 109810605367 hdfs://master:54310/user/hduser我们会得到以下配额已经设定:
100 -40 100000000 -219525889438 13 127 1098106 05367 hdfs://master:54310/user/hduser输出列的含义为
DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME或QUOTA REMAINING_QUATA SPACE_QUOTA REMAINING_SPACE_QUOTA DIR_COUNT FILE_COUNT CONTENT_SIZE FILE_NAME。 -
使用以下命令清除名称配额:
hadoop dfsadmin -clrQuota /user/hduser -
使用以下命令清除空间配额:
hadoop dfsadmin -clrSpaceQuota /user/hduser
…的工作原理
我们可以通过以下命令获得hadoop fs命令的用法:
hadoop dfsadmin
我们将得到类似于以下内容的输出:
Usage: java DFSAdmin
[-report]
[-safemode enter | leave | get | wait]
[-saveNamespace]
[-refreshNodes]
[-finalizeUpgrade]
[-upgradeProgress status | details | force]
[-metasave filename]
[-refreshServiceAcl]
[-refreshUserToGroupsMappings]
[-refreshSuperUserGroupsConfiguration]
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
[-setSpaceQuota <quota> <dirname>...<dirname>]
[-clrSpaceQuota <dirname>...<dirname>]
[-setBalancerBandwidth <bandwidth in bytes per second>]
[-help [cmd]]
-count命令的一般用法是:
hadoop fs -count -q <path>
在此命令中,-q指定要查询的目录。
配置 CapacityScheduler
HadoopCapacityScheduler是一个可插拔 MapReduce作业****调度程序。 目标是通过在多个用户之间共享集群来最大化 Hadoop 集群利用率。 CapacityScheduler 使用队列来保证每个用户的最小份额。 它具有安全性、弹性、可操作性、支持作业优先级等特点。 在本食谱中,我们将概述为 Hadoop 集群配置 CapacityScheduler 的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从集群管理员计算机登录到主节点:
ssh hduser@master
怎么做……
通过以下步骤配置 CapacityScheduler:
-
通过将以下行添加到文件
$HADOOP_HOME/conf/mapred-site.xml中,将 Hadoop 配置为使用 CapacityScheduler:<property> <name>mapred.jobtracker.taskScheduler</name> <value>org.apache.hadoop.mapred.CapacityTaskScheduler</value> </property> -
Define a new queue,
hdqueue, by adding the following lines into the file$HADOOP_HOME/conf/mapred-site.xml:<property> <name>mapred.queue.names</name> <value>default,hdqueue</value> </property>备注
默认情况下,Hadoop 集群只有一个默认队列。
-
通过将以下行添加到文件
$HADOOP_HOME/conf/capacity-scheduler.xml中配置 CapacityScheduler 队列:<property> <name>mapred.capacity-scheduler.queue.hdqueue.capacity</name> <value>20</value> </property> <property> <name>mapred.capacity-scheduler.queue.default.capacity</name> <value>80</value> </property> <property> <name>mapred.capacity-scheduler.queue.hdqueue.minimum-user-limit-percent</name> <value>20</value> </property> <property> <name>mapred.capacity-scheduler.maximum-system-jobs</name> <value>10</value> </property> <property> <name>mapred.capacity-scheduler.queue.hdqueue.maximum-initialized-active-tasks</name> <value>500</value> </property> <property> <name>mapred.capacity-scheduler.queue.hdqueue.maximum-initialized-active-tasks-per-user</name> <value>100</value> </property> <property> <name>mapred.capacity-scheduler.queue.hdqueue.supports-priority</name> <value>true</value> </property> -
使用以下命令重新启动 MapReduce 集群:
stop-mapred.sh start-mapred.sh -
From the JobTracker web UI, we can get a queue scheduling information web page similar to the following screenshot:
![How to do it...]()
或者,我们可以使用命令
hadoop queue -list来获取相同的信息。 -
Get the schedule details of each queue by opening the URL,
master:50030/scheduler, and we can get a web page similar to the following:![How to do it...]()
此屏幕截图显示集群中每个队列的状态,包括正在运行的作业数、挂起作业数等。
-
Test the queue configuration by submitting an example
wordcountjob to the queuehdqueueusing the following command:hadoop jar $HADOOP_HOME/hadoop-examples-1.1.2.jar wordcount -Dmapred.job.queue.name=hdqueue randtext wordcount.out从作业信息 Web 用户界面中,我们可以获得类似于以下内容的作业调度信息:
Job Scheduling information: 8 running map tasks using 8 map slots. 0 additional slots reserved. 1 running reduce tasks using 1 reduce slots. 0 additional slots reserved.
它是如何工作的.
CapacityScheduler 在$HADOOP_HOME/lib directory下作为 JAR 文件提供。 例如,在我们的 Hadoop 发行版中,JAR 文件是$HADOOP_HOME/lib/hadoop-capacity-scheduler-1.1.2.jar。
下表显示了队列配置属性的说明:
|性质 / 财产 / 所有权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| mapred.capacity-scheduler.queue.hdqueue.capacity | hdqueue队列的插槽总数的百分比份额。 |
| mapred.capacity-scheduler.queue.default.capacity | 默认队列插槽总数的百分比份额。 |
| mapred.capacity-scheduler.queue.hdqueue.minimum-user-limit-percent | 为队列中的每个用户分配的最小资源百分比hdqueue。 |
| mapred.capacity-scheduler.maximum-system-jobs | CapacityScheduler 可以并发初始化的最大作业数。 |
| mapred.capacity-scheduler.queue.hdqueue.maximum-initialized-active-tasks | 队列中所有作业的最大并发初始化任务数hdqueue。 |
| mapred.capacity-scheduler.queue.hdqueue.maximum-initialized-active-tasks-per-user | 每个用户在队列hdqueue中的所有作业上并发初始化的最大任务数。 |
| mapred.capacity-scheduler.queue.hdqueue.supports-priority | 是否支持作业调度的作业优先级。 |
还有更多...
Hadoop 支持使用队列 ACL 对队列进行访问控制。 队列 ACL 控制向队列提交 MapReduce 作业的授权。 有关队列 ACL 的更多信息,请参阅http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html#Configuring+the+Hadoop+Daemons。
另请参阅
- 管理 MapReduce 作业配方
- 从 Web UI 配方检查作业历史记录的
** 配置公平调度器配方* 第 5 章,加强 Hadoop 集群中的使用 ACL配方配置作业授权* 参考http://hadoop.apache.org/docs/r1.1.2/capacity_scheduler.html*
*# 配置公平调度程序
与 CapacityScheduler 类似,Fair Scheduler设计用于在多用户环境中实施集群资源的公平共享。 在本食谱中,我们将概述为 Hadoop 集群配置 Fair Scheduler 的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 管理员计算机登录到主节点:
ssh hduser@master
怎么做……
执行以下步骤以配置 Hadoop Fair Scheduler:
-
通过更改文件
$HADOOP_HOME/conf/mapred-site.xml中的以下属性启用公平调度:<property> <name>mapred.jobtracker.taskScheduler</name> <value>org.apache.hadoop.mapred.FairScheduler</value> </property> -
创建公平调度器配置文件
$HADOOP_HOME/conf/fair-scheduler.xml,其内容类似于以下内容:<?xml version="1.0"?> <allocations> <pool name="hduser"> <minMaps>5</minMaps> <minReduces>5</minReduces> <maxMaps>90</maxMaps> <maxReduces>20</maxReduces> <weight>2.0</weight> </pool> <user name="hduser"> <maxRunningJobs>1</maxRunningJobs> </user> <userMaxJobsDefault>3</userMaxJobsDefault> </allocations> -
使用以下命令重新启动 MapReduce 集群:
stop-mapred.sh start-mapred.sh -
Verify the setting of Fair Scheduler by opening the URL
http://master:50030/scheduler.该网页将类似于以下屏幕截图:
![How to do it...]()
它是如何工作的.
Hadoop Fair Scheduler 以这样一种方式调度作业,即所有作业都可以获得相等份额的计算资源。 作业通过调度池进行组织。 可以为每个 Hadoop 用户配置一个池。 如果未配置用户的池,将使用默认池。 池指定用户可以在集群上共享的资源量,例如映射插槽数、减少插槽数、正在运行的作业总数等。
minMaps和minReduces用于确保池在集群上的计算插槽所占份额最小。 当所需的计算插槽数大于配置的插槽数时,最小共享保证可能会很有用。 如果未达到池的最小份额,JobTracker 将终止其他池上的任务,并将插槽分配给饥饿池。 在这种情况下,JobTracker 将在其他节点上重新启动已终止的任务,因此,该作业需要更长的时间才能完成。
除了计算插槽之外,公平调度器还可以限制池中并发运行的作业和任务的数量。 因此,如果用户提交的作业数量超过配置的限制,则某些作业必须进入队列,直到其他作业完成。 在这种情况下,公平排定程序将安排优先级较高的作业比优先级较低的作业更早运行。 如果等待队列中的所有作业都具有相同的优先级,则可以将公平调度程序配置为使用公平调度程序或 FIFO 调度程序来调度这些作业。
下表显示了公平调度程序支持的属性:
|性质 / 财产 / 所有权
|
重要性 / 价值观念 / 标准 / 值
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| minMaps | 整数 / 完整物 / 统一体 | 池的最小贴图插槽。 |
| minReduces | 整数 / 完整物 / 统一体 | 池的最大贴图插槽数。 |
| minReduces | 整数 / 完整物 / 统一体 | 池的最小缩减插槽。 |
| minReduces | 整数 / 完整物 / 统一体 | 池的最大减少插槽数。 |
| schedulingMode | 公平/先进先出 | 池内部调度模式,FIRE 或 FIFO。 |
| maxRunningJobs | 整数 / 完整物 / 统一体 | 池的最大并发运行作业数。 默认值为无限制。 |
| weight | 漂浮 / 浮动 / 使漂浮 / 实行 | 值来控制集群资源的非比例共享。 默认值为 1.0。 |
| minSharePreemptionTimeout | 整数 / 完整物 / 统一体 | 如果池的共享低于最小共享,则在终止其他池的任务之前等待的秒数。 |
| maxRunningJobs | 整数 / 完整物 / 统一体 | 用户并发运行的最大作业数。 默认值为无限制。 |
| poolMaxJobsDefault | 整数 / 完整物 / 统一体 | 池的默认最大并发运行作业数。 |
| userMaxJobsDefault | 整数 / 完整物 / 统一体 | 用户并发运行的默认最大作业数。 |
| defaultMinSharePreemptionTimeout | 整数 / 完整物 / 统一体 | 当池的共享低于最小共享时,在终止其他池的任务之前等待的默认秒数。 |
| fairSharePreemptionTimeout | 整数 / 完整物 / 统一体 | 当作业的资源低于公平份额的一半时的抢占时间。 |
| defaultPoolSchedulingMode | 公平/先进先出 | 默认池内计划模式。 |
另请参阅
- 配置 CapacityScheduler配方
- 参考http://hadoop.apache.org/docs/r1.1.2/fair_scheduler.html
配置 Hadoop 守护程序日志记录
系统日志记录在处理性能和安全问题方面扮演着重要角色。 此外,日志记录信息可用于分析调优 Hadoop 集群的性能。 在本食谱中,我们将向您展示如何配置 Hadoop 日志记录。
做好准备
我们假设我们的 Hadoop 集群已经正确配置。
怎么做……
执行以下步骤以配置 Hadoop 日志记录:
-
从 Hadoop 管理员机器使用以下命令登录到主节点:
ssh hduser@master -
Check the current logging level of JobTracker with the following command:
hadoop daemonlog -getlevel master:50030 org.apache.hadoop.mapred.JobTracker我们将得到类似于以下内容的输出:
Connecting to http://master:50030/logLevel?log=org.apache.hadoop.mapred.JobTracker Submitted Log Name: org.apache.hadoop.mapred.JobTracker Log Class: org.apache.commons.logging.impl.Log4JLogger Effective level: INFO -
Tell Hadoop to only log error events for JobTracker using the following command:
hadoop daemonlog -setlevel master:50030 org.apache.hadoop.mapred.JobTracker ERROR我们将得到类似于以下内容的输出:
Connecting to http://master:50030/logLevel?log=org.apache.hadoop.mapred.JobTracker&level=ERROR Submitted Log Name: org.apache.hadoop.mapred.JobTracker Log Class: org.apache.commons.logging.impl.Log4JLogger Submitted Level: ERROR Setting Level to ERROR ... Effective level: ERROR现在,JobTracker 守护进程的日志记录状态将类似于以下内容:
Connecting to http://master:50030/logLevel?log=org.apache.hadoop.mapred.JobTracker Submitted Log Name: org.apache.hadoop.mapred.JobTracker Log Class: org.apache.commons.logging.impl.Log4JLogger Effective level: ERROR -
Get the log levels for TaskTracker, NameNode, and DataNode with the following commands:
hadoop daemonlog -getlevel master:50030 org.apache.hadoop.mapred.TaskTracker hadoop daemonlog -getlevel master:50070 org.apache.hadoop.dfs.NameNode hadoop daemonlog -getlevel master:50070 org.apache.hadoop.dfs.DataNode我们将获得以下输出:
Connecting to http://master:50030/logLevel?log=org.apache.hadoop.mapred.TaskTracker Submitted Log Name: org.apache.hadoop.mapred.TaskTracker Log Class: org.apache.commons.logging.impl.Log4JLogger Effective level: WARN Connecting to http://master:50070/logLevel?log=org.apache.hadoop.dfs.NameNode Submitted Log Name: org.apache.hadoop.dfs.NameNode Log Class: org.apache.commons.logging.impl.Log4JLogger Effective level: INFO Connecting to http://master:50070/logLevel?log=org.apache.hadoop.dfs.DataNode Submitted Log Name: org.apache.hadoop.dfs.DataNode Log Class: org.apache.commons.logging.impl.Log4JLogger Effective level: INFO
它是如何工作的.
默认情况下,Hadoop 会将日志消息发送到文件$HADOOP_HOME/conf/log4j.properties中配置的Log4j。 该文件定义了要记录的内容和要记录的位置。 对于应用,默认的根记录器是INFO,console,它记录控制台的stderr级别以上的 INFO 级别的所有消息。 日志文件命名为$HADOOP_LOG_DIR/hadoop-$HADOOP_IDENT_STRING-<hostname>.log。
Hadoop 支持多种不同用途的日志级别。 日志级别应根据日志记录的目的进行调整。 例如,如果我们正在调试一个守护进程,我们可以将其日志记录级别设置为DEBUG,而不是其他级别。 使用详细日志级别可以提供更多信息,但另一方面会给集群带来开销。
下表显示了 Log4j 提供的所有日志记录级别:
|日志级别
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| ALL | 最低日志记录级别,则所有日志记录都将打开。 |
| DEBUG | 记录事件对于调试应用很有用。 |
| ERROR | 记录错误事件,但应用可以继续运行。 |
| FATAL | 记录将中止应用的非常严重的错误事件。 |
| INFO | 记录指示应用进度的信息性消息。 |
| OFF | 日志记录将被关闭。 |
| TRACE | 记录更多指状事件以进行应用调试。 |
| TRACE_INT | 在TRACE级别记录整数值。 |
| WARN | 记录潜在有害事件。 |
我们可以使用以下命令获取daemonlog的用法:
hadoop daemonlog
用法消息如下所示:
USAGES:
java org.apache.hadoop.log.LogLevel -getlevel <host:port> <name>
java org.apache.hadoop.log.LogLevel -setlevel <host:port> <name> <level>
还有更多...
除了从命令行动态配置 Hadoop 日志记录之外,我们还可以使用配置文件对其进行配置。 我们需要配置的最重要的文件是$HADOOP/conf/hadoop-env.sh。
有时,出于公司审计的目的,审计日志记录是可取的。 Hadoop 使用INFO日志记录级别通过 Log4j 提供审核日志记录。 在下一个菜谱中,我们将向您展示如何配置 Hadoop 审计日志。
使用 hadoop-env.sh 配置 Hadoop 日志记录
用文本编辑器打开文件$HADOOP_HOME/conf/hadoop-env.sh,并更改以下行:
# export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
我们将前面的命令更改为以下命令:
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
通过更改以下行将日志记录目录配置为/var/log/hadoop:
export HADOOP_LOG_DIR=/var/log/hadoop
此外,下表显示了我们可以为 Hadoop 日志记录配置的其他环境变量:
|变量名
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| HADOOP_LOG_DIR | 日志文件的目录。 |
| HADOOP_PID_DIR | 存储服务器的 PID 的目录。 |
| HADOOP_ROOT_LOGGER | hadoop.root.logger. default、"INFO,console"的日志记录配置 |
| HADOOP_SECURITY_LOGGER | hadoop.security.logger. default、"INFO,NullAppender"的日志记录配置 |
| HDFS_AUDIT_LOGGER | hdfs.audit.logger. default、"INFO,NullAppender"的日志记录配置 |
需要重新启动集群才能使配置生效。
配置 Hadoop 安全日志记录
安全日志可以帮助 Hadoop 集群管理员识别安全问题。 默认情况下,它处于启用状态。
安全日志配置位于文件$HADOOP_HOME/conf/log4j.properties中。 默认情况下,安全日志记录信息附加到与 NameNode 日志记录相同的文件中。 我们可以使用以下命令检查安全日志:
grep security $HADOOP_HOME/logs/hadoop-hduser-namenode-master.log
输出类似于以下内容:
2013-02-28 13:36:01,008 ERROR org.apache.hadoop.security.UserGroupInformation: PriviledgedActionException as:hduser cause:org.apache.hadoop.hdfs.server.namenode.SafeModeException: Cannot create file/user/hduser/test. Name node is in safe mode.
错误消息告知 NameNode 处于安全模式,因此无法创建文件/user/hduser/test。 类似的信息可以给我们一个非常有用的提示,帮助我们找出操作错误。
Hadoop 日志记录文件命名约定
Hadoop 日志文件保存在目录$HADOOP_HOME/logs下。 主节点上此目录的树结构如下所示:
logs
├── hadoop-hduser-namenode-master.log
├── hadoop-hduser-namenode-master.out
├── hadoop-hduser-jobtracker-master.log
├── hadoop-hduser-jobtracker-master.out
├── hadoop-hduser-secondarynamenode-master.log
├── hadoop-hduser-secondarynamenode-master.out
├── history
│ ├── done
│ ├── job_201302262311_0180_1362011591521_hduser_TableJoin
│ └── job_201302262311_0180_conf.xml
└── job_201302281211_0006_conf.xml
6 directories, 9 files
在从节点上,$HADOOP_HOME/logs文件夹将包含类似于以下内容的内容:
logs
├── hadoop-hduser-datanode-slave1.log
├── hadoop-hduser-datanode-slave1.out
├── hadoop-hduser-tasktracker-slave1.log
├── hadoop-hduser-tasktracker-slave1.out
└── userlogs
└── job_201302281211_0007
├── attempt_201302281211_0007_m_000003_0 -> /tmp/hadoop-hduser/mapred/local/userlogs/job_201302281211_0007/attempt_201302281211_0007_m_000003_0
├── attempt_201302281211_0007_m_000007_0 -> /tmp/hadoop-hduser/mapred/local/userlogs/job_201302281211_0007/attempt_201302281211_0007_m_000007_0
└── job-acls.xml
4 directories, 5 files
该文件夹包含每个 Hadoop 守护进程的一个.log文件和一个.out文件,例如,主节点上的 NameNode、Second daryNameNode 和 JobTracker,以及从节点上的 TaskTracker 和 DataNode。 .out文件在启动守护进程时使用。 守护进程成功启动后,其内容将被清空。 .log文件包含守护进程的所有日志消息,包括启动日志消息。
在主节点上,日志目录包含一个history文件夹,其中包含 MapReduce 作业历史记录的日志。 类似地,在从节点上,logs目录包含一个userlogs目录,该目录维护在该节点上运行的任务的历史信息。
在 Hadoop 中,日志文件的名称使用以下格式:
hadoop-<username>-<daemonname>-<hostname>.log
另请参阅
- 配置 Hadoop 审核日志记录配方
- 参考http://wiki.apache.org/hadoop/HowToConfigure
配置 Hadoop 审核日志记录
Hadoop 等数据处理系统可能需要审计****日志记录。 在 Hadoop 中,审计日志记录是在INFO日志级别使用 Log4j Java 日志记录库实现的。 默认情况下,Hadoop 审核日志记录处于禁用状态。 本食谱将指导您完成配置 Hadoop 审计日志记录的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置。
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
执行以下步骤以配置 Hadoop 审核日志记录:
-
Enable audit logging by changing the following line in the
$HADOOP_HOME/conf/log4j.propertiesfile from:log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=WARN至以下各项:
log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=INFO -
尝试使用以下命令在 HDFS 上创建目录:
hadoop fs -mkdir audittest -
Check the audit log messages in the NameNode log file with the following command:
grep org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit $HADOOP_HOME/logs/hadoop-hduser-namenode-master.log我们将得到类似于以下内容的输出:
2013-02-28 13:38:04,235 INFO org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit: ugi=hduser ip=/10.0.0.1 cmd=mkdirs src=/user/hduser/audittest dst=null perm=hduser:supergroup:rwxr-xr-xHadoop NameNode 负责管理审计日志记录消息,这些消息被转发到 NameNode 日志记录工具。 因此,到目前为止,我们看到的是审核日志记录消息与正常日志记录消息混合在一起。
-
通过使用以下内容配置文件
$HADOOP_HOME/conf/log4j.properties,我们可以将审核日志记录消息与 NameNode 日志记录消息分开:# Log at INFO level, SYSLOG appenders log4j.logger.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=INFO # Disable forwarding the audit logging message to the NameNode logger. log4j.additivity.org.apache.hadoop.hdfs.server.namenode.FSNamesystem.audit=false ################################ # Configure logging appender ################################ # # Daily Rolling File Appender (DRFA) log4j.appender.DRFAAUDIT=org.apache.log4j.DailyRollingFileAppender log4j.appender.DRFAAUDIT.File=$HADOOP_HOME/logs/audit.log log4j.appender.DRFAAUDIT.DatePattern=.yyyy-MM-dd log4j.appender.DRFAAUDIT.layout=org.apache.log4j.PatternLayout log4j.appender.DRFAAUDIT.layout.ConversionPattern=%d{ISO8601} %p %c: %m%n
它是如何工作的.
Hadoop 记录审核操作的消息,例如在配置的日志文件中创建、更改或删除文件。 默认情况下,审核日志记录设置为WARN,这将禁用审核日志记录。 要启用它,需要将日志记录级别更改为INFO。
当 Hadoop 集群有许多作业要运行时,日志文件可能会很快变大。 日志文件轮换是一种功能,它定期将日志文件轮换到不同的名称,例如,通过将日期附加到文件名,以便可以将原始日志文件名用作空文件。
另请参阅
- 配置 Hadoop 守护进程日志记录配方
升级 Hadoop
Hadoop 集群需要在发布带错误修复或新功能的新版本时升级。 在本食谱中,我们将概述将 Hadoop 集群升级到较新版本的步骤。
做好准备
从 apache 镜像站点下载所需的 Hadoop 版本:http://www.apache.org/dyn/closer.cgi/hadoop/common/。 在本书中,我们假设将 Hadoop 从版本 1.1.2 升级到版本 1.2.0,在撰写本书时,该版本仍处于测试状态。
我们假设集群中没有正在运行或挂起的 MapReduce 作业。
提示
在升级 Hadoop 集群的过程中,我们希望最大限度地减少对 HDFS 上存储的数据的破坏,而这一过程是导致大多数升级问题的原因。 数据损坏可能由人为操作或软件和硬件故障造成。 因此,可能需要备份数据。 但是,HDFS 上的数据量对于大多数升级体验来说都可能是一个令人头疼的问题。
一种更实用的方法是只备份主节点上的 HDFS 文件系统元数据,而保持数据块不变。 如果某些数据块在升级后丢失,Hadoop 可以从其他备份复制中自动恢复。
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
执行以下步骤升级 Hadoop 集群:
-
使用以下命令停止集群:
stop-all.sh -
Back up block locations of the data on HDFS with the
fsckcommand:hadoop fsck / -files -blocks -locations > dfs.block.locations.fsck.backup生成的文件
dfs.block.locations.fsck.backup将包含 HDFS 文件系统上每个数据块的位置。 -
使用以下命令保存 HDFS 文件系统上所有文件的列表:
hadoop dfs -lsr / > dfs.namespace.lsr.backup -
使用以下命令保存 HDFS 集群中每个 DataNode 的描述:
hadoop dfsadmin -report > dfs.datanodes.report.backup -
使用以下命令将检查点文件复制到备份目录:
sudo cp dfs.name.dir/edits /backup sudo cp dfs.name.dir/image/fsimage /backup -
使用以下命令验证是否没有 DataNode 守护程序正在运行:
for node in 'cat $HADOOP_HOME/conf/slaves' do echo 'Checking node ' $node ssh $node -C "jps" done -
If any DataNode process is still running, kill the process with the following command:
ssh $node -C "jps | grep 'DataNode' | cut -d'\t' -f 1 | xargs kill -9 "提示
仍在运行的 DataNode 如果未终止更新,可能会导致更新失败,因为旧版本的 DataNode 可能会注册到新版本的 NameNode,从而导致兼容性问题。
-
使用以下命令解压缩 Hadoop 存档文件:
sudo mv hadoop-1.2.0.tar.gz /usr/local/ sudo tar xvf hadoop-1.2.0.tar.gz -
Copy the configuration files from the old configuration directory to the new one using the following command:
sudo cp $HADOOP_HOME/conf/* /usr/local/hadoop-1.2.0/conf/*如有必要,您可以对配置文件进行更改。
-
使用以下命令将 Hadoop 符号链接更新为 Hadoop 版本:
```sh
sudo rm -rf /usr/local/hadoop
sudo ln -s /usr/local/hadoop-1.2.0 /usr/local/hadoop
```
- 使用以下命令在从节点中升级:
```sh
for host in 'cat $HADOOP_HOME/conf/slaves'
do
echo 'Configuring hadoop on slave node ' $host
sudo scp -r /usr/local/hadoop-1.2.0 hduser@$host:/usr/local/
echo 'Making symbolic link for Hadoop home directory on host ' $host
sudo ssh hduser@$host -C "ln -s /usr/local/hadoop-1.2.0 /usr/local/hadoop"
done
```
- Upgrade the NameNode with the following command:
```sh
hadoop namenode -upgrade
```
此命令将检查点转换为新版本格式。 我们需要等一等才能让它结束。
- 使用以下命令启动 HDFS 集群:
```sh
start-dfs.sh
```
- Get the list of all files on HDFS and compare its difference with the backed up one using the following commands:
```sh
hadoop dfs -lsr / > dfs.namespace.lsr.new
diff dfs.namespace.lsr.new dfs.namespace.lsr.backup
```
如果升级过程中没有错误,这两个文件应该具有相同的内容。
- Get a new report of each DataNode in the cluster and compare the file with the backed up one using the following command:
```sh
hadoop dfsadmin -report > dfs.datanodes.report.new
diff dfs.datanodes.report.1.log dfs.datanodes.report.backup
```
如果没有错误,这两个文件应该具有相同的内容。
- Get the locations of all data blocks and compare the output with the previous backup using the following commands:
```sh
hadoop fsck / -files -blocks -locations > dfs.block.locations.fsck.new
diff dfs.locations.fsck.backup dfs.locations.fsck.new
```
此命令的结果应该告诉我们,数据块位置应该是相同的。
- 使用以下命令启动 MapReduce 集群:
```sh
start-mapred.sh
```
现在,我们可以通过运行示例 MapReduce 作业(如teragen和terasort)或使用 Web 用户界面来检查集群的状态。
它是如何工作的.
我们可以使用以下命令获取 HDFS 升级命令的用法:
hadoop dfsadmin
我们将得到类似于以下内容的输出:
Usage: java DFSAdmin
[-report]
[-safemode enter | leave | get | wait]
[-saveNamespace]
[-refreshNodes]
[-finalizeUpgrade]
[-upgradeProgress status | details | force]
[-metasave filename]
[-refreshServiceAcl]
[-refreshUserToGroupsMappings]
[-refreshSuperUserGroupsConfiguration]
[-setQuota <quota> <dirname>...<dirname>]
[-clrQuota <dirname>...<dirname>]
[-setSpaceQuota <quota> <dirname>...<dirname>]
[-clrSpaceQuota <dirname>...<dirname>]
[-setBalancerBandwidth <bandwidth in bytes per second>]
[-help [cmd]]
下表列出了命令选项的含义:
|选择 / 选择权 / 购买权 / 期权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| -report | 报告文件系统信息和统计信息。 |
| -saveNamespace | 将文件系统元数据的快照保存到配置的目录中。 |
| -finalizeUpgrade | 完成 HDFS 的升级;此命令将导致 DataNode 删除以前版本的工作目录。 |
| -metasave | 保存 HDFS 集群的元数据。 |
另请参阅
- 第 3 章、配置 Hadoop 集群的在伪分布式模式下配置 Hadoop配方
- 第 3 章、配置 Hadoop 集群的在完全分布式模式下配置 Hadoop配方
- 第 3 章,配置 Hadoop 集群的验证 Hadoop 安装*配方**
五、增强 Hadoop 集群
在本章中,我们将介绍:
- 配置服务级别身份验证
- 使用 ACL 配置作业授权
- 使用 Kerberos 保护 Hadoop 集群
- 配置 Web 用户界面身份验证
- 从 NameNode 故障中恢复
- 配置 NameNode 高可用性
- 配置 HDFS 联合
简介
Hadoop 集群的安全性对其可用性至关重要。 加强 Hadoop 集群包括配置对资源(如作业、队列和各种管理服务)的访问控制。 我们将引入 NameNodeHigh Availability(HA)来解决单节点故障问题。 最后,我们将介绍 Hadoop 联合,它联合多台机器来扩展集群的容量。
配置服务级别身份验证
服务级身份验证(SLA)的目的是确保 Hadoop 用户拥有访问某些服务的适当权限。 此配置的一个用例是控制可以使用集群的允许用户列表。 这是通过 Hadoop 中的访问控制列表(ACL)强制执行的。 在本食谱中,我们将列出配置 SLA 的步骤。
做好准备
在开始之前,我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从管理员机器登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置 Hadoop SLA:
-
Enable SLA by opening the
$HADOOP_HOME/conf/core-site.xmlfile and add or change thehadoop.property.authorizationvalue to betrue, as shown in the following snippet:<property> <name>hadoop.property.authorization</name> <value>true</name> </property>备注
默认情况下,Hadoop 集群的 SLA 处于禁用状态。
-
Allow only specific users to submit jobs to the Hadoop cluster by adding or changing the following property in the
$HADOOP_HOME/conf/hadoop-policy.xmlfile:<property> <name>security.job.submission.protocol.acl</name> <value>hduser hadoop</name> </property>备注
此配置仅允许用户
hduser和组hadoop向 Hadoop 集群提交作业。 -
Allow only specific users and groups to talk to HDFS by opening the
$HADOOP_HOME/conf/hadoop-policy.xmlfile and add the following property:<property> <name>security.client.protocol.acl</name> <value>hduser,hdadmin hadoop</name> </property>备注
此配置仅允许用户
hduser和hdadmin以及组hadoop访问 HDFS -
Allow only specific DataNodes to communicate with the NameNode by changing the
security.datanode.protocol.aclproperty in the$HADOOP_HOME/conf/hadoop-policy.xmlfile similar to the following code:<property> <name>security.datanode.protocol.acl</name> <value>datanode</name> </property>备注
此配置仅允许作为属于组
datanode的用户运行的 DataNode 实例与集群中的 NameNode 通信。 -
Force the NameNode to reload the ACL configurations with the following command:
hadoop dfsadmin -refreshServiceAcl备注
此命令将强制从
policy文件重新加载与 HDFS 相关的 ACL。 -
使用以下命令强制 JobTracker 重新加载服务 ACL 配置:
hadoop mradmin -refreshServiceAcl
它是如何工作的.
属性(如security.namenode.protocol.acl)的值是逗号分隔的用户列表和组的逗号分隔列表。 用户列表和组列表由空格分隔。 例如,值的通用格式应类似于以下内容:
<value>user1,user2,user3 group1,group2</value>
还有更多...
除了我们在本食谱中提到的三个属性外,Hadoop 中还提供了许多其他 ACL 属性。 下表显示了这些属性的含义:
|性质 / 财产 / 所有权
|
服务描述
|
| --- | --- |
| security.client.protocol.acl | 客户端对 HDFS 的访问 |
| security.client.datanode.protocol.acl | 用于数据块恢复的客户端到数据节点 |
| security.inter.datanode.protocol.acl | 数据节点到数据节点更新时间戳 |
| security.inter.tracker.protocol.acl | TaskTracker 到 JobTracker |
| security.job.submission.protocol.acl | 用于作业提交、查询等的 JobTracker 客户端 |
| security.task.umbilical.protocol.acl | 有关映射和减少任务的信息,请联系 TaskTracker |
| security.refresh.policy.protocol.acl | Dfsadmin 和 mradmin 刷新 ACL 策略 |
这些属性的默认值是*,这意味着所有实体都可以访问该服务,换句话说,SLA 被禁用。
另请参阅
- 第 5 章,加强 Hadoop 集群中的使用 ACL配方配置作业授权
- http://hadoop.apache.org/docs/r1.1.2/service_level_auth.html#Enable+Service+Level+Authorization
使用 ACL 配置作业授权
Hadoop 提供两个级别的作业授权:作业级别和队列级别。 启用作业授权后,JobTracker 将对向集群提交作业的用户进行身份验证。 用户对作业和队列的操作也将由 JobTracker 进行身份验证。 在本食谱中,我们将展示使用 ACL 配置作业授权的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,没有任何问题。
使用以下命令从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置具有 ACL 的作业授权:
-
Enable job ACL authorization by adding the following property to the
$HADOOP_HOME/conf/mapred-site.xmlfile:<property> <name>mapred.acls.enabled</name> <value>true</name> </property>备注
此属性将启用队列 ACL 和作业 ACL。
-
Configure job authorization to only allow specific users and groups to submit jobs by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapred.queue.hdqueue.acl-submit-job</name> <value>hduser hadoop</name> </property>备注
此配置将仅允许用户
hduser和组hadoop向队列hdqueue提交作业。 -
Configure job authorization to allow specific users and groups to manage jobs in a named queue by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapred.queue.hdqueue.acl-administer-job</name> <value>hduser hadoop</name> </property>备注
此配置将仅允许用户
hduser和组hadoop管理队列hdqueue的作业。 -
Check the status of queue ACLs with the following command:
hadoop queue -showacls输出将类似于以下内容:
Queue acls for user : hduser Queue Operations ===================== default submit-job,administer-jobs hdqueue submit-job,administer-jobs -
Configure job authorization to allow only specific users and groups to view the status of a job by adding the following property to the
$HADOOP_HOME/conf/mapred-queue-acls.xmlfile:<property> <name>mapreduce.job.acl-view-job</name> <value>hduser hadoop</name> </property>提示
与队列级别 ACL 不同,作业级别 ACL 为所有提交的作业指定访问控制,而不考虑作业已提交到的队列。
-
通过将以下属性添加到
$HADOOP_HOME/conf/mapred-queue-acls.xml文件,将作业授权配置为仅允许特定用户和组修改作业:<property> <name>mapreduce.job.acl-modify-job</name> <value>hduser hadoop</name> </property> -
使用以下命令强制 NameNode 和 JobTracker 重新加载 ACL 配置:
hadoop dfsadmin -refreshServiceAcl hadoop mradmin -refreshServiceAcl
它是如何工作的.
与前面配方中的 SLA 属性类似,mapred.queue.hdqueue.acl-submit-job等属性的值是一个逗号分隔的用户列表和一个逗号分隔的组列表。 用户列表和组列表由空格分隔。 例如,值的通用格式应类似于以下内容:
<value>user1,user2,user3 group1,group2</value>
提示
作业所有者、超级用户和向其提交作业的集群管理员将始终有权查看和修改作业。
作业视图 ACL 控制作业状态信息的访问,包括计数器、诊断信息、日志、作业配置等。
作业修改 ACL 可以与队列级 ACL 重叠。 发生这种情况时,如果用户已列在这两个 ACL 中的任何一个中,则将授予该用户的操作。
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置服务级别身份验证配方
- http://hadoop.apache.org/docs/r1.1.2/mapred_tutorial.html#Job+Authorization
- http://hadoop.apache.org/docs/r1.1.2/cluster_setup.html
使用 Kerberos 保护 Hadoop 集群
最新的 Hadoop 版本通过将Kerberos集成到 Hadoop 中添加了安全功能。 Kerberos 是一种网络身份验证协议,它为客户端/服务器应用提供强身份验证。 Hadoop 使用 Kerberos 保护数据免受意外和未经授权的访问。 它通过对底层的远程过程调用(RPC)进行身份验证来实现这一点。 在本食谱中,我们将概述为 Hadoop 集群配置 Kerberos 身份验证的步骤。
做好准备
Kerberos 是由麻省理工学院创建的。 它旨在通过使用密钥加密为客户端/服务器应用提供强身份验证。 Kerberos 协议要求客户端向服务器提供其身份,反之亦然。 当他们的身份被 Kerberos 证实后,他们的所有后续通信都将被加密。
在开始之前,我们假设我们的 Hadoop 已经正确配置,没有任何问题,并且所有 Hadoop 守护进程都在运行,没有任何问题。 在我们的 CentOS 计算机上,使用以下命令安装 Kerberos 软件包:
sudo yum install krb5-libs, krb5-server, krb5-workstation
在此之后,应该可以从命令行访问kadmin和kinit命令。
如果您还在使用 CentOS 或其他与 Red Hat 兼容的操作系统,我们需要从以下链接下载 Java Cryptoography Extension(JCE)无限强度管辖策略文件:
http://www.oracle.com/technetwork/java/javase/downloads/index.html
在网页底部,您应该会看到类似以下内容的选项:

根据您的 Java 版本,单击屏幕右侧的下载链接,我们可以使用java -version命令获取该链接。
怎么做……
使用以下步骤为 Hadoop 集群配置 Kerberos:
-
Start the Kerberos admin shell:
kadmin提示
如果您的帐户没有 root 访问权限,则需要使用
kadmin.local命令! -
在
kadminshell 中使用以下命令创建hduser主体:addprinc -randkey hduser/master.hdcluster.com@HDREALM -
在
kadmin外壳中使用以下命令创建 SPNEGO 的 HTTP 主体:addprinc -randkey HTTP/master.hdcluster.com@HDREALM -
使用以下命令创建包含
hduser实例和 HTTP 主体的keytab文件:xst -norandkey -k hduser.keytab hduser/master.hdcluster.com HTTP/master.hdcluster.com -
Show available
keytabfile entries with the following command:klist -e -k -t hduser.keytab输出将类似于以下内容:
Keytab name: WRFILE:hduser.keytab slot KVNO Principal ---- ---- --------------------------------------------------------------- 1 7 HTTP/master.hdcluster.com@HDREALM (DES cbc mode with CRC-32) 2 7 HTTP/master.hdcluster.com@HDREALM (Triple DES cbc mode with HMAC/sha1) 3 7 hduser/master.hdcluster.com@HDREALM (DES cbc mode with CRC-32) 4 7 hduser/master.hdcluster.com@HDREALM (Triple DES cbc mode with HMAC/sha1) -
使用以下命令将
keytab文件移动到 Hadoop 配置目录:cp *.keytab $HADOOP_HOME/conf -
使用以下内容更改
hduser``keytab文件的所有者:sudo chown hduser:hadoop $HADOOP_HOME/conf/hduser.keytab -
Change the permission of the
keytabfiles with:sudo chmod 400 $HADOOP_HOME/conf/*.keytab备注
只有所有者才能读取
keytab文件。 -
使用
for node in `cat $HADOOP_HOME/conf/slaves`; do echo 'Copying keytab files to ' $host scp $HADOOP_HOME/conf/*.keytab $host:$HADOOP_HOME/conf/ done将所有
kaytab文件复制到从节点 -
使用以下命令停止集群:
```sh
stop-all.sh
```
- 使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/core-site.xml文件,并向该文件添加以下行:
```sh
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.use-weak-http-crypto</name>
<value>false</value>
</property>
```
- 使用您最喜欢的文本编辑器打开
$HADOOP_HOME/conf/hdfs-site.xml文件,并在文件中添加以下行:
```sh
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.http.address</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>master.hdcluster.com:50090</value>
</property>
<property>
<name>dfs.datanode.data.dir.perm</name>
<value>700</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
```
- 通过向
$HADOOP_HOME/conf/hdfs-site.xml文件添加以下属性来启用 webHDFS:
```sh
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
```
- 通过将以下两个属性添加到
$HADOOP_HOME/conf/hdfs-site.xml文件来配置 Kerberos Web 身份验证:
```sh
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>$HADOOP_HOME/conf/HTTP.keytab</value>
</property>
```
- Start the cluster with the following command:
```sh
start-all.sh
```
我们将收到类似以下内容的日志消息:
```sh
13/02/25 10:19:02 INFO security.UserGroupInformation:
Login successful for user hduser/master.hdcluster.com@HDREALM using keytab file /usr/local/hadoop/hduser.keytab
13/02/25 10:19:07 INFO http.HttpServer: Added global filtersafety (class=org.apache.hadoop.http.HttpServer$QuotingInputFilter)
13/02/25 10:19:12 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to getDelegationToken
13/02/25 10:19:15 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to renewDelegationToken
13/02/25 10:19:22 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to cancelDelegationToken
13/02/25 10:19:32 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to fsck
13/02/25 10:19:36 INFO http.HttpServer: Adding Kerberos (SPNEGO) filter to getimage
```
- 使用以下命令将一个简单的文本文件复制到 HDFS 中,以测试 Kerberos 配置:
```sh
hadoop fs -put $HADOOP_HOME/conf/slaves .
```
- 在 HDFS 目录上设置粘滞位,以防止未经授权的用户使用以下命令删除目录或文件:
```sh
sudo -u hdfs hadoop fs -chmod 1777 /tmp
```
- Verify the sticky bit setting with the following command:
```sh
hadoop fs -ls /
```
输出应类似于:
```sh
Found 2 items
drwxrwxrwt - hduser supergroup 0 2013-03-10 15:55 /tmp
drwxr-xr-x - hduser supergroup 0 2013-03-10 14:01 /user
```
- 通过将以下行添加到
$HADOOP_HOME/conf/mapred-site.xml文件来配置 MapReduce Kerberos 身份验证:
```sh
<property>
<name>mapreduce.jobtracker.kerberos.principal</name>
<value>hduser/master.hdcluster.com@HDREALM</value>
</property>
<property>
<name>mapreduce.jobtracker.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapreduce.tasktracker.kerberos.principal</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapreduce.tasktracker.keytab.file</name>
<value>$HADOOP_HOME/conf/hduser.keytab</value>
</property>
<property>
<name>mapred.task.tracker.task-controller</name>
<value>org.apache.hadoop.mapred.LinuxTaskController</value>
</property>
<property>
<name>mapreduce.tasktracker.group</name>
<value>hadoop</value>
</property>
```
- 创建包含以下内容的
$HADOOP_HOME/conf/taskcontrol.cfg文件:
```sh
mapred.local.dir=${hadoop.tmp.dir}/mapred/local
hadoop.log.dir=$HADOOP_HOME/logs
mapreduce.tasktracker.group=hduser
banned.users=
min.user.id=2000
```
- Change the ownership and permission of the
$HADOOP_HOME/conf/taskcontroller.cfgfile:
```sh
sudo chown root:mapred $HADOOP_HOME/conf/task-controller.cfg
sudo chmod 4754 $HADOOP_HOME/conf/task-controller.cfg
```
### 备注
修改后的权限应如下所示:
```sh
-rwsr-xr-- 1 hduser superuser 91886 2013-03-10 13:44 task-controller.cfg
```
- Start the MapReduce cluster with the following command:
```sh
start-mapred.sh
```
### 备注
我们应该能够获得类似于以下内容的日志记录消息:
```sh
13/02/26 12:25:02 INFO security.UserGroupInformation:
Login successful for user hduser/master.hdcluster.com@HDREALM using keytab file $HADOOP_HOME/conf/hduser.keytab.
```
- 通过使用以下命令运行示例 MapReduce 作业来测试 Kerberos 配置:
```sh
hadoop jar $HADOOP_HOME/hadoop-example*.jar pi 20 1000000
```
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 Web UI 身份验证配方
- http://en.wikipedia.org/wiki/SPNEGO
- HTTPS://ccp.cloudera.com/display/CDHDOC/Configuring+Hadoop+Security+in+CDH3+(SPNEGO)
- 从http://web.mit.edu/kerberos/获取有关 kerberos 的更多信息
配置 Web 用户界面身份验证
默认情况下,Hadoop 用户和管理员无需任何身份验证即可访问 Hadoop 守护进程的 Web UI。 可以将 Hadoop 守护程序 Web UI 配置为使用 Kerberos 对用户进行身份验证。 在本菜谱中,我们将概述配置用户身份验证以访问 Web UI 的步骤。
做好准备
我们假设我们的 Hadoop 已经正确配置,并且所有守护进程都在正常运行,没有任何问题。 我们还假设已经正确配置了 Kerberos 身份验证。
在本配方中,我们假设所有属性配置都将在$HADOOP_HOME/conf/core-site.xml文件上进行更改。
怎么做……
使用以下步骤配置 Web 用户界面身份验证:
-
使用以下命令停止集群:
stop-all.sh -
添加或更改以下属性:
<property> <name>hadoop.http.filter.initializers</name> <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value> </property> -
Change the HTTP authentication type by adding the following code:
<property> <name>hadoop.http.authentication.type</name> <value>kerberos</value> </property>提示
其他 HTTP 身份验证类型包括简单身份验证和用户自定义身份验证,可通过指定
AUTHENTICATION_HANDLER_CLASSNAME值选择这两种身份验证类型。 默认身份验证类型为简单。 -
Configure the authentication token's valid time length by changing the
hadoop.http.authentication.token.validityproperty to the following:<property> <name>hadoop.http.authentication.token.validity</name> <value>10000</value> </property>提示
该值的单位是秒。 此属性的默认值为
36000。 -
Configure the location of the
signature.secretfile, which will be used to sign the authentication tokens, by changing thehadoop.http.authentication.signature.secret.fileproperty similar to the following:<property> <name>hadoop.http.authentication.signature.secret.file</name> <value>$HADOOP_HOME/conf/http-auth.secret</value> </property>备注
如果未设置此属性,将在启动时生成随机的
secret文件。 用于保密的默认文件将是${user.name}/hadoop-auth-signature-secret。 -
Configure the domain name for HTTP cookies, which stores authentication tokens, by changing the
hadoop.http.authentication.cookie.domainproperty similar to the following:<property> <name>hadoop.http.authentication.cookie.domain</name> <value>hdcluster.com</value> </property>提示
警告!
此属性是 HTTP 身份验证正常工作所必需的。
-
通过更改类似于以下内容的
hadoop.http.authentication.kerberos.principal属性来配置 HTTP 端点的 Kerberos 主体:<property> <name>hadoop.http.authentication.kerberos.principal</name> <value>HTTP/master.hdcluster.com@HDREALM</value> </property> -
通过更改类似于以下内容的
hadoop.http.authentication.kerberos.keytab属性,为 HTTP 终结点的 Kerberos 主体配置keytab文件的位置:<property> <name>hadoop.http.authentication.kerberos.keytab</name> <value>${user.home}/kerberos.hadoop.keytab</value> </property> -
使用以下命令将配置同步到从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo "Copying Hadoop configration files to host: ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
使用以下命令启动 Hadoop 集群:
```sh
start-all.sh
```
- 通过打开 URL
master:50030/jobtracker.jsp验证配置。 - 或者,我们可以使用以下
curl命令测试我们的配置:
```sh
curl -v -u hduser --negotiate http://master:50030/jobtracker.jsp
```
它是如何工作的.
Web UI 身份验证是使用 HTTP SPNEGO 协议实现的。 SPNEGO代表简单且受保护的协商机制。 它是一种 GSSAPI 机制,用于协商多种可能的实际机制之一。 当客户端应用想要向远程服务器进行身份验证,但两端都不确定对方支持哪种身份验证协议时,可以使用 SPNEGO。
伪机制使用协议来确定哪些常见的 GSSAPI 机制可用,选择一个,然后将所有进一步的安全操作分派给它。 这可以帮助组织分阶段部署新的安全机制。
有关 SPNEGO 的更多信息,请参考到它的维基页面http://en.wikipedia.org/wiki/SPNEGO。
还有更多...
其他身份验证方法包括简单身份验证。 如果使用此身份验证方法,则必须在第一次浏览器交互中使用 URL 中的user.name参数指定用户名。 例如,我们需要打开 JobTracker URL:http://master:50030/jobtracker.jsp?user.name=hduser。
如果使用简单身份验证作为身份验证类型,则可以通过更改以下属性来配置匿名用户 Web 用户界面请求:
<property>
<name>hadoop.http.authentication.simple.anonymous.allowed</name>
<value>true</value>
</property>
另请参阅
- 第 5 章,加强 Hadoop 集群中的使用 Kerberos配方保护 Hadoop 集群
- http://hadoop.apache.org/docs/stable/HttpAuthentication.html
从 NameNode 故障中恢复
Hadoop 集群中的 NameNode 跟踪整个 HDFS 文件系统的元数据。 不幸的是,在撰写本书时,Hadoop 当前稳定版本中的 NameNode 是单点故障。 如果 NameNode 的元数据损坏(例如,由于硬盘故障),则整个集群将变得不可用。 因此,保护 NameNode 免受这些灾难性故障的影响非常重要。
我们可以通过多种方式提高 HDFS 集群的弹性。 在本食谱中,我们将向您展示如何将 Second NameNode 配置为备份 NameNode,以及如何从 NameNode 故障中恢复。
做好准备
我们假设 Hadoop 集群已经正确配置,我们有一台机器master1作为 NameNode,另一台机器master2运行 Second daryNameNode。
备注
请做好准备,NameNode 故障可能会导致集群暂停。 可能需要一些时间才能从故障中恢复过来。
怎么做……
我们要介绍的第一种方法是将 NameNode 配置为将编辑日志和文件系统映像写入两个位置-一个在 NameNode 机器的本地目录上,另一个在 Second daryNameNode 机器上。 这些目录使用 HDFS 属性dfs.name.dir指定。 我们可以使用以下步骤进行配置:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Configure the following property in the
$HADOOP_HOME/conf/hdfs-site.xmlfile:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name,/mnt/snn/name</value> </property>提示
在该属性中,我们为 NameNode 配置了两个要向其中写入元数据的目录。 第一目录
/hadoop/dfs/name是master1上的目录,第二目录/mnt/ssn/name是master2上的一个 NFS 共享目录/hadoop/dfs/name。 换句话说,我们正在配置两台机器master1和master2,使其具有相同的 NameNode 目录布局。为简单起见,我们不会在本食谱中向您展示 NFS 的配置。 有关此主题的更多信息,请访问http://www.tldp.org/HOWTO/NFS-HOWTO/
-
在
$HADOOP_HOME/conf/core-site.xml文件中配置以下属性:<property> <name>fs.default.name </name> <value>master1:54310</value> </property> -
使用以下命令将配置复制到
master2:scp $HADOOP_HOME/conf/hdfs-site.xml master2:$HADOOP_HOME/conf/ scp $HADOOP_HOME/conf/slaves master2:$HADOOP_HOME/conf/ -
使用以下命令将配置文件复制到集群中的所有从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
Start the Hadoop cluster in
master1with the following command:start-all.sh提示
在此配置中,我们实际上没有在 Second daryNameNode 机器
master2上启动任何守护进程。 我们只使用这台机器存储master1上 NameNode 的元数据文件。 一旦 NameNode 出现故障,我们可以很轻松地在master2上快速启动 NameNode。
一旦master1上的 NameNode 出现故障,我们可以使用以下步骤进行恢复:
-
使用以下命令登录到
master2:ssh hduser@master2 -
使用以下命令停止集群:
ssh master1 -C "stop-all.sh" -
通过向
$HADOOP_HOME/conf/core-site.xml文件添加以下属性,将其配置为使用master2作为 NameNode:<property> <name>fs.default.name </name> <value>master2:54310</value> </property> -
使用以下命令将配置复制到集群中的所有从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/core-site.xml $host:$HADOOP_HOME/conf done -
使用命令
start-all.sh启动 Hadoop 集群
它是如何工作的.
严格地说,HDFS Second daryNameNode 守护进程不是 NameNode。 它仅充当定期将文件系统元数据图像文件和编辑日志文件提取到属性fs.checkpoint.dir指定的目录的角色。 在 NameNode 出现故障的情况下,备份文件可用于恢复 HDFS 文件系统。
还有更多...
如前所述,NameNode 失败的主要原因是元数据文件损坏。 因此,NameNode 弹性的关键是元数据文件的恢复。 在这里,我们将介绍另外两种方法-一种是将元数据写入多个硬盘驱动器,另一种是从 Second daryNameNode 的检查点恢复。
具有多个硬盘的 NameNode 弹性
我们可以使用以下步骤配置具有多个硬盘的 NameNode:
-
将硬盘安装、格式化并挂载到机器上;假设挂载点为
/hadoop1/。 -
使用以下命令创建 Hadoop 目录:
mkdir /hadoop1/dfs/name -
Configure the following property in the
$HADOOP_HOME/conf/hdfs-site.xmlfile:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name,/hadoop1/dfs/name</value> </property>备注
在此配置中,我们添加了两个目录。 第一个是 Hadoop 的主目录。 第二个目录是单独硬盘驱动器上的目录。
我们可以使用以下步骤从 NameNode 故障中恢复:
-
使用以下命令停止 Hadoop 集群:
stop-all.sh -
在
$HADOOP_HOME/conf/hdfs-site.xml文件中配置以下属性:<property> <name>dfs.name.dir</name> <value>/hadoop1/dfs/name</value> </property> -
使用以下命令启动集群:
start-all.sh
从辅助 NameNode 的检查点恢复 NameNode
我们可以使用以下步骤配置 Second daryNameNode,并从 NameNode 故障中恢复:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Add the following line into the
$HADOOP_HOME/conf/mastersfile:master2备注
通过这样做,我们将其配置为在
master2上运行 Second daryNameNode。 -
在
$HADOOP_HOME/conf/hdfs-site.xml文件中配置以下属性:<property> <name>dfs.name.dir</name> <value>/hadoop/dfs/name</value> </property> -
使用以下命令将配置文件同步到集群中的从节点:
for host in `cat $HADOOP_HOME/conf/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_HOME/conf/hdfs-site.xml $host:$HADOOP_HOME/conf done -
使用以下命令启动集群:
start-all.sh
如果 NameNode 出现故障,我们可以使用以下步骤进行恢复:
-
使用以下命令停止集群:
stop-all.sh -
Prepare a new machine for running the NameNode.
备注
准备工作应包括正确配置 Hadoop。 建议新的 NameNode 计算机与出现故障的 NameNode 具有相同的配置。
-
使用以下命令格式化 NameNode:
hadoop fs -format -
使用以下命令配置 NameNode 版本号:
scp slave1:/hadoop/dfs/data/current/VERSION* /hadoop/dfs/name/current/VERSION -
使用以下命令从 Second daryNameNode 复制检查点映像:
scp master2:/hadoop/dfs/namesecondary/image/fsimage /hadoop/dfs/name/fsimage -
使用以下命令从 Second daryNameNode 复制当前编辑日志:
scp master2:/hadoop/dfs/namesecondary/current/* /hadoop/dfs/name/current -
使用以下命令将检查点转换为新版本格式:
hadoop namenode -upgrade -
使用以下命令启动集群:
start-all.sh
另请参阅
- 第 4 章,管理 Hadoop 集群中的管理 HDFS 集群配方
- 第 4 章,管理 Hadoop 集群中的管理 DataNode 守护进程配方
- https://issues.apache.org/jira/browse/HADOOP-2585
配置 NameNode 高可用性
在撰写本书时,Hadoop 稳定版本的 NameNode 是一个单点故障。 如果发生意外故障或定期维护,集群将变得不可用。 对于生产 Hadoop 集群来说,这是一个大问题。 在本食谱中,我们列出了配置 NameNode HA 的步骤。
为了使备用 NameNode 能够自动从活动 NameNode 故障中恢复,NameNode HA 实施要求备用 NameNode 的编辑日志始终与活动 NameNode 保持同步。 Hadoop HA 提供了两种方法来实现这一点。 一种基于仲裁,另一种基于使用 NFS 的共享存储。 在本食谱中,我们将只向您展示如何使用 Quorum 配置 HA。
做好准备
目前,Hadoop 版本 1.x.y(MRv1)不支持 NameNode HA,因此我们假设所有集群节点都已经安装了 Hadoop 版本 2.0.x(MRv2)。
提示
请注意,此 Hadoop 版本仍处于 Alpha 状态,因此不建议将其用于生产部署。 更多关于 mrv2 的开发情况,请参考官网:http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html。
我们假设有两个主节点,主机名为master1和master2,用于运行 NameNode 守护进程。
怎么做……
使用以下步骤配置 Hadoop NameNode HA:
-
使用以下命令登录其中一台 NameNode 计算机:
ssh hduser@master1 -
Configure a logical name service by adding the following property to the
$HADOOP_CONF_DIR/hdfs-site.xmlfile:<property> <name>dfs.nameservices</name> <value>hdcluster</value> </property>备注
我们假设所有后续配置都在
$HADOOP_CONF_DIR/hdfs-site.xml文件上进行更改。 -
Specify the NameNode IDs for the configured name service by adding the following property to the file:
<property> <name>dfs.ha.namenodes.hdcluster</name> <value>namenode1,namenode2</value> </property>备注
此属性使用属性
dfs.ha.namenodes.<nameservices>指定 NameNode ID。 例如,在上一步中,我们已经配置了名称服务hdcluster,因此这里的属性名称将是dfs.ha.namenodes.hdcluster。 在此属性中,我们为logic名称服务指定了namenode1和namenode2。当前 HA 实施最多只支持两个 NameNode。
-
Configure the RPC address for
namenode1on themaster1host by adding the following property:<property> <name>dfs.namenode.rpc-address.hdcluster.namenode1</name> <value>master1:54310</value> </property>备注
NameNode 的 MRv1 RPC 地址规范类似于 MRv2 中的规范。 它们都使用
host:port格式。 -
通过添加以下属性,在
master2主机上配置namenode2的 RPC 地址:<property> <name>dfs.namenode.rpc-address.hdcluster.namenode2</name> <value>master2:54310</value> </property> -
通过向文件中添加以下行来配置两个 NameNode 的 HTTP Web UI 地址:
<property> <name>dfs.namenode.http-address.hdcluster.namenode1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.http-address.hdcluster.namenode2</name> <value>master2:50070</value> </property> -
Configure the NameNode
shared editsdirectory by adding the following property to the file:<property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master1:8485;master1:8486;master2:8485/hdcluster</value> </property>备注
此属性为 Quorum 配置三个日志节点地址,以提供共享编辑存储。 共享编辑日志将由活动 NameNode 写入,并由备用 NameNode 读取。
-
Configure the Quorum
Journal Nodedirectory for storing edit logs in the local filesystem by adding the following property to the file:<property> <name>dfs.journalnode.edits.dir</name> <value>/hadoop/journaledits/</value> </property>备注
应该在每台 NameNode 计算机上配置此属性。
-
通过将以下行添加到文件来配置 NameNode HA 的代理提供程序:
<property> <name>dfs.client.failover.proxy.provider.hdcluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> -
Configure the
fencingmethod by adding the following property to the file:
```sh
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
```
### 提示
目前 NameNode HA 支持两种隔离方式,一种是`sshfence`,另一种是`shell`。 `sshfence`使用 SSH 登录到活动 NameNode 并终止进程,`shell`隔离使用常规 shell 命令来隔离活动 NameNode。 在这个配方中,我们假设使用`sshfence`方法。
- Configure the
private keyfile for thesshfencemethod by adding the following property to the file:
```sh
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>$HOME/.ssh/id_rsa</value>
</property>
```
### 提示
此属性的值应该是以逗号分隔的私钥文件列表。 为了使`sshfence`正常工作,我们正在配置私钥文件,以便它可以登录到目标节点,而无需提供释义。
- 通过将以下属性添加到文件来配置 SSH 连接超时(以毫秒为单位):
```sh
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>50000</value>
</property>
```
- Enable automatic failover by adding the following property to the file:
```sh
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
```
此配置将启用所有名称服务 ID 的自动故障转移。 如果我们要为特定的名称服务 ID(例如`hdcluster`)启用自动故障转移,我们可以配置以下属性:
```sh
<property>
<name>dfs.ha.automatic-failover.enabled.hdcluster</name>
<value>true</value>
</property>
```
- 通过将以下属性添加到
$HADOOP_CONF_DIR/core-site.xml文件来配置 ZooKeeper 服务:
```sh
<property>
<name>ha.zookeeper.quorum</name>
<value>master1:2181,master2:2181</value>
</property>
```
- 使用以下命令将配置同步到集群中的所有节点:
```sh
for host in cat $HADOOP_CONF_DIR/slaves; do
echo 'Sync configuration files to ' $host
scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/
scp $HADOOP_CONF_DIR/core-site.xml $host:$HADOOP_CONF_DIR/
done
```
- Initialize the ZooKeeper with the following command:
```sh
hdfs zkfc -formatZK
```
### 备注
此命令将在 ZooKeeper 中创建**Znode**,自动故障转移系统将在其中存储数据。
- Start the HDFS cluster with the following command:
```sh
start-dfs.sh
```
### 备注
此命令将在每台 NameNode 计算机上启动一个 ZKFC 守护进程,并在守护进程启动后选择活动的 NameNode。
或者,我们可以使用命令`hadoop-daemon.sh start zkfc`在每台 NameNode 机器上手动启动 ZKFC 守护进程。
我们可以使用以下步骤测试 NameNode HA 配置:
-
通过使用以下 URL 访问 NameNode Web 用户界面来检查 NameNode 的状态:
master1:50070 master2:50070 -
Assuming
master1has the active NameNode, we can get the NameNode process ID onmaster1with the following command:jps该命令将产生类似于以下内容的输出:
... 22459 NameNode ... -
Kill the NameNode process with the following command on
master1:kill -9 22459备注
如果备用 NameNode 自动成为活动 NameNode,并且 Hadoop 集群仍在工作,没有任何问题,则配置成功。
它是如何工作的.
Hadoop NameNode HA 是从版本 0.23.x 或 2.0.x 分支(MRv2)开始引入的。 目标是保证集群的可用性。 它使用集群中的两个 NameNode、一个活动 NameNode 和一个备用 NameNode 来解决该问题。 活动 NameNode 将提供与 MRv1 中的 NameNode 相同的服务。 与仅将 NameNode 映像和编辑日志复制到备份目录的 Second daryNameNode 不同,备用 NameNode 是活动 NameNode 的热备份节点。 如果活动 NameNode 出现故障,备用 NameNode 将在最短时间内成为活动节点。
还有更多...
在 NameNode HA 实现中,ZooKeeper 扮演着重要角色。 动物园管理员的安全可能是一个必要的问题。 我们可以使用以下步骤配置受保护的动物园管理员:
-
使用
ssh命令登录到master1机器。 -
Add the following property to the
$HADOOP_CONF_DIR/core-site.xmlfile:<property> <name>ha.zookeeper.auth</name> <value>@$HADOOP_CONF_DIR/zkauth.txt</value> </property>备注
此属性配置用于 ZooKeeper 身份验证的文件。 特殊符号
@指定配置指向文件,而不是内联。 该文件的内容应该类似于digest:zkuser:password,其中zkuser是 ZooKeeper 的用户,password是zkuser的密码。 -
Add the following property into the
$HADOOP_CONF_DIR/core-site.xmlfile for ZooKeeper access control:<property> <name>ha.zookeeper.acl</name> <value>@$HADOOP_CONF_DIR/zkacl.txt</value> </property>备注
与
ha.zookeeper.auth属性类似,值中的@字符指定configuration是磁盘上的文件。 -
Generate ZooKeeper ACL corresponding to the authentication with the following command:
java -cp $ZK_HOME/lib/*:$ZK_HOME/zookeeper-*.jar org.apache.zookeeper.server.auth.DigestAuthenticationProvider zkuser:password我们将得到类似于以下内容的输出:
zkuser:password->zkuser:a4XNgljR6VhODbC7jysuQ4gBt98= -
将加密密码添加到
$HADOOP_CONF_DIR/zkacl.txt文件:digest:zkuser:a4XNgljR6VhODbC7jysuQ4gBt98= -
使用以下命令将配置同步到
master2:scp $HADOOP_CONF_DIR/zkacl.txt master2:$HADOOP_CONF_DIR/ scp $HADOOP_CONF_DIR/zkauth.txt master2:$HADOOP_CONF_DIR/ -
使用以下命令格式化 ZooKeeper:
hdfs zkfc -formatZK -
Test the configuration with the following command:
zkCli.sh我们将得到类似于以下内容的输出:
[zk: master1:2181(CONNECTED) 1] getAcl /hadoop-ha'digest, zkuser: a4XNgljR6VhODbC7jysuQ4gBt98= : cdrwa -
使用以下命令重新启动集群:
start-dfs.sh
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 HDFS 联合配方
- http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithNF.html
配置 HDFS 联合
Hadoop NameNode 将元数据保存在主内存中。 当 HDFS 命名空间变大时,主内存可能成为集群的瓶颈。 在适用于 MRv2 的 Hadoop 中引入了 HDFS 联合。 它通过利用多个独立 NameNode 的容量来增加 NameNode 容量和吞吐量,每个 NameNode 托管或管理 HDFS 命名空间的一部分。
做好准备
目前,只有 Hadoop MRv2 支持 NameNode 联合,因此我们假设所有集群计算机上都正确配置了 Hadoop MRv2。
备注
我们假设所有配置都在对$HADOOP_CONF_DIR/hdfs-site.xml文件进行更改。
怎么做……
使用以下步骤配置 HDFS 联合:
-
使用以下命令登录到
master1:ssh hduser@master1 -
Specify a list of NameNode service IDs by adding the following lines into the file:
<property> <name>dfs.nameservices</name> <value>namenode1,namenode2</value> </property>备注
此属性的值是以逗号分隔的 NameNode 服务 ID 列表。 例如,在此步骤中,该值指定了两个 NameNode 服务:
namenode1和namenode2。 -
Configure the NameNode RPC and HTTP URI for
namenode1by adding the following into the file:<property> <name>dfs.namenode.rpc-address.namenode1</name> <value>master1:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode1</name> <value>master1:50071</value> </property>备注
前面的配置假设 NameNode 守护进程以及 NameNode HTTP 和辅助 HTTP 守护进程位于主机
master1上。 -
通过将以下内容添加到文件中,指定
namenode2的 NameNode RPC 和 HTTP URI:<property> <name>dfs.namenode.rpc-address.namenode2</name> <value> master2:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode2</name> <value> master2:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode2</name> <value>master2:50071</value> </property> -
使用以下命令将配置同步到集群中的所有节点:
for host in cat $HADOOP_CONF_DIR/slaves; do echo 'Sync configuration files to ' $host scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/ done -
Format
namenode1onmaster1with the following command:hdfs namenode -format -clusterId hdcluster备注
在此命令中,
-clusterId选项应该是环境中唯一的集群 ID。 如果未指定,将自动生成唯一的集群 ID。 -
Similarly, format
namenode2onmaster2with the following command:hdfs namenode -format -clusterId hdcluster提示
警告!
此 NameNode 的集群 ID 应与为
namenode1指定的集群 ID 相同,以便两个 NameNode 位于同一集群中。 -
现在,我们可以使用以下命令在任一 NameNode 主机上启动或停止 HDFS 集群:
start-dfs.sh stop-dfs.sh
它是如何工作的.
在非联合 HDFS 集群上,所有 DataNode 都向单个 NameNode 注册并向其发送心跳信号。 在联合 HDFS 集群上,所有 DataNode 都将注册到集群中的所有 NameNode,并且心跳和数据块报告将发送到这些 NameNode。
联合 HDFS 集群由一个或多个命名空间卷组成,命名空间卷由命名空间和属于该命名空间的数据块池组成。 命名空间卷是集群中的管理单位。 例如,集群管理操作(如delete和upgrade)将在命名空间卷上操作。 此外,联合 NameNode 可以为不同的应用或情况隔离名称空间。
下表显示了配置 NameNode 联合的属性:
|精灵 / 恶魔 / 守护进程 / 后台程序
|
性质 / 财产 / 所有权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| NameNode | dfs.namenode.rpc-address | 用于 NameNode RPC 与客户端的通信 |
| dfs.namenode.servicerpc-address | 用于与 HDFS 服务进行 NameNode RPC 通信 |
| dfs.namenode.http-address | NameNode HTTP Web 用户界面地址 |
| dfs.namenode.https-addressw | NameNode 安全的 HTTP Web 用户界面地址 |
| dfs.namenode.name.dir | NameNode 本地目录 |
| dfs.namenode.edits.dir | NameNode 编辑日志的本地目录 |
| dfs.namenode.checkpoint.dir | Second daryNameNode 本地目录 |
| dfs.namenode.checkpoint.edits.dir | Second daryNameNode 编辑日志的目录 |
| Second DaryNameNode | dfs.secondary.namenode.keytab.file | Second daryNameNodekeytab文件 |
| dfs.namenode.backup.address | 备份节点的地址 |
| 备份节点 | dfs.secondary.namenode.keytab.file | 备份节点\T0 文件 |
还有更多...
NameNode 联合 Hadoop 集群的管理任务与不支持联合的旧版本(MRv1)不同。
从集群中取消 NameNode
将 NameNode ID 添加到$HADOOP_CONF_DIR/namenode_exclude.txt文件中。 例如,如果我们想要从集群中停用namenode1,文件的内容应该是:
namenode1
使用以下命令将exclude文件分发给所有 NameNode:
distributed-exclude.sh $HADOOP_CONF_DIR/namenode_exlude.txt
使用以下命令刷新 NameNode 列表:
refresh-namenodes.sh
我们可以使用以下 URL 访问 HDFS 集群的 Web 用户界面:
http://namenode2:50070/dfsclusterhealth.jsp
运行平衡机
与旧的 Hadoop 版本类似,平衡器用于平衡集群上的数据块。 在 HDFS 联合 Hadoop 集群上,我们可以使用以下命令运行平衡器:
hadoop-daemon.sh --config $HADOOP_HOME/conf --script hdfs start balancer -policy node
此命令将在节点级别平衡数据块。 另一个平衡策略是blockpool,它在数据块池级别和数据节点级别平衡存储。
添加新的 NameNode
假设我们已经配置了一个由 NameNode 联合的 Hadoop 集群,其中有两个正在运行的 NameNode。 我们想要在主机master3上添加第三个 NameNodenamenode3。 我们可以使用以下步骤来完成此操作:
-
登录到新的 NameNode 计算机
master3。 -
在
master3节点上配置 MRv2。 -
将以下行添加到
$HADOOP_CONF_DIR/hdfs-site.xml文件中:<property> <name>dfs.nameservices</name> <value>namenode1,namenode2,namenode3</value> </property> <property> <name>dfs.namenode.rpc-address.namenode1</name> <value>master1:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode1</name> <value> master1:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode1</name> <value>master1:50071</value> </property> <property> <name>dfs.namenode.rpc-address.namenode2</name> <value>master2:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode2</name> <value> master2:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode2</name> <value>master2:50071</value> </property> <property> <name>dfs.namenode.rpc-address.namenode3</name> <value>master3:54310</value> </property> <property> <name>dfs.namenode.http-address.namenode3</name> <value> master3:50070</value> </property> <property> <name>dfs.namenode.secondaryhttp-address.namenode3</name> <value>master3:50071</value> </property> -
使用以下命令格式化
namenode3:hdfs namenode -format -cluserId hdcluster -
使用以下命令将配置同步到所有其他 NameNode:
scp $HADOOP_CONF_DIR/hdfs-site.xml master1:$HADOOP_CONF_DIR/ scp $HADOOP_CONF_DIR/hdfs-site.xml master2:$HADOOP_CONF_DIR/ -
使用以下命令将配置同步到集群中的所有从节点:
for host in `cat $HADOOP_CONF_DIR/slaves`; do echo 'Sync configuration files to ' $host scp $HADOOP_CONF_DIR/hdfs-site.xml $host:$HADOOP_CONF_DIR/ done -
使用以下命令启动 HDFS 集群:
start-dfs.sh -
使用以下命令将 NameNodes 的更改告知 DataNodes:
for slavehost in `$HADOOP_CONF_DIR/slaves`; do echo "Processing on host " $slavehost ssh $slavehost -C "hdfs dfsadmin -refreshNameNode master3:54310" done
另请参阅
- 第 5 章,加强 Hadoop 集群中的配置 NameNode 高可用性配方
- http://hadoop.apache.org/docs/r2.0.2-alpha/hadoop-yarn/hadoop-yarn-site/Federation.html
- http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml
- http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithQJM.html
六、监控 Hadoop 集群
在本章中,我们将介绍:
- 使用 JMX 监视 Hadoop 集群
- 使用 Ganglia 监视 Hadoop 集群
- 使用 Nagios 监视 Hadoop 集群
- 使用 Ambari 监视 Hadoop 集群
- 使用 Chukwa 监视 Hadoop 集群
简介
系统监控对于维护大型分布式系统(如 Hadoop)的健康和可用性至关重要。 常规监控任务包括监控集群节点和网络的健康状况,例如,内存、堆、CPU、网络等的使用情况。 对于 Hadoop 集群,我们可能还需要监视一些特定的指标,例如集群中作业和任务的状态、JobTracker、TaskTracker、NameNode 和 DataNode 的状态。
Hadoop 很幸运地出生在一个开放源码的世界! 许多非常稳定的开源系统监控工具正在等待加入 Hadoop 大家庭,其中许多系统已经被 Hadoop 用于监控目的。
在本章中,我们将首先介绍用于系统监控的管理框架Java Management Extension(JMX)。 接下来,我们将介绍两个著名的开源集群监控系统:Ganglia和Nagios。 Ganglia 是一个开源的可伸缩监控系统。 在监视主机上运行的监视守护程序将数据发送到监视服务器主机以进行存储、统计分析和可视化。 Nagios 是另一个著名的监控系统。 它使用插件监控集群中的主机。
接下来,我们将介绍特定于 Hadoop 的监视系统Ambari和Chukwa。 Ambari 旨在成为部署、管理和监控 Hadoop 集群的成熟系统。 它是基于 Ganglia 和 Nagios 的监控框架开发的。 但与 Ganglia 和 Nagios 不同的是,Apache Chukwa 通过分析从 Hadoop 集群收集的系统日志来监控 Hadoop 集群。 ApacheFlume是另一个用于流式传输数据(如系统日志)的通用数据分析框架。 它可以配置为进行系统监控,这与 Chukwa 类似。
使用 JMX 监控 Hadoop 集群
JMX 是 Java 用来构建、监视和管理分布式系统和网络应用的技术。 它已经从J2SEPlatform 5.0 并入 Java。 有关 jmx 的更多信息,请访问官方网站http://www.oracle.com/technetwork/java/javase/tech/javamanagement-140525.html。 在本食谱中,我们将概述使用 JMX 配置 Hadoop 集群监控的步骤。
提示
在本章中,我们假设监控 Hadoop 版本 1.1.y 或相应的 0.20.x Hadoop 版本。 监控 Hadoop 版本 2.0.x 或 0.23.x 的配置应该遵循食谱进行一些更改。
做好准备
我们假设已经安装了 Oracle JDK,并且我们的 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
怎么做……
使用以下步骤配置 JMX 以监视 Hadoop 集群:
-
使用以下命令创建用于远程监控的 JMX 密码文件:
cp $JAVA_HOME/jre/lib/management/jmxremote.password.template $HADOOP_HOME/conf/jmxremote.password -
Open the template password
$HADOOP_HOME/conf/jmxremote.passwordfile with a text editor and the last few lines of this file will be similar to the following:# Following are two commented-out entries. The “measureRole” role has # password “QED”. The “controlRole” role has password “R&D”. # # monitorRole QED # controlRole R&D删除突出显示的两行的注释符号
#。提示
这两行指定
monitorRole和controlRole的密码。 JMX 将在远程监控中使用它们进行身份验证。使用以下命令将密码文件的权限更改为
600:chmod 600 $HADOOP_HOME/conf/jmxremote.password提示
警告!
如果此文件过于打开,则在启动 Hadoop 集群守护程序时会出现类似以下内容的错误:
master: Error: Password file read access must be restricted: /usr/local/hadoop/conf/jmxremote.password -
使用文本编辑器打开
$HADOOP_HOME/conf/hadoop-env.sh文件。 -
In this file, we will be able to find JMX monitoring configurations for the Hadoop daemons including NameNode, SecondaryNameNode, DataNode, balancer, JobTracker, and TaskTracker. The default configuration will be similar to the following:
export HADOOP_NAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS” export HADOOP_SECONDARYNAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS” export HADOOP_DATANODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS” export HADOOP_BALANCER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS” export HADOOP_JOBTRACKER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS”现在,我们需要通过将原始配置更改为以下内容来配置 Hadoop 守护程序的远程监控端口:
# Extra Java runtime options. Empty by default. export HADOOP_OPTS=”-Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=$HADOOP_CONF_DIR/jmxremote.password” export HADOOP_NAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS -Dcom.sun.management.jmxremote.port=8004” export HADOOP_SECONDARYNAMENODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS -Dcom.sun.management.jmxremote.port=8005” export HADOOP_DATANODE_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS -Dcom.sun.management.jmxremote.port=8006” export HADOOP_BALANCER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS -Dcom.sun.management.jmxremote.port=8007” export HADOOP_JOBTRACKER_OPTS=”-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS -Dcom.sun.management.jmxremote.port=8008” export HADOOP_TASKTRACKER_OPTS=”-Dcom.sun.management.jmxremote.port=8009” -
Use the following command to start the monitor user interface:
jconsole我们可以看到一个类似于以下屏幕截图的窗口:
![How to do it...]()
在此窗口中,我们可以检查本地和远程进程的状态。 检查本地进程的状态相对简单。 首先,从进程列表中选择要检查的所需进程。 然后,我们只需单击连接按钮。 检查远程进程的状态相对复杂。 我们需要通过指定主机名和端口或协议和 SAP 来指定服务的位置,如屏幕截图所示。 出于验证目的,我们还需要输入用户名和密码值。 在以下步骤中,我们假设检查本地 JobTracker 进程的状态。
-
Select the Local Process radio button and then click on the Connect button. We can get a monitoring window after waiting for a few moments, as shown in the following screenshot:
![How to do it...]()
该窗口显示 JobTracker 的后台进程状态。 在窗口中,我们可以查看内存使用情况、线程、类、JVM 摘要以及 MBean 的详细信息。
-
Check the memory of the daemon by clicking on the Memory tab of the
jconsolewindow, and we will get a window similar to the following:![How to do it...]()
Memory 窗口以时间序列图的形式显示Heap Memory Usage页。 在此窗口中,我们可以从不同的图表和时间范围中选择要显示的内容。 窗口的底部是当前内存使用情况的摘要。
-
By clicking on the Threads tab of the window, we can check the running threads of the JobTracker and we can get a window similar to the following screenshot:
![How to do it...]()
窗口的上半部分显示峰值活动线程数和当前活动线程数。 在窗口的下部,我们可以看到一个线程列表,通过单击所需的线程名称可以查看这些线程的信息。
同样,我们可以通过单击窗口的Classs选项卡检查当前类,并通过单击窗口的VM Summary选项卡检查 JVM 虚拟机的摘要。
*** The MBeans tab is the most informative one if you want to check the status details of the daemon. For example, the following screenshot shows more metrics details for JobTracker:

从该窗口中,我们可以获得多个 JobTracker 指标,例如正在运行的作业的数量、映射和还原插槽的数量以及正在运行的映射和还原任务的数量。**
**## 另请参阅
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 参考http://docs.oracle.com/javase/tutorial/jmx/
- 请参考docs.oracle.com/javase/Tutorial/jmx/
使用 Ganglia 监视 Hadoop 集群
Ganglia是一个开源、可伸缩的分布式监控系统,用于集群和计算网格。 它有三个主要的组件:监控守护进程、元数据守护进程和Web UI。 在本食谱中,我们将概述为 Hadoop 集群监控配置 Ganglia 的步骤。
做好准备
使用以下命令从管理员计算机登录到主节点:
ssh hdadmin@master
使用以下yum命令在主计算机上安装 Ganglia:
sudo yum install -y ganglia-gmond ganglia-gmetad ganglia-web
使用以下命令在所有从节点上安装 Ganglia 监视守护进程:
for host in `cat $HADOOP_HOME/conf/slaves`
do
echo ‘Installing Ganglia on host ‘ $host
sudo ssh $host -C “yum install -y ganglia-gmond”
done
提示
在本配方中,我们假设 Ganglia 服务器将在主节点上运行,监视守护进程在主节点和从节点上运行。
怎么做……
使用以下步骤为 Hadoop 集群监视配置 Ganglia:
-
用文本编辑器打开
gmond配置文件/etc/ganglia/gmond.conf。 -
将
cluster属性更改为以下内容:cluster { name = “hadoop” owner = “hduser” latlong = “unspecified” url = “unspecified” } -
将
udp_send_channel属性更改为以下内容:udp_send_channel { bind_hostname = yes # mcast_join = 239.2.11.71 host = master port = 8649 ttl = 1 } -
Change the
udp_recv_channelattribute to the following:udp_recv_channel { # mcast_join = 239.2.11.71 port = 8649 # bind = 239.2.11.71 }提示
Hadoop 支持通过单播(使用普通 IP 地址,我们在这里使用的地址)和多播(使用多播地址,如
239.2.11.71)进行网络通信。 要使用组播,所有受监控的主机都应位于同一 IP 网段中。 在本书中,我们假定使用单播。 -
Add all the hostnames in the cluster to the
gmetadconfiguration/etc/ganglia/gmetad.conffile, for example, this file should contain the following:data_source “hdcluster” master:8649备注
这里
hdcluster是 Ganglia 监视的集群的名称,master:8649是gmetad的网络地址。 -
Open the
$HADOOP_HOME/conf/hadoop-metrics.propertiesfile with your favorite text editor and add the following contents into the file:jvm.class=org.apache.hadoop.metrics.ganglia.GangliaContext jvm.period=10 jvm.servers=master:8649前三行配置 JVM 监视。
rpc.class=org.apache.hadoop.metrics.ganglia.GangliaContext rpc.period=10 rpc.servers=master:8649前三行配置 RPC 监视。
dfs.class=org.apache.hadoop.metrics.ganglia.GangliaContext dfs.period=10 dfs.servers=master:8649前三行配置 HDFS 监视。
mapred.class=org.apache.hadoop.metrics.ganglia.GangliaContext mapred.period=10 mapred.servers=master:8649前三行配置为监视 MapReduce 指标。
hbase.class=org.apache.hadoop.metrics.ganglia.GangliaContext hbase.period=10 hbase.servers=master:8649前三行配置监视 HBase 指标。
提示
在前面的配置中,我们指定了三个公共参数:
class、period和servers。 参数class指定 Ganglia 将使用的消息格式(可以是GangliaContext或GangliaContext31);period指定两个连续度量更新之间的时间间隔,servers指定监视消息应该发送到的服务器列表。 -
使用以下命令将配置文件复制到所有从节点:
for host in cat $HADOOP_HOME/conf/slaves do echo ‘Copying ganglia monitoring configuration file to host’ $host; sudo scp /etc/ganglia/gmond.conf $host:/etc/ganglia/gmond.conf sudo scp /etc/ganglia/gmetad.conf $host:/etc/ganglia/gmetad.conf sudo scp $HADOOP_HOME/conf/hadoop-metrics.properties $host:$HADOOP_HOME/conf/hadoop-metrics.properties; done -
使用以下命令重新启动 Hadoop 集群:
stop-all.sh start-all.sh -
Start the
gmonddaemon with the following command on the master node:sudo service gmond start提示
如果希望该进程在系统重新启动后继续运行,请运行
sudo chkconfig gmondON 命令。 -
Check the status of
gmondwith the following command:
```sh
curl master:8649
```
此命令将输出 XML 格式的 Ganglia 配置,如下所示:
```sh
<GANGLIA_XML VERSION=”3.1.7” SOURCE=”gmond”>
<CLUSTER NAME=”hdcluster” LOCALTIME=”1363403519” OWNER=”hduser” LATLONG=”unspecified” URL=”hdcluster.com”>
<HOST NAME=”master” IP=”10.147.166.55” REPORTED=”1363403500” TN=”19” TMAX=”20” DMAX=”0” LOCATION=”unspecified” GMOND_STARTED=”1363403380”>
<METRIC NAME=”proc_run” VAL=”3” TYPE=”uint32” UNITS=” “ TN=”42” TMAX=”950” DMAX=”0” SLOPE=”both”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”process”/>
<EXTRA_ELEMENT NAME=”DESC” VAL=”Total number of running processes”/>
<EXTRA_ELEMENT NAME=”TITLE” VAL=”Total Running Processes”/>
</EXTRA_DATA>
</METRIC>
<METRIC NAME=”dfs.datanode.heartBeats_avg_time” VAL=”1.0” TYPE=”double” UNITS=”” TN=”2” TMAX=”60” DMAX=”0” SLOPE=”both”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”dfs.datanode”/>
</EXTRA_DATA>
</METRIC>
<METRIC NAME=”mapred.shuffleOutput.shuffle_output_bytes” VAL=”0” TYPE=”float” UNITS=”” TN=”1225” TMAX=”60” DMAX=”0” SLOPE=”positive”>
<EXTRA_DATA>
<EXTRA_ELEMENT NAME=”GROUP” VAL=”mapred.shuffleOutput”/>
</EXTRA_DATA>
</METRIC>
...
<EXTRA_ELEMENT NAME=”GROUP” VAL=”system”/>
<EXTRA_ELEMENT NAME=”DESC” VAL=”Operating system release date”/>
<EXTRA_ELEMENT NAME=”TITLE” VAL=”Operating System Release”/>
</EXTRA_DATA>
</METRIC>
</HOST>
</CLUSTER>
</GANGLIA_XML>
```
### 备注
突出显示的行显示 Ganglia 正在监视某些 HDFS 和 MapReduce 指标。
- 在主节点上使用以下命令启动
gmetad守护进程:
```sh
sudo service gmetad start
```
- 使用以下命令在所有从节点上启动
gmond:
```sh
for host in cat $HADOOP_HOME/conf/slaves
do
echo ‘Starting gmond service on host: ‘ $host;
sudo ssh $host -C “service gmond start”;
done
```
- Open the
/etc/httpd/conf.d/ganglia.conffile with your favorite text editor and add the following content:
```sh
<Location /ganglia>
Order deny,allow
Allow from all
</Location>
```
### 备注
该文件中的`access control`设置允许每个人访问 Ganglia web UI。 出于安全原因,我们可以使用配置中的`Allow from`和`Deny from`语句限制 IP 地址、主机或域。
- 使用以下命令启动
httpd守护进程:
```sh
sudo service httpd start
```
- Check the status of Ganglia by opening URL
http://master:80/ganglia, and we can get a web page similar to the following screenshot:

UI 的左上角是集群的摘要,包括主机数量、主机状态、平均负载等。
屏幕截图右上角的部分显示了整个集群的概况,包括集群总负载、CPU 使用率、内存和网络流量。 当一个`teragen`作业正在运行时,屏幕截图包含大约 20 分钟的明显跳转,这会消耗集群资源。
屏幕截图的下部显示集群中每个节点的状态,包括主节点和所有从节点。 我们可以通过从组合框中选择来更改要显示的指标,如以下屏幕截图所示:

例如,通过选择指标**DFS_datenode.bytes_Writed**,我们可以获得每个节点的以下屏幕截图:

前面的屏幕截图确认 DataNode 是存储数据块的实际位置,而 NameNode 只跟踪数据块的元数据。 因此,NameNode 的写入数据大小要小得多。
- Check the details of each cluster node by selecting the option from the combo box, which has the initial value of --Choose a Node. For example, if we want to check all the metric values for the master node, we will be able to get a web page similar to the following screenshot:

- By scrolling down the window, we can check the Hadoop JobTracker metrics as shown in the following screenshot:

前面的屏幕截图包含 JobTracker 的状态信息,包括正在运行的作业数、MAP Reduce 插槽数等。
它是如何工作的.
Ganglia 监视系统由三个部分组成:监视守护进程gmond、元数据处理守护进程gmetad和 Web UI。
Gangliagmond守护进程在集群中受监视的每个节点上运行。 它们持续收集指标数据,并将其发送到主节点上运行的gmetad守护进程。 gmetad守护进程将数据存储到由rrdtool维护的数据库中。 Web 用户界面(包括所有图形)是通过 PHP 从数据库中提取数据生成的。 Ganglia 数据流可以用下图描述:

另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考http://ganglia.sourceforge.net/
- 参考http://www.ibm.com/developerworks/wikis/display/WikiPtype/ganglia
使用 Nagios 监视 Hadoop 集群
Nagios是一个强大的开源集群监控系统。 它不仅可以监控主机和服务器,还可以监控路由器和交换机等互联设备。 警报服务提供快速响应系统问题的通知机制。
Nagios 设计为通用监控系统,可以配置为监控 Hadoop 集群。 在本食谱中,我们将概述为 Hadoop 集群监控配置 Nagios 的步骤。
做好准备
在使用 Nagios 监视 Hadoop 集群之前,请执行以下步骤:
-
To get started with Nagios monitoring, we need to install it first. On CentOS and other Red Hat-compatible Linux systems, we can use the following
yumcommand to install Nagios:sudo yum install nagios nagios-plugins该命令将自动安装依赖软件包,如
libgd和libgd-devel。 安装后,Nagios 配置文件将位于/etc/nagios目录下,Nagios 守护进程将位于/etc/init.d/目录下。 -
Install the Nagios Remote Plugin Executor (NRPE) package with the following command:
sudo yum install nrpeNRPE 是一个 Nagios 插件,允许我们在远程机器上执行 Nagios 插件。 详情请查看:http://nagios.sourceforge.net/docs/3_0/addons.html和http://nagios.sourceforge.net/docs/nrpe/NRPE.pdf。
-
Download the
check_jmxNagios plugin from http://exchange.nagios.org/directory/Plugins/Java-Applications-and-Servers/check_jmx/details.我们希望使用 Java JMX 作为 Nagios 插件来监控 Hadoop 指标。
使用以下命令构建
check_jmx包:tar xvf check_jmx.tgz cd check_jmx ant -
在之后,我们希望获得以下目录结构:
check_jmx ├── ... ├── nagios │ ├── plugin │ │ ├── check_jmx │ │ └── jmxquery.jar │ └── readme.txt └── ... -
Copy the two highlighted files in the
/usr/local/nagios/libexecdirectory:cp check_jmx/nagios/plugin/check_jmx /usr/local/nagios/libexec cp check_jmx/nagios/plugin/jmxquery.jar /usr/local/nagios/libexec通过这样做,我们将能够在 Nagios 监视配置中使用
check_jmx命令。
怎么做……
使用以下步骤配置用于 Hadoop 集群监视的 Nagios:
-
Open the
/etc/nagios/nagios.cfgfile with a text editor.提示
该文件是 Nagios 的主配置文件。 它引用了许多扩展名为
.cfg的文件,其中包含特定的监控配置。 -
Change the contacts information for alerting services by changing the e-mail address in the
/usr/local/nagios/etc/objects/contacts.cfgfile:define contact{ contact_name nagiosadmin use generic-contact alias Nagios email nagios@localhost }提示
也可以使用其他提醒方法,例如 SMS 消息和寻呼。 有关更多信息,请参阅以下网页:
http://nagios.sourceforge.net/docs/3_0/objectdefinitions.html
-
Change the Apache web server configuration file
/etc/httpd/conf/httpd.confby adding the following line:Include /etc/httpd/conf/nagios.conf/etc/httpd/conf/nagios.conf文件是 Nagios Web 界面的配置文件;该文件的内容应与以下内容类似:# Specifies the location of the cgi scripts. ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin <Directory “/usr/local/nagios/sbin”> AllowOverride AuthConfig Options ExecCGI Allow from all Order allow,deny </Directory> # Specifies the Nagios root directory. # This will enable us to visit Nagios through http://<host>/nagios Alias /nagios /usr/local/nagios/share <Directory “/usr/local/nagios/share”> Options None AllowOverride AuthConfig Order allow,deny Allow from all </Directory>前面的配置指定了 Nagios web UI 的根目录和 CGI 目录;要使用户能够访问,我们需要创建
/usr/local/nagios/sbin/.htaccess和/usr/local/nagios/share/.htaccess文件,内容如下:AuthName “Nagios Access” AuthType Basic AuthUserFile /etc/nagios/htpasswd.users require valid-user -
Create an administrator user for the Nagios web UI with the following command:
sudo htpasswd -c /etc/nagios/htpasswd.users nagiosadmin提示
我们应该为
nagiosadmin用户键入两次密码。 用户名和密码将用于登录 Web 用户界面。
现在,我们已经准备好通过以下步骤指定 Hadoop 集群监控配置:
-
Open the
/etc/nagios/nagios.cfgfile and add the following content:cfg_file=/etc/nagios/hosts.cfg cfg_file=/etc/nagios/services.cfg前两行告诉主配置文件
nagios.cfg包括两个特定于用户的配置文件:hosts.cfg和services.cfg。 -
Configuration file
hosts.cfgspecifies the hosts we want to monitor, and it should have content similar to the following:##################################### ## Declare host groups. ##################################### define hostgroup { hostgroup_name hdgroup alias Hadoop cluster groups. } ##################################### # Define a host template. # All the hosts configuration in our # cluster should be derived from this # template. ##################################### define host { name hdhost use linux-server hostgroups hdgroup register 0 } ########################################## # This are the real hosts in the cluster. ########################################## define host{ host_name master alias The master node. address 10.194.19.16 use hdhost } define host{ host_name slave1 alias The slave 1. address 10.40.193.19 use hdhost } define host{ host_name slave2 alias The slave 2. address 10.36.117.108 use hdhost } define host{ host_name slave3 alias The slave 3. address 10.40.66.245 use hdhost } define host{ host_name slave4 alias The slave 4. address 10.245.133.242 use hdhost } define host{ host_name slave5 alias The slave 5. address 10.12.73.254 use hdhost }该文件配置集群中要监视的六台主机,包括一个主节点和五个从节点。
-
The configuration file
services.cfgspecifies the services we want to monitor. The contents of this file should be similar to the following:############################################### ## Service definitions. ## For example, we want to monitor the status of ## the system, including the load, cpu usage, ## memory usage etc. ## For the monitoring of Hadoop clsuters, ############################################### # Monitor system metrics. define service{ use generic-service hostgroup_name hdgroup service_description SSH check_command check_ssh } define service{ use local-service hostgroup_name hdgroup service_description Swap Usage check_command check_local_swap!20!10 } define service{ use local-service hostgroup_name hdgroup service_description Total processes check_command check_local_procs!250!400!RSZDT }此文件中配置的服务将应用于声称在
hosts.cfg文件中配置的hdgroup组中的每个主机。 -
Verify the configurations with the following command:
sudo nagios --verify-config /etc/nagios/nagios.cfg我们将获得类似于以下屏幕截图的输出:
![How to do it...]()
-
使用以下命令启动 Nagios 服务:
sudo service nagios start -
Check the status of the service with the following command:
sudo service nagios status如果 Nagios 正在运行,输出应该类似于:
nagios (pid 21542) is running...如果 SELinux 处于打开状态,我们需要使用以下命令更改 Web 目录的上下文:
chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin/ chcon -R -t httpd_sys_content_t /usr/local/nagios/share/ -
Restart the web server with the following command:
sudo service httpd restart现在,我们应该能够通过打开 URL:
http://master/nagios来检查 Web 用户界面。提示
如果您是第一次打开 Web 用户界面,则需要键入用户名和密码。 用户名应为
nagiosadmin,密码应为您为htpasswd命令输入的密码。
它是如何工作的.
Nagios 是一个开源的集中式网络监控系统。 典型的 Nagios 部署由一个监控服务器和多个被监控的主机组成。 管理员使用一个或多个配置文件定义监控规范(哪些主机上有哪些服务)。 有关 Nagios 的更多信息,请参考:http://www.nagios.org。
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考http://library.nagios.com/library/products/nagioscore/manuals
使用 Ambari 监控 Hadoop 集群
ApacheAmbari项目(Hadoop)是一个开源项目,旨在简化 http://incubator.apache.org/ambari/集群的管理和监控。 目前,Ambari 支持对该软件的管理:HDFS、MapReduce、HBase 和 HIVE。 在本食谱中,我们将概述配置 Hadoop Ambari 以进行集群安装、监控和管理的步骤。
做好准备
我们假设 Hadoop 集群已正确配置。 执行以下步骤:
-
使用以下命令启用 NTP 服务器:
sudo service ntpd start sudo chkconfig ntpd on -
应该在安装了 Ambari 的服务器上禁用 SELinux。 我们可以使用以下命令临时禁用 SELinux:
sudo setenforce 0 -
To permanently disable SELinux, we need to edit the SELinux configuration file
/etc/selinux/configby changing the state of theSELINUXattribute to the following:SELINUX=disabled0提示
更改
/etc/selinux/config文件后,我们需要重新启动系统才能使其生效。 -
使用以下命令禁用
iptables服务:sudo service iptables stop sudo chkconfig iptables off -
Check the status of iptables with the following command:
sudo iptables -L输出应与以下内容类似:
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
怎么做……
使用以下步骤配置 Ambari 以进行 Hadoop 监视和管理:
-
使用以下命令从 Horntonworks 网站下载存储库文件:
sudo wget http://public-repo-1.hortonworks.com/ambari/centos6/1.x/GA/ambari.repo -P /etc/yum.repos.d -
使用以下命令安装
epel存储库:sudo yum install epel-release -
Verify the repository list with the following command:
yum repolist输出应与以下内容类似:
Loaded plugins: langpacks, presto, refresh-packagekit ... repo id repo name status HDP-UTILS-1.1.0.15 HDP-UTILS-1.1.0.15 52 Updates-ambari-1.x ambari-1.x - Updates 10 ambari-1.x Ambari 1.x 5 epel Extra Packages for Enterprise Linux 5 - x86_64 -
Install Ambari with the following command:
sudo yum install ambari-server该命令将自动安装PostgreSQL数据库,这是 Ambari 所需的。
-
Set up the Ambari server with the following command:
sudo ambari-server setup提示
如果 SELinux 未禁用,我们将收到警告,如果未禁用,
iptables服务将被禁用。 在配置过程中,我们将被要求配置 PostgreSQL 数据库的用户名和密码。 如果您选择不这样做(这是默认选项),则默认用户名和密码将为ambari-server和bigdata。 然后,安装过程将提示下载 Oracle JDK,我们应该接受许可证。 在集群上部署包时,会将下载的 JDK 安装到主机上。设置过程的输出如以下屏幕截图所示:
![How to do it...]()
-
现在,我们可以使用以下命令启动 Ambari 服务器:
sudo service ambari-server start -
Visit the web UI by opening URL:
http://master:8080.提示
现在,我们需要使用用户名和密码
admin登录到 Ambari 服务器。 -
After logging in, we will be able to install and manage our Hadoop cluster from the Ambari web UI, which is similar to the following screenshot:
![How to do it...]()
-
Next, we need to configure Install Options as shown in the following screenshot:
![How to do it...]()
-
After specifying the installation options as shown in the previous screenshot, we can click on the Register and Confirm button to start the installation process. This will lead to the host registration progress page as shown in the following screenshot. In this step, we need to confirm the hosts to install Hadoop:

- By clicking on the Next button, we will allow the web page to choose the services to install, as shown in the following screenshot:

- By default, all the services are selected to be installed; we can make changes based on the requirements and then click on the Next button. We will go to a web page to assign hosts as masters, slaves, and clients, as shown in the following screenshot:

- Next, we will go to a web page for customizing services, for example, configuring the location for the
NameNodedirectory. In this step, some services such as Hive and Nagios may ask you to enter administrative usernames and passwords, which are required for service installation.

- After everything is configured, we will get a summary page about our configurations, as shown in the following screenshot:

- By clicking on the Deploy button, the cluster deployment will start and a progress bar will appear for each service that is being installed, as shown in the following screenshot:

- After the deployment completes, we will get a Summary page as shown in the following screenshot:

- 通过单击完成按钮,集群安装过程将完成,和我们将能够看到集群的状态,如以下屏幕截图所示:

另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Chukwa配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 参考http://incubator.apache.org/ambari/
- 参考http://incubator.apache.org/ambari/1.2.1/installing-hadoop-using-ambari/content/index.html
使用 Chukwa 监视 Hadoop 集群
Chukwa是一个为收集和分析 Hadoop 日志而开发的项目。 它使用 HDFS 作为其存储架构,并包含许多用于日志分析和集群监控的工具包。 在本食谱中,我们将指导您完成配置 Chukwa 以监视 Hadoop 集群的步骤。
做好准备
最新版本的 Chukwa 使用 HBase 进行键值存储。 因此,在开始之前,我们假设 Hadoop 和 HBase 已经安装并正确配置。
接下来,我们可以使用以下步骤安装 Chukwa:
-
从官网http://incubator.apache.org/chukwa下载最新版本,例如使用以下命令:
sudo wget http://mirror.symnds.com/software/Apache/incubator/chukwa/chukwa-0.5.0/chukwa-incubating-src-0.5.0.tar.gz -P /usr/local -
使用以下命令解压缩存档文件:
sudo tar xvf chukwa-incubating-src-0.5.0.tar.gz -
使用以下命令为目录创建符号链接:
sudo ln -s chukwa-incubating-src-0.5.0 chukwa -
使用以下命令更改目录的所有权:
sudo chown hduser.hduser chukwa-incubating-src-0.5.0 -R sudo chown hduser.hduser chukwa -R -
通过将以下内容添加到
~/.bashrc文件中来更改环境变量:export CHUKWA_HOME=/usr/local/chukwa PATH=$CHUKWA_HOME/bin:$PATH -
使用以下命令从源代码构建 Chukwa:
source ~/.bashrc cd $CHUKWA_HOME mvn clean package -
When the compilation finishes, the directory structure of Chukwa will be similar to the following:
chukwa ├── bin │ ├── chukwa │ ├── chukwa-config.sh │ ├── slaves.sh │ ├── start-agents.sh │ ├── start-chukwa.sh │ ├── start-collectors.sh │ └── VERSION ├── conf │ ├── auth.conf │ ├── chukwa-agent-conf.xml │ ├── chukwa-collector-conf.xml │ ├── chukwa-demux-conf.xml │ ├── chukwa-env.sh │ ├── chukwa-log4j.properties │ ├── collectors │ ├── agents │ ├── hadoop-log4j.properties │ ├── hadoop-metrics.properties │ ├── hbase.schema │ ├── initial_adaptors │ └── system-data-loader.properties └── ... 29 directories, 93 files提示
如果您下载的是 Chukwa 的二进制版本,则目录结构可能与此不同。
-
使用以下命令安装
telnet:sudo yum install telnet -
使用以下命令将中的从管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置 Chukwa 以进行 Hadoop 监视:
-
将
$HADOOP_HOME/conf/log4j.properties文件中的log4j.appender.DRFA变量更改为以下值:log4j.appender.DRFA=org.apache.log4j.net.SocketAppender -
使用以下命令将 Hadoop
metrics文件从Chukwa目录复制到 Hadoop 配置目录:cp $CHUKWA_HOME/etc/chukwa/hadoop-metrics.properties $HADOOP_HOME/conf -
使用以下命令将
client.jar文件从 Chukwa 安装目录复制到 Hadoop 共享目录:cp $CHUKWA_HOME/share/chukwa/chukwa-0.5.0-client.jar $HADOOP_HOME/lib -
使用以下命令将
json库从 Chukwa 库复制到 Hadoop 库:cp $CHUKWA_HOME/share/chukwa/lib/json-simple-1.1.jar $HADOOP_HOME/lib -
使用以下命令将文件和配置同步到从节点:
for host in cat $HADOOP_HOME/conf/slaves do echo ‘Copying file to ‘ $host scp $HADOOP_HOME/lib/chukwa-0.5.0-client.jar $host:$HADOOP_HOME/lib; scp $HADOOP_HOME/lib/json-simple-1.1.jar $host: $HADOOP_HOME/lib; scp $HADOOP_HOME/conf/hadoop-metrics.properties $host:$HADOOP_HOME/conf done -
使用以下命令重启 Hadoop 集群:
stop-all.sh start-all.sh -
使用以下命令启动 HBase 后台进程:
start-hbase.sh -
Import the Chukwa
schemafile to HBase with the following command:hbase shell < $CHUKWA_HOME/etc/chukwa/hbase.schema该命令将产生类似于以下内容的输出:
HBase Shell; enter ‘help<RETURN>’ for list of supported commands. Type “exit<RETURN>” to leave the HBase Shell Version 0.94.5, r1443843, Fri Feb 8 05:51:25 UTC 2013 create “Hadoop”, {NAME => “ClientTrace”, VERSIONS => 65535}, {NAME => “dfs_namenode”, VERSIONS => 65535}, {NAME => “dfs_FSNamesystem”, VERSIONS => 65535}, {NAME => “dfs_datanode”, VERSIONS => 65535}, {NAME => “mapred_jobtracker”, VERSIONS => 65535}, {NAME => “mapred_shuffleOutput”, VERSIONS => 65535}, {NAME => “mapred_tasktracker”, VERSIONS => 65535}, {NAME => “jvm_metrics”, VERSIONS => 65535}, {NAME => “mapred_Queue”, VERSIONS => 65535}, {NAME => “metricssystem_MetricsSystem”, VERSIONS => 65535}, {NAME => “rpc_rpc”, VERSIONS => 65535}, {NAME => “rpcdetailed_rpcdetailed”, VERSIONS => 65535}, {NAME => “ugi_ugi”, VERSIONS => 65535} 0 row(s) in 2.7920 seconds create “HadoopLog”, {NAME => “NameNode”, VERSIONS => 65535}, {NAME => “Audit”, VERSIONS => 65535} 0 row(s) in 1.0740 seconds create “Jobs”, {NAME => “summary” } 0 row(s) in 1.0610 seconds create “SystemMetrics”, {NAME => “cpu”, VERSIONS => 65535}, {NAME => “system”, VERSION => 65535}, {NAME => “disk”, VERSION => 65535}, {NAME => “memory”, VERSION => 65535}, {NAME => “network”, VERSION => 65535}, {NAME => “tags”, VERSION => 65535} 0 row(s) in 1.1030 seconds create “ClusterSummary”, {NAME=> “cpu”, VERSIONS => 65535}, {NAME => “system”, VERSION => 65535}, {NAME => “disk”, VERSION => 65535}, {NAME => “memory”, VERSION => 65535}, {NAME => “network”, VERSION => 65535}, {NAME => “hdfs”, VERSION => 65535}, {NAME => “mapreduce”, VERSION => 65535} 0 row(s) in 1.0830 seconds create “chukwa”, {NAME=>”chukwaAgent_chunkQueue”, VERSIONS => 65535}, {NAME => “chukwaAgent_metrics”, VERSION => 65535}, {NAME => “chukwaAgent_httpSender”, VERSION => 65535} 0 row(s) in 1.0860 seconds输出显示已经创建了 6 个 HBase 表。
-
Use a text editor to open the
$CHUKWA_HOME/etc/chukwa/chukwa-collector-conf.xmlfile and comment thechukwaCollector.pipelineproperty by adding the following string before the property:<!--在属性末尾添加以下字符串:
-->通过这样做,我们已经将 Chukwa 配置为使用 HBase 进行日志收集存储。
-
将文件中的环境变量配置为以下值:
```sh
export JAVA_HOME=/usr/java/latest
export HADOOP_HOME=/usr/local/hadoop
export HBASE_HOME=/usr/local/hbase
export HADOOP_CONF_DIR=$HADOOP_HOME/conf
export HBASE_CONF_DIR=$HBASE_HOME/conf
```
- 通过将以下主机名添加到
$CHUKWA_HOME/etc/chukwa/agents文件,将 Chukwa 配置为从从节点收集数据:
```sh
slave1
slave2
slave3
...
```
- We can run multiple collectors (for example, we want to run collectors on the
masterandslave1nodes) by adding the following content into the$CHUKWA_HOME/etc/chukwa/collectorsfile:
```sh
http://master:8081
http://slave1:8081
```
### 备注
多个收集器可以提高数据收集过程的吞吐量。
- Start the Chukwa agents with the following command:
```sh
start-agents.sh
```
我们将获得类似于以下屏幕截图的输出:

- Start the Chukwa collector with the following command:
```sh
start-collectors.sh
```
此命令的输出类似于以下内容:

- 使用
```sh
export PIG_CLASSPATH=$HADOOP_HOME/conf:$HBASE_HOME/conf
```
将 Hadoop 和 HBase 的配置目录添加到 Pig`CLASSPATH`条目
- 使用
pig通过以下命令分析数据:
```sh
pig -Dpig.additional.jars=$HBASE_HOME/hbase-0.94.5.jar:$PIG_HOME/pig-0.11.0.jar $CHUKWA_HOME/share/chukwa/script/pig/ClusterSummary.pig
```
- 使用以下命令启动Hadoop Infrastructure Care Center(HICC)的 Web UI:
```sh
chukwa hicc
```
- 打开 URL
http://master:4080,并使用admin作为登录的用户名和密码。
提示
我们可以修改$CHUKWA_HOME/etc/chukwa/auth.conf文件以更改登录凭据。
默认情况下,该文件将包含以下内容:
admin: admin, user
这个的意思是username: password[, role]。
它是如何工作的.
Chukwa 旨在收集集群中跨分布式机器动态生成的数据。 它有四个主要组件:Adaptor、收集器、MapReduce或其他数据处理作业,以及称为HICC的 Web UI。
Chukwa 适配器部署在每台数据源计算机上。 适配器在这些机器上以代理的形式运行,这些代理将收集的数据发送到本地或远程机器上的收集器。
Chukwa 收集器将数据从代理输送到 HDFS 等数据存储系统。 出于性能原因,数据通常作为序列文件写入,这些文件将由 MapReduce 作业处理。
MapReduce 作业将生成键-值对,以供最后一个组件-HICC 进行可视化。 Chukwa 使用嵌入式 Web 服务器Jetty部署 Web 存档文件$CHUKWA_HOME/ share/chukwa/webapps/hicc.war。
提示
有时,您可能在运行 HICC 和访问 Web UI 时遇到问题;最可能的原因是您有不兼容的 Hadoop、HBase 和 Chukwa 的.jar文件。 在这种情况下,我的建议是从 GitHub(https://github.com/apache/chukwa)克隆源代码,然后从源代码编译hicc.warWeb 归档文件。 有关更多信息,请查看源代码根目录中的README.txt文件。
总而言之,楚科瓦的数据流可以用下图来描述:

有关楚克瓦设计的更多信息,请查看网址:http://incubator.apache.org/chukwa/docs/r0.5.0/design.html。
还有更多...
由于该软件包的不稳定,在将其部署到集群上时可能需要进行一些调试。 但是,要开始使用 Chukwa,建议始终以本地或伪分布式模式运行它,这将在本地计算机上启动一个代理和一个收集器。 为此,可以使用以下命令:
chukwa agent local
前面的命令将给出以下输出:
OK chukwaAgent.checkpoint.dir [File] = /tmp/chukwa/log/
OK chukwaAgent.checkpoint.interval [Time] = 5000
OK chukwaAgent.control.port [Portno] = 9093
OK chukwaAgent.sender.fastRetries [Integral] = 4
我们还可以使用以下命令:
chukwa collector local
此命令将提供以下输出:
OK chukwaCollector.http.port [Integral] = 8081
OK chukwaCollector.pipeline [ClassName list] = org.apache.hadoop.chukwa.datacollection.writer.SocketTeeWriter,org.apache.hadoop.chukwa.datacollection.writer.hbase.HBaseWriter
OK chukwaCollector.rotateInterval [Time] = 300000
OK chukwaCollector.writerClass [ClassName] = org.apache.hadoop.chukwa.datacollection.writer.PipelineStageWriter
OK writer.hdfs.filesystem [URI] = hdfs://master:54310
started Chukwa http collector on port 8081
我们可以通过使用以下命令跟踪日志文件来检查守护程序的状态:
tail -f /tmp/chukwa/logs/agent.log
tail -f /tmp/chukwa/logs/collector.log
目前,Chukwa 是Apache Free Software(AFS)基金会下的孵化器项目。 我们可以在wiki.apache.org/hadoop/chukwa的维基页面或官方网站http://incubator.apache.org/chukwa/上查看开发计划和进展。 与许多开放源码项目类似,会报告新的错误并添加新功能;跟上最新更改的一个很好的方法是使用源代码存储库,它可以在:https://github.com/apache/chukwa中找到。
另请参阅
- 使用 JMX配方监视 Hadoop 集群
- 使用 Ganglia配方监视 Hadoop 集群
- 使用 Nagios配方监视 Hadoop 集群
- 使用 Ambari配方监视 Hadoop 集群
- 参考http://incubator.apache.org/chukwa/docs/r0.5.0/admin.html**
七、调整 Hadoop 集群来获得最佳性能
在本章中,我们将介绍:
- 对 Hadoop 集群进行基准测试和性能分析
- 使用瘤胃分析工作历史
- 使用 GridMix 对 Hadoop 集群进行基准测试
- 使用 Hadoop Vaidya 确定性能问题
- 平衡 Hadoop 集群的数据块
- 选择适当的块大小
- 对输入和输出使用压缩
- 配置推测性执行
- 为 TaskTracker 设置适当数量的 MAP 和 Reduce 插槽
- 调整 JobTracker 配置
- 调整 TaskTracker 配置
- 调整混洗、合并和排序参数
- 为 Hadoop 集群配置内存
- 设置适当的并行副本数
- 调整 JVM 参数
- 配置 JVM 重用
- 配置减速机初始化时间
简介
Hadoop 性能调优是一项具有挑战性的任务,这主要是由于系统的分布式特性。 从另一个角度来看,大量的配置属性可以告诉我们,配置 Hadoop 集群有多么复杂。 许多配置参数都会影响集群的性能。 有时,属性的不同设置可能会导致显著的性能差异。 在 Hadoop 集群的性能方面,有些属性比其他属性更相关、更敏感。
Hadoop 集群由许多组件组成。 一种系统的性能调优方法是根据组件对集群性能的贡献来调优组件。 大多数大数据应用都有 I/O 限制,Hadoop 也是如此。 因此,与 I/O 请求密切相关的配置应该是性能调优的首要任务。 例如,数据复制属性的次优配置可能会导致网络上的大量数据块拷贝,这将对集群的性能造成负面影响。 同样,不正确的 JVM 配置可能会导致对中间数据进行大量数据交换。 而且,DataNode 上不平衡的数据块分布可能会导致 MAP 和 Reduce 任务的执行效果不佳。
Hadoop 性能调优的第一步是了解 Hadoop MapReduce 如何使用不同的配置属性设置。 在此基础上,可以得出优化的配置或最佳实践。 但这不是一项微不足道的任务。 它需要一些技术,例如通过在不同参数设置下运行受控实验来收集数据,使用优化技术进行数据分析,以及分析和推理技能。 事实上,由于 Hadoop 集群性能调优的挑战性和新颖性,研究社区最近有关于学习和调优 Hadoop 集群性能的项目和出版物(例如,http://www.cs.duke.edu/starfish/的 Starfish 项目)。
虽然找到最佳参数配置的方法对于调优 Hadoop 集群的性能是直接的,但无论是在理论上还是在实践中,实现都是非常苛刻的。 Hadoop 社区已经开发并采用了各种优化 Hadoop 性能的工具和策略。 例如,平衡器是用于平衡倾斜数据块的工具,而推测性****执行是用于为进展缓慢的任务启动推测性任务的策略。
在本章中,我们将概括介绍以下主题:
- 通过对 Hadoop 集群进行基准测试来确定性能问题
- 调整 Hadoop 配置参数以获得最佳性能
- 使用策略和工具实现 Hadoop 最佳性能调优
备注
不同 Hadoop 集群的最佳设置可以不同。 换句话说,在不同的硬件配置下,一个集群的最佳配置可能不是另一个集群的最佳配置。 因此,要找到特定集群的最佳设置,需要实际的现场工作
对 Hadoop 集群进行基准测试和性能分析
对 Hadoop 集群进行基准测试是调优 Hadoop 集群性能的第一步。 我们还可以使用 Hadoop 基准测试来识别配置问题,并将其用作性能调优的参考。 例如,通过将本地基准测试与具有相似配置的集群进行比较,我们可以对集群性能有一个大致的了解。
通常,我们在对 Hadoop 集群进行新配置之后,在将其投入服务以接受作业之前对其进行基准测试。 这是因为,当客户端可以提交作业时,基准测试可能会被客户端的作业搞糊涂,无法显示 Hadoop 集群的真实性能,而且基准测试作业可能会给客户端带来不便。
在本节中,我们将介绍如何使用 Hadoop 发行版中包含的tests和examples包对 Hadoop 集群进行基准测试和压力测试。 更具体地说,我们将测试 HDFS 集群的读/写性能。 此外,我们还将测试 MapReduce 框架的故障恢复能力和 MapReduce 集群在压力下的性能。
做好准备
要开始使用 Hadoop 集群基准,我们假设已经配置了一个工作的 Hadoop 集群,并且所有守护进程都在运行,没有任何问题。 我们还假设已经在适当的位置正确设置了所需的环境变量。 例如,我们应该让HADOOP_HOME指向 Hadoop 安装的主目录,并在$HADOOP_HOME/conf/hadoop-env.sh文件中设置JAVA_HOME。
使用以下命令从 Hadoop 集群管理机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下配方执行 HDFS 基准测试:
-
Test the filesystem with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-1.1.2.jar testfilesystem -files 10 -megaBytes 10此命令将生成 10 个文件,每个文件大小为 10MB 用于测试,此基准测试的消息如下所示:
13/04/18 21:25:36 INFO fs.FileSystem: seed = -7801967327500182430 13/04/18 21:25:36 INFO fs.FileSystem: files = 10 13/04/18 21:25:36 INFO fs.FileSystem: megaBytes = 10 13/04/18 21:25:37 INFO fs.FileSystem: creating control file: 10485760 bytes, 10 files 13/04/18 21:25:38 INFO fs.FileSystem: created control file for: 11691305 bytes 13/04/18 21:25:38 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same. ...备注
如果没有错误,则认为测试成功。
-
Benchmark the distributed write consistency on the distributed filesystem with the following command:
hadoop jar $HADOOP_HOME/adoop-test-*.jar DistributedFSCheck -write -nrFiles 10 -fileSize 50此命令将向 HDFS 写入 10 个(由
-nrFiles选项控制)大小为 50MB(由-fileSize选项控制)的随机内容文件。 它将生成一个名为TestDFSIO_results.log的结果文件,其中包含以下内容:----- TestDFSIO ----- : write Date & time: Mon Apr 01 18:25:12 EDT 2013 Number of files: 10 Total Mbytes processed: 500 Throughput mb/sec: 8.585459665510491 Average IO rate mb/sec: 9.46606731414795 IO rate std deviation: 2.906442884562995 Test exec time sec: 42.338 -
Similarly, we can benchmark the distributed read consistency on the distributed filesystem with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar DistributedFSCheck -read -nrFiles 10 -fileSize 50该命令将从集群中读取 10 个大小为 50 MB 的文件,并将生成包含以下内容的结果文件:
----- TestDFSIO ----- : read Date & time: Mon Apr 01 18:26:13 EDT 2013 Number of files: 10 Total MBytes processed: 500 Throughput mb/sec: 15.531809145129225 Average IO rate mb/sec: 17.578426361083984 IO rate std deviation: 6.313778174121274 Test exec time sec: 42.205
备注
从这两个(读/写一致性检查)命令的输出中,我们知道对于 HDFS 集群而言,写入比读取更昂贵。 这是因为写入操作又涉及更多操作,例如计算和记录数据块的校验和等。
以下配方可用于对 MapReduce 集群进行基准测试:
-
Benchmark MapReduce jobs with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar mapredtest 5 1000mapredtest基准测试对 MapReduce 计算框架进行负载测试。 该基准测试是用随机整数完成的,生成随机整数、将其写入文件、从文件读回并使用原始文件进行测试。 -
Test the reliability of the MapReduce distributed computing framework with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar MRReliabilityTest -libjars $HADOOP_HOME/hadoop-examples-*.jar该命令将故意导致正在运行的作业上的 TASK 和 TaskTracker 失败。 因此,在测试期间,我们将能够看到这样的消息:终止几个任务。 示例消息如下所示:
13/04/17 17:49:22 INFO mapred.ReliabilityTest: Wed Apr 17 17:49:22 EDT 2013 Killing a few tasks 13/04/17 17:49:22 INFO mapred.ReliabilityTest: Wed Apr 17 17:49:22 EDT 2013 Killed task : attempt_201304051222_0116_m_000000_0 13/04/17 17:49:22 INFO mapred.ReliabilityTest: Wed Apr 17 17:49:22 EDT 2013 Killed task : attempt_201304051222_0116_m_000000_2 13/04/17 17:49:22 INFO mapred.ReliabilityTest: Wed Apr 17 17:49:22 EDT 2013 Killed task : attempt_201304051222_0116_m_000001_0 ... java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271) Caused by: java.io.IOException: Task process exit with nonzero status of 126. at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258) 13/04/17 17:49:38 WARN mapred.JobClient: Error reading task outputhttp://slave1:50060/tasklog?plaintext=true&attemptid=attempt_201304051222_0119_m_000037_0&filter=stdout 13/04/17 17:49:38 WARN mapred.JobClient: Error reading task outputhttp://slave1:50060/tasklog?plaintext=true&attemptid=attempt_201304051222_0119_m_000037_0&filter=stderr备注
失败的任务将在不同的 TaskTracker 上重新执行。 因此,如果集群对故障具有恢复能力,则终止一个或几个任务不会导致作业失败。 如果作业在几个终止任务后失败,可能是因为 MapReduce 不够可靠或对故障没有弹性,因此需要可靠性调优(例如通过添加更多计算 TaskTracker)。
-
Benchmark MapReduce to deal with a large number of small jobs with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar mrbench -numRuns 20mrbench多次执行一个小作业(在此命令中为20),并检查这些小作业是否响应以及是否可以在集群上高效地运行。 此命令将生成类似以下内容的输出:*DataLines Maps Reduces AvgTime (milliseconds) 1 2 1 45231**### 备注
此输出告诉我们,平均运行时间约为
45秒。*
** Benchmark the MapReduce load generator with the following command:hadoop jar $HADOOP_HOME/hadoop-test-1.1.2.jar loadgen -m 100 -r 10 -keepmap 50 -keepred 50 -indir input -outdir output此命令的结果将类似于以下内容:
Original sum: 1000 Recomputed sum: 1000 Success=true- Do a stress test with the NameNode:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar nnbench -create_write我们将得到类似于以下内容的输出:
-------------- NNBench -------------- : Version: NameNode Benchmark 0.4 Date & time: 2013-04-01 18:24:10,491 Test Operation: create_write Start time: 2013-04-01 18:22:53,382 Maps to run: 2 Reduces to run: 1 Block Size (bytes): 1 Bytes to write: 0 Bytes per checksum: 1 Number of files: 1 Replication factor: 1 Successful file operations: 2 # maps that missed the barrier: 0 # exceptions: 0 TPS: Create/Write/Close: 0 Avg exec time (ms): Create/Write/Close: 30037.5 Avg Lat (ms): Create/Write: 30030.5 Avg Lat (ms): Close: 6.5 RAW DATA: AL Total #1: 60061 RAW DATA: AL Total #2: 13 RAW DATA: TPS Total (ms): 60075 RAW DATA: Longest Map Time (ms): 60045.0 RAW DATA: Late maps: 0 RAW DATA: # of exceptions: 0- Test the Hadoop performance with large non-splittable files:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar testbigmapoutput -input input -output output -create 2048此基准测试将生成类似于以下内容的输出:
13/04/18 22:16:12 INFO mapred.BigMapOutput: Writing 2147483648 bytes to in/part-0 with minKeySize: 10 keySizeRange: 990 minValueSize: 0 valueSizeRange: 20000 13/04/18 22:17:32 INFO mapred.BigMapOutput: Created in/part-0 of size: 2048MB in 79secs Job started: Thu Apr 18 22:17:32 EDT 2013 13/04/18 22:17:33 INFO mapred.FileInputFormat: Total input paths to process : 1 13/04/18 22:17:33 INFO net.NetworkTopology: Adding a new node: /default-rack/slave1:50010 13/04/18 22:17:33 INFO net.NetworkTopology: Adding a new node: /default-rack/slave2:50010 13/04/18 22:17:33 INFO net.NetworkTopology: Adding a new node: /default-rack/slave3:50010 ...- Test thread map spills with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar threadedmapbenchthreadedmapbench是一项 MapReduce 基准测试,用于比较具有多个溢出的地图和具有一个溢出的地图的性能。 输出消息将类似于以下内容:13/04/18 23:16:01 INFO mapred.ThreadedMapBenchmark: Starting the benchmark for threaded spills ThreadedMapBenchmark.0.0.1 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Generating random input for the benchmark 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Total data : 128 mb 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Data per map: 128 mb 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Number of spills : 2 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Number of maps per host : 1 13/04/18 23:16:02 INFO mapred.ThreadedMapBenchmark: Number of hosts : 1 ```*
*排序是 MapReduce 作业的典型操作。 通过对随机数据进行排序,我们可以查看 Hadoop 集群的运行状况。 以下步骤可用于对 Hadoop 排序进行基准测试:
-
使用以下命令生成一些随机文本数据:
hadoop jar $HADOOP_HOME/hadoop-examples-*.jar randomwriter random.writer.out -
使用以下命令对生成的随机数据进行排序:
hadoop jar $HADOOP_HOME/hadoop-examples-*.jar sort random.writer.out random.writer.out.sorted -
Validate the MapReduce sort algorithm with the following command:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar testmapredsort -m 50 -r 5 -sortInput random.writer.out -sortOutput random.writer.out.sorted此命令将验证排序算法的准确性。 如果排序算法没有问题,我们将收到以下消息:
成功! 已成功验证 MapReduce 框架的“排序”。
…的工作原理
我们可以通过以下命令获取测试包的 Hadoop 基准的使用情况:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar
此命令将为我们提供以下输出:
An example program must be given as the first argument.
Valid program names are:
DFSCIOTest: Distributed i/o benchmark of libhdfs.
DistributedFSCheck: Distributed checkup of the file system consistency.
MRReliabilityTest: A program that tests the reliability of the MR framework by injecting faults/failures
TestDFSIO: Distributed i/o benchmark.
dfsthroughput: measure hdfs throughput
filebench: Benchmark SequenceFile(Input|Output)Format (block,record compressed and uncompressed), Text(Input|Output)Format (compressed and uncompressed)
loadgen: Generic map/reduce load generator
mapredtest: A map/reduce test check.
mrbench: A map/reduce benchmark that can create many small jobs
nnbench: A benchmark that stresses the namenode.
testarrayfile: A test for flat files of binary key/value pairs.
testbigmapoutput: A map/reduce program that works on a very big non-splittable file and does identity map/reduce
testfilesystem: A test for FileSystem read/write.
testipc: A test for ipc.
testmapredsort: A map/reduce program that validates the map-reduce framework's sort.
testrpc: A test for rpc.
testsequencefile: A test for flat files of binary key value pairs.
testsequencefileinputformat: A test for sequence file input format.
testsetfile: A test for flat files of binary key/value pairs.
testtextinputformat: A test for text input format.
threadedmapbench: A map/reduce benchmark that compares the performance of maps with multiple spills over maps with 1 spill
我们可以使用以下命令获取testfilesystem基准的用法:
hadoop jar $HADOOP_HOME/hadoop-test-1.1.2.jar testfilesystem
该命令将提供以下输出:
Usage: TestFileSystem -files N -megaBytes M [-noread] [-nowrite] [-noseek] [-fastcheck]
下表显示了此基准命令的每个选项的含义:
|选择 / 选择权 / 购买权 / 期权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| -files | 要为基准生成的文件数。 |
| -megaBytes | 生成的文件的大小(MB)。 |
| -noread | 禁用数据读取测试。 |
| -nowrite | 禁用数据写入测试。 |
| -noseek | 禁用寻道测试。 |
| -fastcheck | 是否使用快速检查。 如果该值为 TRUE,则测试缓冲区将填充相同的值,否则将为测试缓冲区中的每个位置生成随机数。 |
我们可以使用以下命令获得mrbench基准测试的帮助:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar mrbench --help
输出将如下所示:
MRBenchmark.0.0.2
Usage: mrbench [-baseDir <base DFS path for output/input, default is /benchmarks/MRBench>]
[-jar <local path to job jar file containing Mapper and Reducer implementations, default is current jar file>]
[-numRuns <number of times to run the job, default is 1>]
[-maps <number of maps for each run, default is 2>]
[-reduces <number of reduces for each run, default is 1>]
[-inputLines <number of input lines to generate, default is 1>]
[-inputType <type of input to generate, one of ascending (default), descending, random>]
[-verbose]
我们可以使用以下命令获取loadgen基准的用法:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar loadgen
此命令的输出将如下所示:
Usage: [-m <maps>] [-r <reduces>]
[-keepmap <percent>] [-keepred <percent>]
[-indir <path>] [-outdir <path]
[-inFormat[Indirect] <InputFormat>] [-outFormat <OutputFormat>]
[-outKey <WritableComparable>] [-outValue <Writable>]
我们可以将nnbench与以下命令配合使用:
hadoop jar softwares/hadoop/hadoop-test-*.jar nnbench
用法如下所示:
NameNode Benchmark 0.4
Usage: nnbench <options>
Options:
-operation <Available operations are create_write open_read
rename delete. This option is mandatory>
* NOTE: The open_read, rename and delete operations assumethat
the files they operate on, are already available. The
create_write operation must be run before running the other
operations.
-maps <number of maps. default is 1\. This is not mandatory>
-reduces <number of reduces. default is 1\. This is not mandatory>
-startTime <time to start, given in seconds from the epoch.
Make sure this is far enough into the future, so all maps
(operations) will start at the same time>. default is launch
time + 2 mins. This is not mandatory
-blockSize <Block size in bytes. default is 1\. This is not
mandatory>
-bytesToWrite <Bytes to write. default is 0\. This is not
mandatory>
-bytesPerChecksum <Bytes per checksum for the files. default is 1.
This is not mandatory>
-numberOfFiles <number of files to create. default is 1\. Thisis
not mandatory>
-replicationFactorPerFile <Replication factor for the files.
default is 1\. This is not mandatory>
-baseDir <base DFS path. default is /benchmarks/NNBench. This is
not mandatory>
-readFileAfterOpen <true or false. if true, it reads the fileand
reports the average time to read. This is valid with the
open_read operation. default is false. This is not mandatory>
-help: Display the help statement
输出告诉我们,只有-operation选项是必需的,其他所有选项都是可选的。
我们可以通过以下命令使用testbigmapoutput基准:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar testbigmapoutput
输出将如下所示:
BigMapOutput -input <input-dir> -output <output-dir> [-create <filesize in MB>]
-input和-output选项对于该基准是强制的,而指定要读取创建的文件大小的-create选项是可选的。
我们可以使用以下命令获取mapredtest基准的用法:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar mapredtest
我们将获得以下输出:
Usage: TestMapRed <range> <counts>
备注
一个好的测试应该有一个比<range>值大得多的<counts>值。
<range>选项指定要生成的整数的范围,将在 0 和范围-1 之间生成随机整数。 <counts>选项指定要为基准测试生成多少个随机整数;它的值应该比<range>选项大得多。
我们可以通过以下命令使用testmapredsort基准:
hadoop jar $HADOOP_HOME/hadoop-test-*.jar testmapredsort
输出将类似于以下内容:
sortvalidate [-m <maps>] [-r <reduces>] [-deep] -sortInput <sort-input-dir> -sortOutput <sort-output-dir>
下表显示了这些选项的含义:
|选择 / 选择权 / 购买权 / 期权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| -m | 映射器的数量。 |
| -r | 减速箱的数量。 |
| -deep | 执行深度验证。 |
| -sortInput | 用于排序的输入数据的目录。 指定的目录必须存在,否则基准测试将失败。 |
| -sortOutput | -sortInput目录指定的数据排序后的输出目录。 指定的目录必须存在,否则基准测试将失败。 |
还有更多...
除了 Hadooptests包之外,Hadoop 还附带了一个example包,该包也可用于对 Hadoop 集群进行基准测试。 我们可以使用以下命令获得所有示例基准:
hadoop jar $HADOOP_HOME/hadoop-example-*.jar
此命令将为我们提供以下输出:
Valid program names are:
aggregatewordcount: An Aggregate based map/reduce program that counts the words in the input files.
aggregatewordhist: An Aggregate based map/reduce program that computes the histogram of the words in the input files.
dbcount: An example job that count the pageview counts from a database.
grep: A map/reduce program that counts the matches of a regex in the input.
join: A job that affects a join over sorted, equally partitioned datasets
multifilewc: A job that counts words from several files.
pentomino: A map/reduce tile laying program to find solutions to pentomino problems.
pi: A map/reduce program that estimates Pi using monte-carlo method.
randomtextwriter: A map/reduce program that writes 10GB of random textual data per node.
randomwriter: A map/reduce program that writes 10GB of random data per node.
secondarysort: An example defining a secondary sort to the reduce.
sleep: A job that sleeps at each map and reduce task.
sort: A map/reduce program that sorts the data written by the random writer.
sudoku: A sudoku solver.
teragen: Generate data for the terasort
terasort: Run the terasort
teravalidate: Checking results of terasort
wordcount: A map/reduce program that counts the words in the input files.
有些命令对于测试 Hadoop 集群的配置非常方便。 例如,我们可以使用以下命令通过计算π(Pi)来测试集群:
hadoop jar $HADOOP_HOME/hadoop-example-*.jar pi 10 1000000
此命令将启动 MapReduce 作业,使用 10 个映射器计算π,每个映射器生成 1,000,000 个样本。
randomwriter的用法如下:
hadoop jar $HADOOP_HOME/hadoop-example-*.jar randomwriter <out-dir>
<out-dir>指定randomwriter的输出目录。
sort的用法如下:
sort [-m <maps>] [-r <reduces>] [-inFormat <input format class>] [-outFormat <output format class>] [-outKey <output key class>] [-outValue <output value class>] [-totalOrder <pcnt> <num samples> <max splits>] <input> <output>
下表显示了每个选项的含义:
|选择 / 选择权 / 购买权 / 期权
|
描述 / 描写 / 形容 / 类别
|
| --- | --- |
| -m | 映射任务数。 |
| -r | Reduce 任务数。 |
| -inFormat | 输入格式类。 |
| -outFormat | 输出格式类。 |
| -outKey | 输出键类。 |
| -outValue | 输出值类。 |
| -totalOrder | 指定使用TotalOrderPartitioner对输入数据进行分区。 需要三个参数:<pcnt>指定分区数,<num samples>指定样本数,<max splits>指定数据的最大拆分数。 |
| input | 排序输入目录。 |
| output | 排序输出目录。 |
wordcount的用法如下:
hadoop jar $HADOOP_HOME/hadoop-example-*.jar wordcount <in> <out>
in指定输入目录,out指定输出目录。
另请参阅
- 使用 GridMix 配方对 Hadoop 集群进行基准测试的
*# 使用 Rumen 分析作业历史
Rumen是一个用于从作业日志文件中提取格式良好的信息的工具。 它解析日志并生成 Hadoop 作业的统计数据。 作业跟踪可用于性能调整和模拟。
当前的 Rumen 实现包括两个组件:TraceBuilder和文件夹。 TraceBuilder 将作业历史记录作为输入,并生成易于解析的json文件。 文件夹是一个处理输入跟踪的实用程序,大多数情况下,它用于从 TraceBuilder 缩放汇总的作业跟踪。 例如,我们可以使用文件夹工具来放大(使时间更长)或缩小(使时间更短)作业运行时。 在本食谱中,我们将概述与 Rumen 一起分析工作历史的步骤。
做好准备
在开始之前,我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下步骤分析 Rumen 的作业历史记录:
-
Use the TraceBuilder to extract the Gold Trace from the Hadoop job history files. The syntax of the command is as follows:
hadoop org.apache.hadoop.tools.rumen.TraceBuilder [options] <jobtrace-output> <topology-output> <inputs>例如,我们可以使用以下命令从作业历史目录中提取作业跟踪和拓扑:
hadoop org.apache.hadoop.tools.rumen.TraceBuilder -recursive file:///tmp/jobtraces.json file:///tmp/topology.out file:///usr/local/hadoop/logs/history/done此命令将递归地从 Hadoop 作业历史目录
$HADOOP_HOME/logs/history/done提取作业历史跟踪以及集群的拓扑。-recursive选项告诉 TraceBuilder 递归扫描作业历史目录。jobtraces.json输出文件将包含 MapReduce 作业的所有指标,如下所示:{ "priority" : "NORMAL", "jobID" : "job_201304012206_0001", "user" : "hduser", "jobName" : "PiEstimator", "mapTasks" : [ { "startTime" : 1364868424530, "attempts" : [ { "location" : { "layers" : [ "default-rack", "master" ] }, "hostName" : "/default-rack/master", "result" : "SUCCESS", "startTime" : 1364868424536, "finishTime" : 1364868426761, "attemptID" : "attempt_201304012206_0001_m_000000_0", "shuffleFinished" : -1, "sortFinished" : -1, "hdfsBytesRead" : 242, "hdfsBytesWritten" : -1, "fileBytesRead" : -1, "fileBytesWritten" : 51959, "mapInputRecords" : 1, "mapOutputBytes" : 18, "mapOutputRecords" : 2, "combineInputRecords" : 0, "reduceInputGroups" : -1, "reduceInputRecords" : -1, "reduceShuffleBytes" : -1, "reduceOutputRecords" : -1, "spilledRecords" : 2, "mapInputBytes" : 24, "resourceUsageMetrics" : { "cumulativeCpuUsage" : 600, "virtualMemoryUsage" : 764727296, "physicalMemoryUsage" : 185315328, "heapUsage" : 173867008 } } ], "finishTime" : 1364868426971, "preferredLocations" : [ { "layers" : [ "default-rack", "master" ] } ], "taskType" : "MAP", "taskStatus" : "SUCCESS", "taskID" : "task_201304012206_0001_m_000000", "inputBytes" : 242, "inputRecords" : 1, ... "outputBytes" : 51959, "reduceTasks" : [ { "startTime" : 1364868426978, "attempts" : [ { "location" : { "layers" : [ "default-rack", "master" ] }, "hostName" : "/default-rack/master", "result" : "SUCCESS", "startTime" : 1364868426995, "finishTime" : 1364868441901, "attemptID" : "attempt_201304012206_0001_r_000000_0", "shuffleFinished" : 1364868440476, ... "failedReduceAttemptCDF" : { "maximum" : 9223372036854775807, "minimum" : -9223372036854775808, "rankings" : [ ], "numberValues" : 0 }, "mapperTriesToSucceed" : [ 1.0 ], "failedMapperFraction" : 0.0, "relativeTime" : 0, "clusterMapMB" : -1, "clusterReduceMB" : -1, "jobMapMB" : 200, "jobReduceMB" : 200 } -
The second step of using Rumen is to scale the data generated from the previous step. We can use the following syntax to do this:
hadoop org.apache.hadoop.tools.rumen.Folder [options] [input] [output]例如,要将上一步中生成的作业跟踪的运行时间调整为 50 分钟,我们可以使用以下命令:
hadoop org.apache.hadoop.tools.rumen.Folder -output-duration 50m -input-cycle 20m file:///home/hduser/jobtraces.json file:///home/hduser/job-scaled-50min.json在此命令中,
-output-duration选项定义作业跟踪的最终运行时间,此选项的默认值为 1 小时。-input-cycle选项是强制性的,它定义折叠操作的基本时间单位。
另请参阅
- 使用 GridMix 配方对 Hadoop 集群进行基准测试的
** 参考http://hadoop.apache.org/docs/r1.1.2/rumen.html* 参考https://issues.apache.org/jira/browse/MAPREDUCE-751*
*# 使用 GridMix 为 Hadoop 集群制定基准
GridMix是一个对 Hadoop 集群进行基准测试的工具。 它生成个合成 MapReduce 作业,并基于个这些作业的性能构建模型。 基于作业执行度量对集群的资源配置文件进行建模。 这些配置文件可以帮助我们找到集群的性能瓶颈。 在本节中,我们将概述使用 GridMix 对 Hadoop 进行基准测试的步骤。
做好准备
我们假设我们的 Hadoop 集群已经正确配置,并且所有守护进程都在正常运行,没有任何问题。
备注
目前,GridMix 有三个版本。 为了便于区分和表示,我们将使用GridMix表示 GridMix 版本 1,使用GridMix2表示 GridMix 版本 2,并使用GridMix3表示 GridMix 版本 3。
使用以下命令从管理员计算机登录到 Hadoop 集群节点:
ssh hduser@master
怎么做……
使用以下步骤获取 GridMix2 基准:
-
使用以下命令更改当前工作目录:
cd $HADOOP_HOME/src/benchmarks/gridmix2 -
使用以下命令构建 GridMix2 包:
ant -
使用以下命令将
gridmix.jar文件复制到当前工作目录:cp build/gridmix.jar . -
使用文本编辑器打开
gridmix-env-2文件,并将环境变量更改为下列值:export HADOOP_VERSION=hadoop-1.1.2 export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/conf export USE_REAL_DATASET=FALSE export APP_JAR=${HADOOP_HOME}/hadoop-test-*.jar export EXAMPLE_JAR=${HADOOP_HOME}/hadoop-examples-*.jar export STREAMING_JAR=${HADOOP_HOME}/contrib/streaming/hadoop-streaming-*.jar -
Open the
gridmix_config.xmlGridMix2 configuration file with a text editor and change the benchmark configuration by changing the properties for the benchmark. For example, the following lines configure the number of jobs for thestreamSortbenchmark with small jobs:<property> <name>streamSort.smallJobs.numOfJobs</name> <value>10,5</value> </property> <property> <name>streamSort.smallJobs.numOfReduces</name> <value>6,3</value> </property>备注
这两个属性指定我们将使用 10 个具有 6 个减速器的小型流排序作业,以及 5 个具有 3 个减速器的小型流排序作业。 所有其他配置都应遵循与此类似的规则。
-
使用以下命令使
generateGridmix2Data.sh脚本可执行:chmod +x generateGridmix2Data.sh -
Generate data with the following command:
./generateGridmix2Data.sh此命令将在 HDFS 上生成数据。 默认情况下,生成的数据将以块压缩率 4 进行压缩。将启动三个作业,如输出消息中所示:
Job started: Fri Apr 19 16:02:48 EDT 2013 Running 492 maps. Job started: Fri Apr 19 16:02:48 EDT 2013 Running 492 maps. Job started: Fri Apr 19 16:02:48 EDT 2013 13/04/19 16:02:49 INFO mapred.JobClient: Running job: job_201304051222_0233 13/04/19 16:02:49 INFO mapred.JobClient: Running job: job_201304051222_0234 13/04/19 16:02:49 INFO mapred.JobClient: Running job: job_201304051222_0235 ... -
使用以下命令使
rungridmix_2脚本可执行:chmod +x rungridmix_2 -
Run the
GridMix2benchmark with the command:./rungridmix_2此命令需要一段时间才能完成。 我们可以看到类似以下内容的输出消息:
Jobs in waiting state: 30 Jobs in ready state: 0 Jobs in running state: 140 Jobs in success state: 32 Jobs in failed state: 0
它是如何工作的.
GridMix 是 Hadoop 集群的基准测试。 它通常用于通过运行多个作业来对 Hadoop 集群的性能配置文件进行建模。
GridMix 所需的数据是通过运行generateGridmix2data.sh 脚本生成的。 我们可以将此文件配置为更改,例如,更改生成的数据文件的大小。 然后,在执行rungridmix_2脚本时,将以批处理模式生成并提交多个作业。 最后,计算出这些作业的运行时间。
GridMix2 附带以下代表性作业:streamSort、javaSort、webdataSort、combiner和monsterSort。 这些工作可分为以下几类:
- 由多阶段或流水线 MapReduce 作业驱动的三阶段 MapReduce 作业
- 大类可变键/值大小,这是由处理大数据集引起的
- 参考选择作业,其动机是从大量参考数据集中采样的作业
- API 文本排序作业,其动机是应用 MapReduce API 进行排序
GridMix 基准是来自不同类别的许多小型、中型和大型作业的混合。 我们可以在gridmix_config.xml文件中指定混合。 根据规范,将创建多个作业并将其提交到 Hadoop 集群,直到其完成。
还有更多...
除了使用 GridMix2 进行基准测试之外,我们还可以使用 GridMix1 和 GridMix3 对 Hadoop 集群进行基准测试。
以 GridMix1 为基准的 Hadoop 集群
GridMix1 的用法类似于 GridMix2。 可以使用以下步骤:
-
更改到 GridMix1 目录:
cd $HADOOP_HOME/src/benchmarks/gridmix -
Open the
gridmix-envfile with a text editor and change the configuration to the following:export HADOOP_HOME=/usr/local/Hadoop export GRID_MIX_HOME=$HADOOP_HOME/src/benchmarks/gridmix export APP_JAR=${HADOOP_HOME}/hadoop-test-*.jar export EXAMPLE_JAR=${HADOOP_HOME}/hadoop-examples-*.jar export STREAMING_JAR=${HADOOP_HOME}/contrib/streaming/hadoop-streaming-*.jar export GRID_MIX_DATA=/gridmix1/data export GRID_MIX_PROG=/gridmix1/programs备注
最后两个环境变量
GRID_MIX_DATA和GRID_MIX_PROG指定 HDFS 上的两个目录。 因此,生成的数据和程序将位于 HDFS 上。 -
使用以下命令使
generateData.sh脚本可执行:chmod +x generateData.sh -
Generate data with the following command:
sh ./generateData.shGridMix1 由许多高级脚本组成,用于控制基准作业的工作方式。 GridMix1 目录的树形结构如下所示:
gridmix ├── generateData.sh ├── gridmix-env ├── gridmix.jar ├── javasort │ ├── text-sort.large │ ├── text-sort.medium │ └── text-sort.small ├── maxent │ └── maxent.large ├── monsterQuery │ ├── monster_query.large │ ├── monster_query.medium │ └── monster_query.small ├── pipesort │ ├── text-sort.large │ ├── text-sort.medium │ └── text-sort.small ├── README ├── streamsort │ ├── text-sort.large │ ├── text-sort.medium │ └── text-sort.small ├── submissionScripts │ ├── allThroughHod │ ├── allToSameCluster │ ├── maxentHod │ ├── maxentToSameCluster │ ├── monsterQueriesHod │ ├── monsterQueriesToSameCluster │ ├── sleep_if_too_busy │ ├── textSortHod │ ├── textSortToSameCluster │ ├── webdataScanHod │ ├── webdataScanToSameCluster │ ├── webdataSortHod │ └── webdataSortToSameCluster ├── webdatascan │ ├── webdata_scan.large │ ├── webdata_scan.medium │ └── webdata_scan.small └── webdatasort ├── webdata_sort.large ├── webdata_sort.medium └── webdata_sort.small 8 directories, 36 files备注
GridMix1 目录包含几个大小不同的模板作业。 例如,
javasort目录中的三个脚本(text-sort.small、text-sort.medium和text-sort.large)是用于小型、中型和大型javasort作业的模板。 -
To run a small
javasortjob, we can use the following command:sh javasort/text-sort.small备注
我们可以使用类似的命令来运行中型和大型作业。
以 GridMix3 为基准的 Hadoop 集群
使用以下步骤为 Hadoop 集群构建 GridMix3 基准:
-
Copy the required JAR files to the Hadoop
libdirectory using the following commands:cp $HADOOP_HOME/hadoop-tools-*.jar $HADOOP_HOME/lib cp $HADOOP_HOME/contrib/gridmix/hadoop-gridmix-*.jar $HADOOP_HOME/lib备注
hadoop-tools-*.jar文件包含 GridMix3 所需的 Rumen 等工具。hadoop-gridmix-*.jar文件包含 GridMix3 基准测试工具。 此外,Hadoop 集群的 GridMix3 作业组合通常使用作业跟踪文件来描述,作业跟踪文件是使用 Rumen 从作业配置文件生成的。 -
Use Rumen to generate a job trace file with the following command:
hadoop org.apache.hadoop.tools.rumen.TraceBuilder -recursive file:///tmp/jobtrace.json file:///tmp/topology.out file:///usr/local/hadoop/logs/history/done该命令将生成一个作业跟踪文件
/tmp/jobtrace.json,在下一步中,我们将使用该文件作为 GridMix3 Hadoop 基准测试的输入。备注
有时,在运行此命令时可能会出现
CRC异常。 解决此问题的快速方法是删除相应作业配置文件的.crc文件,例如,作业配置文件job_201304051222_0192_conf.xml的校验和文件为job_201304051222_0192_conf.xml.crc。 我们可以删除后一个文件以忽略.crc检查。 -
Run the GridMix3 benchmark with the following command:
hadoop org.apache.hadoop.mapred.gridmix.Gridmix -generate 100m gridmixdata /tmp/jobtraces.json此命令将生成类似以下内容的输出:
13/04/01 22:57:11 INFO gridmix.SubmitterUserResolver: Current user resolver is SubmitterUserResolver 13/04/01 22:57:11 INFO gridmix.Gridmix: Submission policy is STRESS 13/04/01 22:57:11 INFO util.NativeCodeLoader: Loaded the native-hadoop library 13/04/01 22:57:11 WARN snappy.LoadSnappy: Snappy native library not loaded 13/04/01 22:57:11 INFO gridmix.CompressionEmulationUtil: GridMix is configured to generate compressed input data with a compression ratio of 0.5 13/04/01 22:57:11 INFO gridmix.Gridmix: Generating 100.0m of test data... 13/04/01 22:57:11 INFO gridmix.Statistics: Not tracking job GRIDMIX_GENERATE_INPUT_DATA as seq id is less than zero: -1 -
To acquire the usage and available parameters for GridMix3, we can use the following command:
hadoop org.apache.hadoop.mapred.gridmix.Gridmix此命令的输出如下所示:
The general command line syntax is bin/hadoop command [genericOptions] [commandOptions] Usage: gridmix [-generate <MiB>] [-users URI] [-Dname=value ...] <iopath> <trace> e.g. gridmix -generate 100m foo - Configuration parameters: General parameters: gridmix.output.directory : Output directory gridmix.client.submit.threads : Submitting threads ...
另请参阅
- 基准测试和分析 Hadoop 集群配方
- 参考http://hadoop.apache.org/docs/r1.1.2/rumen.html
- 请参阅$HADOOP_HOME/src/Benchmark/Readme.gridMix2
使用 Hadoop Vaidya 确定性能问题
HadoopVaidya是一个开源的、基于规则的 Apache Hadoop 性能诊断框架。 每条规则都可以识别特定的性能问题。 例如,Hadoop 集群管理员可以使用 Vaidya 来识别正在浪费集群资源的进度缓慢的作业。 Hadoop 客户端可以使用 Vaidya 来识别其提交的作业的配置错误。
Hadoop Vaidya 是可扩展的;用户可以使用自己的规则分析 Hadoop 作业。 在本食谱中,我们将概述配置 Hadoop Vaidya 以进行 Hadoop 集群性能诊断的步骤。
做好准备
在开始之前,我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到主节点计算机:
ssh hduser@master
怎么做……
要使用 Hadoop Vaidya,请执行以下步骤:
-
找到要分析的作业配置文件的目录。 此文件夹的默认位置为
$HADOOP_HOME/logs。 -
Locate the job history files under the job history directory with the following command:
find $HADOOP_HOME/logs -name 'job_201304012330_0001*'备注
此命令假定至少运行了一个作业,以便可以找到至少一个作业配置文件。 为了说明起见,我们假设在运行此命令之前
teragen作业已经完成。例如,在此命令中,我们希望获取作业 ID 为
job_201304012330_0001的作业的配置文件。 我们可以得到以下两行作为输出:logs/history/job_201304012330_0001_conf.xml logs/history/job_201304012330_0001_1364874504561_hduser_TeraGen备注
输出中的第一个 XML 文件是作业配置文件,第二个是作业日志文件。
-
Use Vaidya to analyze the job trace files with the following command:
sh $HADOOP_HOME/contrib/vaidya/bin/vaidya.sh -jobconf file:///usr/local/hadoop/logs/history/job_201304012330_0002_conf.xml -joblog file:///usr/local/hadoop/logs/history/job_201304012330_0002_1364874504561_hduser_TeraGen -report report.txt提示
请注意,文件位置应该是包含架构的绝对路径,即
hdfs://或file://。此命令将生成内容类似于以下内容的
report.txt文件:<?xml version="1.0" encoding="UTF-8" standalone="no"?><PostExPerformanceDiagnosticReport><JobInformationElement><JobTrackerID/><JobName>PiEstimator</JobName><JobType>MAP_REDUCE</JobType><User>hduser</User><SubmitTime>2013-04-17 19:46:49.213</SubmitTime><LaunchTime>2013-04-17 19:46:49.369</LaunchTime><FinishTime>2013-04-17 19:54:06.833</FinishTime><Status>SUCCESS</Status></JobInformationElement><TestReportElement><TestTitle>Balanaced Reduce Partitioning</TestTitle><TestDescription>This rule tests as to how well the input to reduce tasks is balanced</TestDescription><TestImportance>HIGH</TestImportance> <TestResult>NEGATIVE(PASSED)</TestResult> <TestSeverity>0.0</TestSeverity><ReferenceDetails>* TotalReduceTasks: 1 * BusyReduceTasks processing 0.85% of total records: 1 * Impact: 0.0</ReferenceDetails><TestPrescription>* Use the appropriate partitioning function * For streaming job consider following partitioner and hadoop config parameters * org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner * -jobconf stream.map.output.field.separator, -jobconf stream.num.map.output.key.fields</TestPrescription></TestReportElement><TestReportElement><TestTitle>Impact of Map tasks Re-Execution</TestTitle><TestDescription>This test rule checks percentage of map task re-execution impacting the job performance</TestDescription><TestImportance>HIGH</TestImportance> <TestResult>NEGATIVE(PASSED)</TestResult> <TestSeverity>0.0</TestSeverity><ReferenceDetails>* Total Map Tasks: 10 * Launched Map Tasks: 10 * Percent Maps ReExecuted: 0 * Impact: 0.0</ReferenceDetails><TestPrescription>* Need careful evaluation of why maps are re-executed. * It could be due to some set of unstable cluster nodes. * It could be due to application-specific failures.</TestPrescription></TestReportElement><TestReportElement><TestTitle>Impact of Reduce tasks Re-Execution</TestTitle><TestDescription>This test rule checks percentage of reduce task re-execution impacting the job performance</TestDescription><TestImportance>HIGH</TestImportance> <TestResult>NEGATIVE(PASSED)</TestResult> <TestSeverity>0.0</TestSeverity><ReferenceDetails>* Total Reduce Tasks: 1 * Launched Reduce Tasks: 1 * Percent Reduce Tasks ReExecuted: 0 * Impact: 0.0</ReferenceDetails><TestPrescription>* Need careful evaluation of why reduce tasks are re-executed. * It could be due to some set of unstable cluster nodes. * It could be due to application-specific failures.</TestPrescription></TestReportElement><TestReportElement><TestTitle>Map and/or Reduce tasks reading HDFS data as a side effect</TestTitle><TestDescription>This test rule checks if map/reduce tasks are reading data from HDFS as a side effect. The more data read as a side effect can potentially be a bottleneck across parallel execution of map/reduce tasks.</TestDescription><TestImportance>HIGH</TestImportance> <TestResult>POSITIVE(FAILED)</TestResult> <TestSeverity>0.99</TestSeverity><ReferenceDetails>* Total HDFS Bytes read: 2440 * Total Map Input Bytes read: 240 * Impact: 1.0</ReferenceDetails><TestPrescription>Map and/or Reduce tasks are reading application specific files from HDFS. Make sure the replication factor of these HDFS files is high enough to avoid the data reading bottleneck. Typically the replication factor can be the square root of map/reduce tasks capacity of the allocated cluster.</TestPrescription></TestReportElement><TestReportElement><TestTitle>Map side disk spill</TestTitle><TestDescription>This test rule checks if Map tasks are spilling the data on to the local disk during the map side sorting due to insufficient sort buffer size. The impact is calculated as ratio between local bytes written to map output bytes. Impact is normalized using NormalizationFactor given below and any value greater than or equal to normalization factor is treated as the maximum (i.e. 1).</TestDescription><TestImportance>LOW</TestImportance> <TestResult>POSITIVE(FAILED)</TestResult> <TestSeverity>0.33</TestSeverity><ReferenceDetails>* TotalMapOutputBytes: 180 * Total Local Bytes Written by Maps: 219400 * Impact: 1.0</ReferenceDetails><TestPrescription>* Use the combiner to lower the map output size. * Increase map side sort buffer size (io.sort.mb:100). * Increase index buffer size (io.sort.record.percent:0) if the number of Map Output Records is large. * Increase (io.sort.spill.percent:0), default 0.80 i.e. 80% of sort buffer size and index buffer size. </TestPrescription></TestReportElement></PostExPerformanceDiagnosticReport>
它是如何工作的.
我们可以使用以下命令获取 Vaidya 的选项:
$HADOOP_HOME/contrib/vaidya/bin/vaidya.sh -help
输出如下:
Invalid arguments: -jobconf or -joblog arguments are missing
Usage:
PostExPerformanceDiagnoser -jobconf <fileurl> -joblog <fileurl> [-testconf <filepath>] [-report <filepath>]
-jobconf <fileurl> : File path for job configuration file (e.g. job_xxxx_conf.xml). It can be on HDFS or
: local filesystem. It should be specified in the URL format.
: e.g. local file => file://localhost/Users/hadoop-user/job_0001_conf.xml
: e.g. hdfs file => hdfs://namenode:port/Users/hadoop-user/hodlogs/.../job_0001_conf.xml
-joblog <fileurl> : File path for job history logfile. It can be on HDFS or local file system.
: It should be specified in the URL format.
-testconf <filepath> : Optional file path for performance advisor tests configuration file. It should be available
: on local file system and be specified as as an absolute file path.
: e.g. => /Users/hadoop-user/postex_diagnosis_tests.xml. If not specified default file will be used
: from the hadoop-{ver}-vaidya.jar in a classpath.
: For user to view or make local copy of default tests, file is available at $HADOOP_HOME/contrib/vaidya/conf/postex_diagnosis_tests.xml
-report <filepath> : Optional file path for for storing diagnostic report in a XML format. Path should be available
: on local file system and be specified as as an absolute file path.
: e.g. => /Users/hadoop-user/postex_diagnosis_report.xml. If not specified report will be printed on console
-help : prints this usage
还有更多...
HiBench是一个针对 Hadoop 的基准测试套件。 它有 9 个典型的工作负载,包括 Micro、HDFS、网络搜索机器学习和数据分析基准。 例如,它支持Nutch(文本索引软件包)、PageRank(PageRank 算法)、Mahout 机器学习算法和配置单元查询的基准测试。
HiBench 项目和本文提供了很好的 Hadoop 基准测试示例。 有关更多信息,可以参考https://github.com/intel-hadoop/Hibench。
另请参阅
- 基准测试和分析 Hadoop 集群配方
- 使用 GridMix 配方对 Hadoop 集群进行基准测试的
** 参考http://hadoop.apache.org/docs/stable/vaidya.html*
*# 平衡 Hadoop 集群的数据块
HDFS 将数据块存储在 DataNode 机器上。 当 Hadoop 处理作业时,会生成和删除数据。 随着时间的推移,一些 DataNode 可以承载比其他数据块多得多的数据块。 集群上数据的这种不平衡分布称为数据倾斜。
数据不对称是 Hadoop 集群的一个大问题。 我们知道,当 JobTracker 将任务分配给 TaskTracker 时,它遵循的一般规则是数据本地,这意味着映射任务将分配给数据块所在的主机。 如果数据块存储分布不对称,或者换句话说,数据块只位于一小部分 DataNode 上,则只有那些具有数据块的节点才能遵循数据本地规则。 此外,如果 JobTracker 将任务分配给本地没有托管数据的其他节点,则需要将数据从远程计算机传输到 TaskTracker 计算机。 数据传输将耗费大量网络带宽,从而降低集群的整体性能。
为了解决 HDFS 上的数据不对称问题,Hadoop 附带了平衡器工具。 它可以手动或自动配置以重新平衡数据块。
做好准备
要开始使用平衡器,我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在正常运行。
使用以下命令从集群管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤使用平衡器平衡 HDFS 数据块:
-
Check the data skew through the web UI, for example, by the opening URL http://master:50070/.
该网页将类似于以下屏幕截图:
![How to do it...]()
屏幕截图显示数据块是倾斜的。 因此,再平衡是必要的。
-
Use the following command to balance the data blocks on the DataNode machines:
hadoop balancer -threshold 0.2备注
此命令需要一些时间才能完成,具体取决于分布式文件系统的状态以及
–threshold选项的值。-threshold选项指定集群是否平衡的阈值。 它是[0,1]范围内的实数,默认值为 0.1。 此选项的值越小,数据块的分布越均匀。 另一方面,它将需要更多的时间来完成。 不建议将此选项设置为0,因为要实现理想的平衡并不实际。 -
Alternatively, we can start the Hadoop balancer daemon to automatically balance the data blocks on HDFS. We can use the following command to do this:
start-balancer.sh平衡器将根据空间利用率在数据节点之间移动数据块。 例如,它会将数据块从利用率高的节点移动到利用率较低的节点。 这个过程是反复进行的。 我们可以在每次迭代后从 NameNode 获取更新后的 DataNode 信息。 如果集群已经平衡,我们将得到类似于以下内容的输出:
Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved 13/04/02 00:56:27 INFO net.NetworkTopology: Adding a new node: /default-rack/127.0.0.1:50010 13/04/02 00:56:27 INFO balancer.Balancer: 0 over utilized nodes: 13/04/02 00:56:27 INFO balancer.Balancer: 1 under utilized nodes: 127.0.0.1:50010 The cluster is balanced. Exiting... Balancing took 567.0 milliseconds -
要停止平衡器,可以使用以下命令:
stop-balancer.sh
…的工作原理
Hadoop 平衡器根据预配置的阈值平衡 HDFS 上的数据块,该阈值设置集群是否平衡的目标。 如果节点的空间利用率与集群的空间利用率之间的差值小于阈值,则认为该节点是平衡的。
有时,我们希望限制均衡器使用的带宽百分比。 默认情况下,Hadoop 定义了一个属性dfs.balance.bandwidthPerSec,该属性确定数据块从一个 DataNode 移动到另一个 DataNode 的最大速度。 其默认值为 1 MB/s。通过将此属性配置为更高的值,均衡速度会更快,但会占用更多资源。 例如,要将此属性的值更改为 10 MB/s,我们可以打开$HADOOP_HOME/conf/hdfs-site.xml文件并添加以下行:
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
备注
我们需要重新启动 HDFS 才能使此更改生效。
选择合适的块大小
HDFS 将数据存储为分布在多台机器上的个数据块。 因此,当一个大文件被放到 HDFS 上时,它将首先被分割成多个数据块。 然后,NameNode 将这些数据块分发到集群中的 DataNode。 数据块的粒度会影响任务的分布和并行执行。
根据正在执行的作业的属性,一个块大小可能会比其他块大小带来更好的性能。 我们将引导您完成为 Hadoop 集群配置适当块大小的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到主节点:
ssh hduser@master
怎么做……
使用以下步骤配置适当的 HDFS 块大小:
-
在配置的集群上运行典型作业。 例如,我们可以使用以下命令在集群上运行示例
terasort:hadoop jar $HADOOP_HOME/hadoop-example-*.jar terasort input output -
使用 Rumen 通过以下命令从作业历史文件和作业日志文件生成作业跟踪:
hadoop org.apache.hadoop.tools.rumen.TraceBuilder file:///tmp/jobtraces.json file:///tmp/topology.out file:///usr/local/hadoop/logs/history/done/ job_201304012206_0002_conf.xml -
Use GridMix3 to generate a Hadoop cluster benchmark with different block sizes:
hadoop org.apache.hadoop.mapred.gridmix.Gridmix -generate 10m input jobtraces.json备注
现在,我们可以找到实现最佳性能的块大小。 例如,通过将块大小设置为 64MB,我们可以获得最佳性能。
-
使用以下命令停止集群:
stop-all.sh -
使用您喜欢的文本编辑器打开
$HADOOP_HOME/conf/hdfs-site.xml文件,并将dfs.block.size属性更改为以下内容:<property> <name>dfs.block.size</name> <value>64</value> </property> -
使用以下命令启动 Hadoop 集群:
start-all.sh
对输入和输出使用压缩
典型的 MapReduce 作业使用并行映射器任务将数据从外部存储设备(如硬盘)加载到主内存。 作业完成后,Reduce 任务会将结果数据写回硬盘。 这样,在 MapReduce 作业的生命周期中,当数据在硬盘和主内存之间中继时,会创建许多数据副本。 有时,数据通过网络从远程节点复制。
从硬盘驱动器复制数据以及通过网络传输数据都是昂贵的操作。 为了降低这些操作的成本,Hadoop 对数据引入了压缩。
Hadoop 中的数据压缩是由压缩编解码器完成的,压缩编解码器是对数据流进行编码和解码的程序。 虽然压缩和解压缩会给系统带来额外的成本,但利大于弊。
在本节中,我们将概述在 Hadoop 集群上配置数据压缩的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有属性配置都将在$HADOOP_HOME/conf/mapred-site.xml文件中进行更改。
怎么做……
使用以下步骤配置 Hadoop 集群的输入和输出数据压缩:
-
使用以下命令停止集群:
stop-all.sh -
通过添加以下属性启用输出压缩:
<property> <name>mapred.output.compress</name> <value>true</value> </property> -
Specify the output compression codec by changing the following property:
<property> <name>mapred.output.compression.codec</name> <value>org.apache.hadoop.io.compress.GzipCodec</value> </property>备注
该属性指定 Hadoop 使用Gzip编解码器进行数据压缩。 其他可用的压缩编解码器包括
org.apache.hadoop.io.compress.GzipCodec、org.apache.hadoop.io.compress.BZip2Codec等。 此属性的默认值为org.apache.hadoop.io.compress.DefaultCodec。 -
Change the output compression type for sequence file output by changing the following property:
<property> <name>mapred.output.compression.type</name> <value>BLOCK</value> </property>备注
这会将序列文件输出压缩类型从默认类型
RECORD更改为BLOCK。 其他类型有NONE和RECORD。 通过将此属性设置为NONE,我们将禁用序列文件输出的压缩。 单个记录将使用RECORD压缩类型进行压缩,多个记录将使用BLOCK压缩类型进行压缩。 一般情况下,BLOCK压缩比RECORD压缩效率更高,推荐使用。 -
Configure the map output compression by changing the following property:
<property> <name>mapred.compress.map.output</name> <value>true</value> </property>备注
此配置将启用地图输出压缩。 要禁用它(这是默认设置),我们可以将值更改为
false,或者从配置文件中删除此配置属性。 -
与 MapReduce 作业输出的编解码器配置类似,我们可以为 map 任务输出执行配置压缩编解码器,默认编解码器为
org.apache.hadoop.io.compress.DefaultCodec。 例如,我们可以通过更改属性将地图输出压缩配置为 Gzip 编解码器,如以下代码所示:<property> <name>mapred.map.output.compression.codec</name> <value>org.apache.hadoop.io.compress.GzipCodec</value> </property> -
使用以下命令将配置文件从主节点复制到集群中的所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves' do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令重启 Hadoop 集群:
start-all.sh
它是如何工作的.
下表汇总了用于配置 Hadoop 数据压缩的属性:
|性质 / 财产 / 所有权
|
不履行 / 拖欠 / 未到庭 / 不到场
|
| --- | --- |
| mapred.output.compress | true |
| mapred.output.compression.type | RECORD |
| mapred.output.compression.codec | org.apache.hadoop.io.compress.DefaultCodec |
| mapred.compress.map.output | false |
| mapred.map.output.compression.codec | org.apache.hadoop.io.compress.DefaultCodec |
下表介绍了可用的压缩编解码器:
|编解码器名称
|
Java 类
|
| --- | --- |
| DefaultCodec | org.apache.hadoop.io.compress.DefaultCodec |
| GzipCodec | org.apache.hadoop.io.compress.GzipCodec |
| BZip2Codec | org.apache.hadoop.io.compress.BZip2Codec |
| SnappyCodec | org.apache.hadoop.io.compress.SnappyCodec |
| LzoCodec | org.apache.hadoop.io.compress.LzoCodec |
配置推测性执行
推测性执行是 JobTracker 在两个 TaskTracker 实例上执行一个任务时使用的一种主动性能提升策略。 当这两个任务中的任何一个任务完成时,另一个任务将被终止。 默认情况下,投机性执行处于启用状态。
推测性执行可以通过减少进展缓慢的任务的执行时间来帮助提高 MapReduce 作业的性能。 例如,在硬件配置不同的异构 Hadoop 集群上,低性能计算节点会大大延长 MapReduce 作业的执行时间。 推测性执行可以通过为 MapReduce 任务执行的高性能节点设置优先级来解决此问题。 因此,可以缩短 MapReduce 的执行时间。
另一方面,当大量资源用于推测执行时,推测执行会对集群的性能产生负面影响。 例如,许多任务将不得不等待用于推测性执行的槽。
在本配方中,我们将列出配置 Hadoop 推测性执行的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有属性配置都将对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
我们可以使用以下配方来配置 Hadoop 推测性执行:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Disable the map task speculative execution by changing the following property:
<property> <name>mapred.map.tasks.speculative.execution</name> <value>false</value> </property>备注
默认情况下,Hadoop 推测性执行处于打开状态。
-
通过更改以下属性禁用 Reduce 任务推测执行:
<property> <name>mapred.reduce.tasks.speculative.execution</name> <value>false</value> </property> -
Configure the maximum percentage of concurrently running speculative tasks by changing the following property:
<property> <name>mapreduce.job.speculative.speculativecap</name> <value>0.2</value> </property>备注
这最多将作业任务的 20%配置为推测性运行。
-
Configure the job speculative execution threshold for slow tasks by changing the following property:
<property> <name>mapreduce.job.speculative.slowtaskthreshold</name> <value>1.0</value> </property>备注
此属性用于测试是否需要推测性地执行任务。 其默认值为
1.0。 -
Configure the threshold for a TaskTracker to speculatively execute slow tasks by changing the following property:
<property> <name>mapreduce.job.speculative.slownodethreshold</name> <value>1.0</value> </property>备注
此属性用于测试 TaskTracker 是否有资格运行推测性任务。 其默认值为
1.0。 -
使用以下命令将配置同步到从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host sudo scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令启动 MapReduce 集群:
start-mapred.sh
它是如何工作的.
启用推测执行时,某些任务将被终止。 这可以通过打开 URLhttp://master:50030/进行验证。
该网页将类似于以下屏幕截图:

如果已经为 Hadoop 集群启用了推测性执行,我们仍然可以针对特定作业禁用它。 例如,当我们使用 Java 编程语言编写 MapReduce 作业时,我们可以使用以下代码片段来禁用该作业的推测性执行:
Configuration conf = new Configuration();
conf.set("mapred.map.tasks.speculative.execution", "false");
conf.set("mapred.reduce.tasks.speculative.execution", "false");
下表总结了我们在本配方中使用的属性及其默认值:
|性质 / 财产 / 所有权
|
默认值
|
| --- | --- |
| mapreduce.map.speculative | true |
| mapreduce.reduce.speculative | true |
| mapreduce.job.speculative.speculativecap | 0.1 |
| mapreduce.job.speculative.slowtaskthreshold | 1.0 |
| mapreduce.job.speculative.slownodethreshold | 1.0 |
三个属性mapreduce.job.speculative.speculativecap、mapreduce.job.speculative.slowtaskthreshold和mapreduce.job.speculative.slownodethreshold控制 JobTracker 应何时启动推测性任务。 具体地说,常规任务的推测性任务将在满足以下条件时开始:
- 已启用推测性执行
- 常规任务的完成率(以百分比表示)小于所有其他任务平均完成率的
mapreduce.job.speculative.slowtaskthreshold倍 - 常规任务的完成率(以百分比表示)小于
mapreduce.job.speculative.slownodethreshold倍于当前 TaskTracker 上所有其他任务的平均完成率 - 启动的投机任务数小于配置的投机上限
为 TaskTracker 设置适当数量的 MAP 和 Reduce 插槽
MAP 和 Reduce 插槽的数量决定了 TaskTracker 的并发 MAP/Reduce 任务的数量,它会派生多个 JVM 来运行这些任务。 在本指南中,我们将大致介绍如何为 TaskTracker 设置适当数量的这些插槽。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下步骤为 TaskTracker 配置映射/减少插槽:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Configure the map slots by adding the following property into the
$HADOOP_HOME/conf/mapred-site.xmlfile:<property> <name>mapred.takstracker.map.tasks.maximum</name> <value>4</value> </property>备注
TaskTracker 配置为有四个映射槽。
-
同样,我们可以为 TaskTracker 配置 Reduce 插槽的数量:
<property> <name>mapred.takstracker.reduce.tasks.maximum</name> <value>4</value> </property> -
通过添加以下属性配置每个插槽的内存使用情况:
<property> <name>mapred.child.java.opts</name> <value>-Xmx1024m</value> </property> -
使用以下命令将配置同步到所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令启动 MapReduce 集群:
start-mapred.sh
调整 JobTracker 配置
在 Hadoop 集群中,JobTracker 负责管理作业和任务。 JobTracker 的性能对整个集群至关重要。 Hadoop 提供了一些属性供管理员调优 JobTracker。 在本食谱中,我们将列出配置 JobTracker 的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有配置都在对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
使用以下步骤配置 JobTracker:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Configure the maximum number of tasks for a job by changing the following property:
<property> <name>mapred.jobtracker.maxtasks.per.job</name> <value>3000</value> </property>备注
此属性的默认值为
-1,它忽略该限制。 -
Configure the JobTracker to recover upon restart by changing the following property:
<property> <name>mapred.jobtracker.restart.recover</name> <value>true</value> </property>备注
默认情况下,此属性处于禁用状态,JobTracker 将重新启动。
-
Configure the block size for the job history file by changing the following property:
<property> <name>mapred.jobtracker.job.history.block.size</name> <value>3145728</value> </property>备注
将转储到磁盘的作业历史数据将用于作业恢复。
-
Configure the task scheduler for the JobTracker by changing the following property:
<property> <name>mapred.jobtracker.taskScheduler</name> <value>org.apache.hadoop.mapred.JobQueueTaskScheduler</value> </property>备注
此配置使
org.apache.hadoop.mapred.JobQueueTaskSchedulerJava 类能够调度任务。 -
Configure the maximum running tasks for a job by changing the following property:
<property> <name>mapred.jobtracker.taskScheduler.maxRunningTasksPerJob</name> <value>20</value> </property>备注
此属性设置每个作业在被作业计划程序抢占之前的最大任务数限制。 它与作业和任务的调度有关。
-
使用以下命令将配置从主节点同步到所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令重启 Hadoop 集群:
start-mapred.sh
…的工作原理
下表是属性的列表及其说明:
|性质 / 财产 / 所有权
|
不履行 / 拖欠 / 未到庭 / 不到场
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| mapred.jobtracker.maxtasks.per.job | -1 | 无限量的 / 无限责任的 / 无尽的 / 无限制的 |
| mapred.jobtracker.restart.recover | false | 无恢复无恢复 |
| mapred.jobtracker.job.history.block.size | 3145728 | |
| mapred.jobtracker.taskScheduler.maxRunningTasksPerJob | EMPTY | 无限制 |
另请参阅
调整 TaskTracker 配置
TaskTracker 从集群中的 JobTracker 接受任务,并派生 JVM 来运行任务。 可以根据集群的配置配置几个 TaskTracker 属性。
在本节中,我们将列出配置 TaskTracker 属性的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有配置都在对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
使用以下步骤配置 TaskTracker 属性:
-
使用以下命令停止 MapReduce 集群:
mapred-stop.sh -
Configure the MapReduce cluster heartbeat interval by changing the following property:
<property> <name>mapred.tasktracker.expiry.interval</name> <value>600000</value> </property>备注
此属性指定心跳时间间隔(以毫秒为单位),在此时间间隔之后,JobTracker 将标记为丢失。
-
Configure the sleep time before sending the SIGKILL signal by changing the following property:
<property> <name>mapred.tasktracker.tasks.sleeptime-before-sigkill</name> <value>6000</value> </property>备注
此属性配置在向进程发送 SIGTERM 信号之后,TaskTracker 在向进程发送 SIGKILL 信号之前等待的休眠时间(以毫秒为单位)。 其默认值为 5000 毫秒。
-
通过更改以下属性启用 TaskTracker 内存管理:
<property> <name>mapred.tasktracker.tasks.maxmemory</name> <value>true</value> </property> -
Configure the TaskTracker index cache size to be 20 MB by changing the following property:
<property> <name>mapred.tasktracker.indexcache.mb</name> <value>20</value> </property>备注
此属性配置向减少器提供映射输出时 TaskTracker 用于索引缓存的最大内存。
-
Configure the monitoring interval for the TaskTracker's task memory manager by changing the following property:
<property> <name>mapred.tasktracker.taskmemorymanager.monitoring-interval</name> <value>5000</value> </property>备注
此属性配置 TaskTracker 监视任务内存使用的间隔(以毫秒为单位)。 只有在使用
mapred.tasktracker.tasks.maxmemory属性启用了任务的内存管理时,它才有意义。 -
Configure the TaskTracker to send an out-of-band heartbeat on task completion by changing the following property:
<property> <name>mapreduce.tasktracker.outofband.heartbeat</name> <value>true</value> </property>备注
此属性的默认值为
false,表示禁用带外心跳。 启用此属性可以实现更好的延迟。 -
Configure the maximum number of retries for a map task by changing the following property:
<property> <name>mapred.map.max.attempts</name> <value>4</value> </property>备注
通过此配置,失败的任务最多会重试三次,然后才会被宣布失败。
-
Configure the maximum number of retries for a failed reduce task by changing the following property:
<property> <name>mapred.reduce.max.attempts</name> <value>4</value> </property>备注
与映射任务的最大尝试次数配置类似,此属性配置为在宣布失败之前最多重试失败的 Reduce 任务三次。
-
使用以下命令将配置从主节点同步到所有从节点:
```sh
for host in 'cat $HADOOP_HOME/conf/slaves'; do
echo 'Copying mapred-site.xml file to host: ' $host
scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/
done
```
- 使用以下命令重新启动 MapReduce 集群:
```sh
start-mapred.sh
```
…的工作原理
下表包含属性的列表及其说明:
|性质 / 财产 / 所有权
|
不履行 / 拖欠 / 未到庭 / 不到场
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| mapred.tasktracker.expiry.interval | 600000 | 以毫秒为单位 |
| mapred.tasktracker.tasks.sleeptime-before-sigkill | 5000 | 以毫秒为单位 |
| mapred.tasktracker.indexcache.mb | 10 | 以 MB 为单位 |
| mapred.tasktracker.taskmemorymanager.monitoring-interval | 5000 | 以毫秒为单位 |
| mapreduce.tasktracker.outofband.heartbeat | false | |
| mapred.map.max.attempts | 4 | |
| mapred.reduce.max.attempts | 4 | |
另请参阅
- 调整 JobTracker 配置配方
调整混洗、合并和排序参数
在 MapReduce 作业中,映射任务输出被聚合到 JVM 缓冲区中。 内存中缓冲区的大小决定了一次可以合并和排序的数据有多大。 缓冲区大小过小可能会导致大量交换操作,从而产生很大的开销。 在本节中,我们将展示配置随机、合并和排序参数的最佳实践。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有配置都在对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
使用以下步骤配置分类参数:
-
使用命令
stop-mapred.sh停止 MapReduce 集群
-
Configure the buffer size, in megabytes, for sorting by changing the property:
<property> <name>io.sort.mb</name> <value>100</value> </property>备注
为了最大限度地减少寻道,我们通常为每个合并流分配 1 MB。
-
Configure the merge factor by changing the following property:
<property> <name>io.sort.factor</name> <value>100</value> </property>备注
此属性配置排序文件时要合并的数据流的数量。 它确定打开的文件句柄的数量。 此属性的默认值为 10。
-
Change the percentage of buffer dedicated for record collection by changing the following property:
<property> <name>io.sort.record.percent</name> <value>0.05</value> </property>备注
此属性配置用于记录边界跟踪的内存百分比。 收集线程必须阻塞之前收集的最大记录数等于
io.sort.record.percent * io.sort.mb / 4。 -
Change the spill factor for buffers by changing the following property:
<property> <name>io.sort.spill.percent</name> <value>0.8</value> </property>备注
此属性对用于对集合进行排序或录制的内存中缓冲区实施软限制。 如果达到限制,后台线程将开始将数据溢出到磁盘。 该值不应小于 0.5。
-
Configure the in-memory merge threshold by changing the following property:
<property> <name>mapred.inmem.merge.threshold</name> <value>1000</value> </property>备注
此属性配置与内存中合并进程的文件数相关的阈值。 当累积的文件数量达到阈值时,合并过程将开始,结果将溢出到磁盘。 如果将此属性的值设置为等于或小于零,则将没有阈值,合并过程将仅由数据处理的内存消耗触发。
此属性的默认值为 1000。
-
Configure the percentage of memory to be allocated from the maximum heap size to storing map outputs during the shuffle by changing the following property:
<property> <name>mapred.job.shuffle.input.buffer.percent</name> <value>0.70</value> </property>备注
此属性根据最大堆大小配置在混洗阶段用于存储映射输出的内存百分比。
-
Configure the threshold to start the in-memory merge by changing the following property:
<property> <name>mapred.job.shuffle.merge.percent</name> <value>0.66</value> </property>备注
此属性配置内存中合并阈值。 百分比是根据由
mapred.job.shuffle.input.buffer.percent属性定义的混洗阶段期间分配给映射输出的内存来设置的。此属性的默认值为 0.66,约占内存的三分之二。
-
Configure the percentage of memory to retain map outputs during the reduce phase by changing the following property:
<property> <name>mapred.job.reduce.input.buffer.percent</name> <value>0.0</value> </property>备注
此属性根据最大堆大小配置在 Reduce 阶段用于存储映射输出的内存的百分比阈值。 要开始缩减阶段,映射输出使用的内存应该小于配置的阈值。
此属性的默认值为
0.0,这意味着启动 Reduce 阶段不需要映射输出内存消耗阈值。 -
Configure the maximum retries in case of fetch failures by changing the following property:
```sh
<property>
<name>mapreduce.reduce.shuffle.maxfetchfailures</name>
<value>10</value>
</property>
```
### 备注
此属性配置在提取失败时为提取映射输出而重试的减速器的最大次数。
- 使用以下命令将主节点的配置同步到集群中的所有从节点:
```sh
for host in 'cat $HADOOP_HOME/conf/slaves'; do
echo 'Copying mapred-site.xml file to host: ' $host
scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/
done
```
- 使用以下命令重新启动 MapReduce 集群:
```sh
start-mapred.sh
```
…的工作原理
下表显示了属性及其默认值的说明:
|性质 / 财产 / 所有权
|
不履行 / 拖欠 / 未到庭 / 不到场
|
| --- | --- |
| io.sort.mb | 100 |
| io.sort.factor | 10 |
| io.sort.record.percent | 0.05 |
| io.sort.spill.percent | 0.80 |
| mapred.inmem.merge.threshold | 1000 |
| mapred.job.shuffle.merge.percent | 0.66 |
| mapred.job.shuffle.input.buffer.percent | 0.70 |
| mapred.job.reduce.input.buffer.percent | 0.0 |
| mapreduce.reduce.shuffle.maxfetchfailures | 10 |
另请参阅
- 为 Hadoop 集群配置内存的配方
- 设置适当的并行副本数配方
为 Hadoop 集群配置内存
Hadoop 有几个内存配置属性。 它们的值应根据集群的配置进行设置。 在本食谱中,我们将概述配置这些内存属性的步骤。
做好准备
我们假设已经正确配置了 Hadoop 集群,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有配置都在对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
我们可以使用以下步骤配置 Hadoop 集群的内存属性:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Configure the virtual memory size, in megabytes, for a map task used by a scheduler by changing the following property:
<property> <name>mapred.cluster.map.memory.mb</name> <value>200</value> </property>备注
此属性根据虚拟内存配置映射插槽的调度程序使用的内存大小。 此属性的默认值为
-1,这将禁用此属性。 -
同样,我们可以通过更改以下属性来配置调度程序使用的 Reduce 任务的虚拟内存大小(以 MB 为单位):
<property> <name>mapred.cluster.reduce.memory.mb</name> <value>512</value> </property> -
Configure the maximum virtual memory size for a map task used by a scheduler by changing the following property:
<property> <name>mapred.cluster.max.map.memory.mb</name> <value>512</value> </property>备注
此属性类似于
mapred.cluster.map.memory.mb属性,但它配置最大内存大小。 -
通过更改以下属性配置计划程序使用的 Reduce 任务的最大虚拟内存大小:
<property> <name>mapred.cluster.max.reduce.memory.mb</name> <value>512</value> </property> -
Configure the maximum virtual memory size for a single map task for the job used by a scheduler by changing the following property:
<property> <name>mapred.job.map.memory.mb</name> <value>0.8</value> </property>备注
此任务的默认值为
-1,这将忽略此属性。 -
通过更改以下属性,为调度程序使用的作业配置单个 Reduce 任务的最大虚拟内存大小:
<property> <name>mapred.job.reduce.memory.mb</name> <value>0.8</value> </property> -
使用以下命令将主节点的配置同步到集群中的所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves' do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令启动 Hadoop 集群:
start-mapred.sh
它是如何工作的.
下表列出了属性及其说明:
|性质 / 财产 / 所有权
|
不履行 / 拖欠 / 未到庭 / 不到场
|
描述 / 描写 / 形容 / 类别
|
| --- | --- | --- |
| mapred.cluster.map.memory.mb | -1 | 未使用的功能 |
| mapred.cluster.reduce.memory.mb | -1 | 未使用的功能 |
| mapred.cluster.max.map.memory.mb | -1 | 未使用的功能 |
| mapred.cluster.max.reduce.memory.mb | -1 | 未使用的功能 |
| mapred.job.map.memory.mb | -1 | 未使用的功能 |
| mapred.job.reduce.memory.mb | -1 | 未使用的功能 |
另请参阅
- 为 TaskTracker配方设置适当数量的 MAP 和 Reduce 插槽
- 调优混洗、合并和排序参数配方
设置适当的并行份数
当全部或部分映射任务完成时,映射输出将从映射任务节点复制到 Reduce 任务节点。 采用并行复制策略来提高传输吞吐量。 通过调优此属性,我们可以提高 Hadoop 集群的性能。 在本配方中,我们将概述配置将映射输出传输到减速器的多副本数量的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
备注
在本配方中,我们假设所有配置都在对$HADOOP_HOME/conf/mapred-site.xml文件进行更改。
怎么做……
使用以下配方配置并行副本的数量:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Add or change, if it already exists, the following property:
<property> <name>mapred.reduce.parallel.copies</name> <value>20</value> </property>备注
此配置将并行副本数从默认值 10 更改为 20。
-
使用以下命令将配置同步到集群中的所有节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令重启 Hadoop 集群:
start-mapred.sh
另请参阅
- 调整 TaskTracker 配置配方
- 调优混洗、合并和排序参数配方
调整 JVM 参数
配置 JVM 属性在 Hadoop 集群的性能调优中扮演着非常重要的角色。 在本食谱中,我们将概述配置 JVM 的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下步骤配置 JVM 参数:
-
使用以下命令停止 Hadoop 集群:
stop-all.sh -
Open the
$HADOOP_HOME/conf/mapred-site.xmlfile and add or change, if it already exists, the following property:<property> <name>mapred.child.java.opts</name> <value>-Xmx512M</value> </property>备注
此属性配置 TaskTracker 子进程的 JVM 选项,默认情况下,子进程将具有与 TaskTracker 相同的选项。
或者,我们可以通过更改
mapred.map.child.java.opts和mapred.reduce.child.java.opts属性来分别配置 map 和 Reduce 进程的 JVM 选项。 -
使用以下命令将配置从主节点复制到集群中的所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令启动 MapReduce 集群:
start-all.sh
另请参阅
- 配置 JVM 重用配方
配置 JVM 重用
MapReduce 任务由 JVM 进程/线程执行,这些进程/线程由 TaskTracker 派生。 JVM 的创建(包括执行环境的初始化)成本很高,特别是在任务数量很大的情况下。 在默认配置中,完成一个作业所需的 JVM 数量应该等于任务的数量。 换句话说,默认设置使用一个 JVM 来执行一个任务。 当任务执行完成时,其 JVM 将被 TaskTracker 终止。
JVM****重用是针对多个任务重用 JVM 的优化。 如果启用它,则可以使用一个 JVM 顺序执行多个任务。
在本食谱中,我们将概述配置 JVM 重用的步骤。
做好准备
我们假设已经正确配置了 Hadoop 集群,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下配方配置 JVM 重用:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
Open the
$HADOOP_HOME/conf/mapred-site.xmlfile and add or change, if it already exists, the following property:<property> <name>mapred.job.reuse.jvm.num.tasks</name> <value>2</value> </property>备注
此属性将一个 JVM 配置为运行两个任务。 此属性的默认值为
1,表示禁用 JVM 重用。 如果将此属性设置为-1,则 JVM 可以执行的任务数量是无限制的。 -
使用以下命令将配置文件同步到所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令启动 Hadoop 集群:
start-mapred.sh
另请参阅
- 调优 JVM 参数配方
配置减速器初始化时间
当完成一定百分比的映射任务时,可以启动 Reduce 任务。 通过将此属性设置为较小的数字,Reduce 任务将更早开始,从而占用计算插槽。 另一方面,如果该数字设置得太大,例如非常接近1,则 Reduce 任务将不得不等待大多数映射任务完成,从而延长作业执行时间。 在本配方中,我们将概述配置减速器初始化的步骤。
做好准备
我们假设 Hadoop 集群已经正确配置,并且所有守护进程都在运行,没有任何问题。
使用以下命令从 Hadoop 集群管理员计算机登录到集群主节点:
ssh hduser@master
怎么做……
使用以下配方配置减速器初始化时间:
-
使用以下命令停止 MapReduce 集群:
stop-mapred.sh -
打开
$HADOOP_HOME/conf/mapred-site.xml文件并添加或更改(如果该文件已存在)以下属性:<property> <name>mapred.reduce.slowstart.completed.maps</name> <value>0.05</value> </property> -
使用以下命令将配置文件同步到所有从节点:
for host in 'cat $HADOOP_HOME/conf/slaves'; do echo 'Copying mapred-site.xml file to host: ' $host scp $HADOOP_HOME/conf/mapred-site.xml $host:$HADOOP_HOME/conf/ done -
使用以下命令重新启动 MapReduce 集群:
start-mapred.sh
另请参阅
- 调整 TaskTracker 配置配方
- 配置推测性执行配方****
八、使用 Amazon EC2 和 S3 构建 Hadoop 集群
在本章中,我们将介绍:
- 注册亚马逊网络服务(AWS)
- 管理 AWS 安全凭据
- 为 EC2 连接准备本地计算机
- 创建 Amazon 机器映像(AMI)
- 使用 S3 托管数据
- 使用新 AMI 配置 Hadoop 集群
简介
Amazon弹性云计算(EC2)和简单存储服务(S3)是由 Amazon Web Services(AWS)提供的云计算 Web 服务。 EC2 提供了平台即服务(PaaS),理论上我们可以在云上启动无限数量的服务器。 S3 在云上提供存储服务。 有关 AWS、EC2 和 S3 的更多信息,请访问aws.amazon.com。
从本书的前几章我们了解到,Hadoop 集群的配置需要大量的硬件投资。 例如,要设置 Hadoop 集群,需要许多计算节点和网络设备。 相比之下,借助 AWS 云计算,尤其是 EC2,我们可以以最低的成本和更少的工作量建立 Hadoop 集群。
在本章中,我们将讨论在 Amazon 云中配置 Hadoop 集群的主题。 我们将指导您完成向 AWS 注册、创建Amazon 机器映像(AMI)、使用新 AMI 配置 Hadoop 集群等步骤。
注册 Amazon Web Services(AWS)
要使用 AWS,需要注册。 注册 AWS 的步骤很简单。 在本食谱中,我们将概述执行此操作的步骤。
**## 做好准备
我们假设使用 GUI Web 浏览器进行 AWS 注册。 因此,我们假设您已经有一个可以访问互联网的 Web 浏览器。 此外,还需要准备个人信息来填写在线注册表。
怎么做……
我们将使用以下步骤注册 AWS:
-
使用 Web 浏览器打开以下链接:http://aws.amazon.com/。
-
Click on the Sign Up button on the upper-right corner of the window.
您将被定向到一个网页,如以下屏幕截图所示:
![How to do it...]()
-
用标签填写文本字段中的电子邮件地址我的电子邮件地址是:,然后选择I am a new user单选按钮,如上一个屏幕截图所示。
-
单击底部的Sign In Using Our Secure Server按钮上的,如上一个屏幕截图所示。
-
Fill the Login Credentials form, which includes name, e-mail, and password as shown in the following screenshot:
![How to do it...]()
-
单击底部的Continue按钮,如上一个屏幕截图所示。
-
Fill in the Contact Information, Security Check, and AWS Customer Agreement form as shown in the following screenshot:
![How to do it...]()
-
单击底部的Create Account and Continue按钮,如上一个屏幕截图所示。
-
So far, an AWS account has been created. Now we can log in to AWS with the newly created account by using the I am a returning user and my password is: option as shown in the following screenshot:
![How to do it...]()
-
By clicking on the Sign in using our secure server button at the bottom of the window, we will be able to log in to the AWS management console page with EC2 and S3 service available as shown in the following screenshot:

我们已成功完成注册步骤。
另请参阅
管理 AWS 安全凭据
安全凭证对于 EC2 和 S3 等 Web 服务至关重要。 它们用于远程访问 AWS 上的云服务器。 例如,在本章中,我们将使用这些凭据从客户端计算机远程登录到服务器。
AWS 提供 Web 界面来管理安全凭证。 本食谱将指导您完成创建、下载和管理这些安全凭据的步骤。
做好准备
在开始之前,我们假设您已成功注册 AWS;否则,您需要按照上一食谱中的步骤注册 AWS。
我们还假设我们有一台安装了 Linux(如 CentOS)的客户端计算机。 机器应该能够访问互联网,并且至少安装了一个 GUI Web 浏览器。
使用以下命令为存储 AWS 凭证的创建一个目录:
mkdir -v ~/.ec2
怎么做……
使用以下步骤管理 AWS 安全凭证:
-
打开 Web 浏览器并转到 URLaws.amazon.com。
-
Click on the My Account / Console drop-down button on the upper-left of the window as shown in the following screenshot:
![How to do it...]()
-
Click on the Security Credentials option in the drop-down list as shown in the previous screenshot.
如果您以前登录过 AWS,则可以访问安全凭证管理页面。 否则,将出现登录窗口。 您需要输入用户名和密码,然后使用我是返回用户,我的密码是:选项登录。
目前,Amazon AWS 有几种类型的凭据,如以下屏幕截图所示:
![How to do it...]()
-
Access Credentials include Access Keys, X.509 Certificates, and Key Pairs as shown in the following screenshot:
![How to do it...]()
-
By clicking on the Make Inactive link on the status column of the access keys table, we can make the access keys inactive. Inactive access keys can be made active again and can be deleted from the list.
![How to do it...]()
类似地,我们可以使 X.509 证书处于非活动状态,如前面的屏幕截图所示。 非活动证书可以重新激活或从列表中删除。
-
By clicking on the Create a new Certificate link, we will be able to create a new certificate as shown in the following screenshot:
![How to do it...]()
我们需要通过单击前一个屏幕截图中所示的按钮来下载私钥文件和 X.509 证书。 这些文件应受到保护,不得与任何其他人共享。
-
Key pairs used for EC2 can be managed from the management console as shown in the following screenshot:
![How to do it...]()
单击窗口顶部的Create Key Pair按钮可以创建新的密钥对。 将使用一个弹出窗口键入密钥对的名称。 并且,新创建的密钥对将被下载到本地计算机。
-
使用下面的命令将下载的密钥对复制到
.ec2文件夹:cp *.pem ~/.ec2/
它是如何工作的.
下表显示了每个安全凭据的用法:
|安全凭证
|
用于
|
| --- | --- |
| 访问凭据 | 访问键 | 保护 REST 或查询请求访问 AWS 服务 API。 |
| X.509 证书 | 向 AWS 服务 API 发出 SOAP 协议请求。 |
| 密钥对 | 启动并安全访问 EC2 实例。 |
| 登录凭据 | | 从门户网站登录 AWS。 |
| 帐户标识符 | | 在客户之间共享资源。 |
为 EC2 连接准备本地计算机
访问 EC2 需要本地客户端计算机。 例如,我们可以使用本地客户端计算机启动 EC2 实例、登录 EC2 上的实例等。 在本食谱中,我们将列出为 EC2 连接配置本地计算机的步骤。
做好准备
在开始之前,我们假设已向 AWS 注册并且已创建安全凭据。 我们还假设已经安装了一台安装了 Linux 的计算机。
怎么做……
使用以下步骤配置本地计算机以进行 EC2 远程访问:
-
Get the Access Key ID and the Secret Access Key from the security credentials web page as shown in the following screenshot:
![How to do it...]()
-
使用以下命令将密钥对移动到
.ec2目录:mv <key-pair-name>.pem ~/.ec2/ -
使用以下命令将私钥文件移动到
.ec2目录:mv pk-*.pem ~/.ec2/ -
Move the certificate file to the
.ec2directory using the following command:mv cert-*.pem ~/.ec2/从 URLhttp://aws.amazon.com/developertools/351下载 ec2 命令行工具。
-
使用以下命令解压缩 ZIP 文件:
unzip ec2-ami-tools.zip -
将以下内容添加到文件
~/.profile中:export EC2_HOME=~/ec2/ export AWS_ACCOUNT_ID=example@mail.com export EC2_PRIVATE_KEY=~/.ec2/pk-WXP232J7PL4TR5JKMUBJGH65DFNCYZGY.pem export EC2_CERT=~/.ec2/cert-WXP232J7PL4TR5JKMUBJGH65DFNCYZGY.pem export AWS_ACCESS_KEY_ID=AKIAJ7GAQT52MZKJA4WQ export AWS_SECRET_ACCESS_KEY=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 export PATH=$PATH:$EC2_HOME/bin -
将以下内容添加到文件
~/.bashrc中:. ~/.profile -
Test the configuration using the following command:
ec2-describe-images如果配置没有问题,我们将获得 AMI 列表;否则,我们将收到类似以下内容的错误消息:
Client.AuthFailure: AWS was not able to validate the provided access credentials
创建 Amazon 机器映像(AMI)
Amazon 机器映像(AMI)是 EC2 使用的机器映像。 AMI 是包含操作系统和软件包配置的模板。 我们可以从预先存在的或个性化的 AMI 启动 EC2 实例。 AWS 提供了大量可免费使用的公共 AMI。
通常有两种类型的 AMI,一种是 EBS 支持的 AMI(弹性块存储支持的 AMI),另一种是实例存储支持的 AMI。 在本食谱中,我们将首先概述创建实例存储支持的 AMI 的步骤,并简要介绍如何创建 EBS 支持的 AMI。
做好准备
在开始之前,我们假设您已成功注册 AWS。 此外,我们还假设已正确配置客户端计算机以连接到 AWS。
登录到本地计算机并安装
MAKEDEV实用程序使用以下命令:
sudo yum install -y MAKEDEV
使用以下命令安装 Amazon AMI 工具:
sudo rpm -ivh http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
Retrieving http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
Preparing... #################################### [100%]
1:ec2-ami-tools #################################### [100%]
怎么做……
使用以下步骤创建实例存储支持的 AMI:
-
Create an image file using the following command:
dd if=/dev/zero of=centos.img bs=1M count=1024此命令将发出以下消息:
1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 10.5981 s, 101 MB/s在此命令中,
if指定数据的输入,/dev/zero是 Linux 系统上的特殊设备,of指定命令的输出,其中我们指定文件名作为图像名称,bs指定块的大小,count是输入到输出的块数。 输出文件的大小centos.img由块大小和计数确定。 例如,前面的命令创建了一个大小为 1M x 1024 的图像文件,大小约为 1.0 GB。 -
Check the size of the image file using the following command:
ls -lh centos.img输出结果为:
-rw-rw-r--. 1 shumin shumin 1.0G May 3 00:14 centos.img -
Create a root filesystem inside the image file using the following command:
mke2fs -F -j centos.img输出消息将类似于以下内容:
mke2fs 1.42.3 (14-May-2012) Discarding device blocks: done Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 2621440 blocks 131072 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2684354560 80 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done -
使用以下命令在
/mnt目录下创建一个目录:sudo mkdir -v /mnt/centos -
使用以下命令将镜像文件挂载到文件夹:
sudo mount -o loop centos.img /mnt/centos -
使用以下命令在挂载的文件系统的根目录下创建
/dev目录:sudo mkdir -v /mnt/centos/dev -
Create a minimal set of devices using the following commands:
sudo /sbin/MAKEDEV -d /mnt/centos/dev -x console sudo /sbin/MAKEDEV -d /mnt/centos/dev -x null sudo /sbin/MAKEDEV -d /mnt/centos/dev -x zero这些命令将为我们提供以下输出:
MAKEDEV: mkdir: File exists MAKEDEV: mkdir: File exists MAKEDEV: mkdir: File exists出现这些警告消息的原因是父目录已经存在。 当
MAKEDEV命令尝试使用mkdir命令创建文件夹时,它将失败并显示此警告消息。 -
使用以下命令创建
fstab配置文件:sudo mkdir -pv /etc/fstab -
将以下内容放入文件:
/dev/sda1 / ext3 defaults 1 1 none /dev/pts devpts gid=5,mode=620 0 0 none /dev/shm tmpfs defaults 0 0 none /proc proc defaults 0 0 none /sys sysfs defaults 0 0 -
使用以下命令在镜像文件的根文件系统下创建
proc文件夹:
```sh
sudo mkdir -pv /mnt/centos/proc
```
- 使用以下命令将
proc文件系统装载到/mnt/centos/proc目录:
```sh
sudo mount -t proc none /mnt/centos/proc
```
- 使用以下内容创建 CentOS yum 存储库文件
/etc/yum.repos.d/centos.repo:
```sh
[centos]
name=centos
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://mirror.centos.org/centos-6/6.4/os/x86_64/
gpgkey=http://mirror.centos.org/centos-6/6.4/os/x86_64/RPM-GPG-KEY-CentOS-6
gpgcheck=1
protect=1
```
- Install the latest CentOS 6.3 operating system using the following command:
```sh
sudo yum --disablerepo=* --enablerepo=centos --installroot=/mnt/centos -y groupinstall Base
```
`--disablerepo`选项禁用所有可用的存储库,`--enablerepo`选项仅启用上一步中指定的 CentOS 存储库。
此命令将在挂载目录上启动 CentOS 6.3 的安装,这将需要一段时间,具体取决于网络速度和主机系统硬件配置。
- When the installation is complete, we can verify the installation using thefollowing command:
```sh
ls -lh /mnt/centos/
```
安装的操作系统的目录结构应该与常规安装的 Linux 的目录结构相同。 例如,输出将类似于以下内容:
```sh
total 108K
dr-xr-xr-x. 2 root root 4.0K May 3 01:12 bin
dr-xr-xr-x. 3 root root 4.0K May 3 01:13 boot
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 dev
drwxr-xr-x. 73 root root 4.0K May 3 02:00 etc
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 home
dr-xr-xr-x. 10 root root 4.0K May 3 01:12 lib
dr-xr-xr-x. 9 root root 12K May 3 01:11 lib64
drwx------. 2 root root 16K May 3 00:17 lost+found
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 media
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 mnt
drwxr-xr-x. 3 root root 4.0K May 3 01:12 opt
dr-xr-xr-x. 2 root root 4.0K Sep 23 2011 proc
dr-xr-x---. 2 root root 4.0K Sep 23 2011 root
dr-xr-xr-x. 2 root root 12K May 3 01:12 sbin
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 selinux
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 srv
drwxr-xr-x. 2 root root 4.0K Sep 23 2011 sys
drwxrwxrwt. 2 root root 4.0K May 3 01:13 tmp
drwxr-xr-x. 13 root root 4.0K May 3 01:02 usr
drwxr-xr-x. 19 root root 4.0K May 3 01:12 var
```
我们将通过以下步骤配置系统:
-
Create the network adapter configuration file,
/mnt/centos/etc/sysconfig/network-scripts/ifcfg-eth0, using the following content:DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes TYPE=Ethernet USERCTL=yes PEERDNS=yes IPV6INIT=no在此配置中,
BOOTPROTO指定使用 DHCP IP 地址分配。 -
通过在网络配置文件
/mnt/centos/etc/sysconfig/network:NETWORKING=yes中添加或更改
NETWORKING选项来启用联网 -
Add the following content into the
file /mnt/centos/etc/fstab:/dev/sda2 /mnt ext3 defaults 0 0 /dev/sda3 swap swap defaults 0 0这两行配置
swap和root分区的挂载点。 -
配置为使用以下命令启动必要的服务:
sudo chroot /mnt/centos /bin/sh chkconfig --level 345 network on exit -
使用以下命令卸载镜像文件:
sudo umount /mnt/centos/proc sudo umount -d /mnt/centos -
使用以下命令将私钥和 X.509 证书文件复制到实例中:
scp -i shumin.guo ~/.ec2/pk-*pem ~/.ec2/cert-*pem root@ec2-58-214-29-104.compute-1.amazonaws.com:~/.ec2/ -
Log in to the instance using the following command:
ssh -i ~/.ec2/shumin.guo.pem root@ec2-58-214-29-104.compute-1.amazonaws.com在此命令中,
ec2-58-214-29-104.compute-1.amazonaws.com是实例的公有域名。 -
Configure password-less login with the following commands:
ssh-keygen mkdir -v /mnt/centos/root/.ssh sudo cp ~/.ssh/id_* /mnt/centos/root/.ssh当系统提示您输入释义时,按Enter键将其留空。
-
使用以下命令将公钥复制到
authorized_keys文件:cat /mnt/centos/root/.ssh/id_rsa.pub >> /mnt/centos/root/.ssh/authorized_keys -
使用以下命令将本地 Java 安装文件复制到镜像文件夹:
```sh
sudo cp -r /usr/java/mnt/centos/usr
```
- 从镜像官方网站http://www.apache.org/dyn/closer.cgi/hadoop/common/下载最新的 Hadoop 发行版。
- 使用以下命令解压 Hadoop 包并创建符号链接:
```sh
sudo tar xvf hadoop-*.tar.gz -C /mnt/centos/usr/local/
sudo ln -s /mnt/centos/usr/local/hadoop-* /mnt/centos/usr/local/hadoop
```
- 将以下环境变量添加到文件
.bashrc:
```sh
export JAVA_HOME=/usr/java/latest
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
```
- 将以下内容添加到文件
$HADOOP_HOME/conf/core-site.xml中:
```sh
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
</property>
<configuration>
```
- 将以下内容添加到文件
$HADOOP_HOME/conf/mapred-site.xml中:
```sh
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp/hadoop-${user.name}/</value>
</property>
</configuration>
```
- 将以下内容添加到文件
$HAOOP_HOME/conf/hdfs-site.xml中:
```sh
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>/hadoop/mapred</value>
</property>
</configuration>
```
- 使用第 3 章、配置 Hadoop 集群中的食谱中概述的步骤下载并安装其他生态系统组件。
我们将使用以下步骤捆绑、上传和注册 AMI:
-
Bundle the loopback image file using the following command:
ec2-bundle-image -i centos.img -k .ec2/pk-*.pem -c .ec2/cert-*.pem -u 123412341234选项
-i指定图像文件名,-k指定私钥文件,-c指定证书文件,-u指定用户帐号,它是一个 12 位数字字符串。我们可以通过以下网址从 Web 用户界面获取帐号:https://portal.aws.amazon.com/gp/aws/manageYourAccount?。 账号位于窗口左上角,如以下屏幕截图所示:
![How to do it...]()
该命令将询问镜像的体系结构,然后它将把镜像与用户的安全凭证捆绑在一起,并将捆绑的镜像文件拆分成更小的文件。
输出消息将类似于以下内容:
Please specify a value for arch [x86_64]: Bundling image file... Splitting /tmp/centos.img.tar.gz.enc... Created centos.img.part.00 Created centos.img.part.01 Created centos.img.part.02 Created centos.img.part.03 Created centos.img.part.04 Created centos.img.part.05 Created centos.img.part.06 Created centos.img.part.07 Created centos.img.part.08 Created centos.img.part.09 Created centos.img.part.10 ... Generating digests for each part... Digests generated. Creating bundle manifest... ec2-bundle-image complete. -
Create a bucket from the S3 web interface as shown in the following screenshot:
![How to do it...]()
-
Type in the bucket name and select the region based on your location as shown in the following screenshot:
![How to do it...]()
-
Click on the Create Bucket button and the bucket will be successfully created as shown in the following screenshot:
![How to do it...]()
-
Upload the bundled file into S3 using the following command:
ec2-upload-bundle -b packt-bucket -m /tmp/centos.img.manifest.xml -a AKIAJ7GAQT52MZKJA4WQ -s QDHHZ0/Mj5pDYFWKpqEzXhwjqM1UB+cqjGQQ6l3S此命令会将捆绑的镜像部分上传到指定的存储桶(在本例中为
packt-bucket),该存储桶由-b选项指定。 选项-m指定清单文件的位置,选项-a指定访问密钥,-s指定密钥。 请注意,出于安全考虑,清单文件在上载之前将使用公钥进行加密。该命令将产生类似于以下内容的输出:
Uploading bundled image parts to the S3 bucket packt-bucket ... Uploaded centos.img.part.00 Uploaded centos.img.part.01 Uploaded centos.img.part.02 Uploaded centos.img.part.03 Uploaded centos.img.part.04 Uploaded centos.img.part.05 Uploaded centos.img.part.06 Uploaded centos.img.part.07 Uploaded centos.img.part.08 Uploaded centos.img.part.09 Uploaded centos.img.part.10 ... Uploading manifest ... Uploaded manifest. Bundle upload completed. -
When the upload completes, we can check the content of the bucket by clicking on the bucket name. The bucket should now contain all the image parts as well as the manifest file as shown in the following screenshot:
![How to do it...]()
-
Register the AMI using the following command:
ec2-register packt-bucket/image.manifest.xml -n packt-centos-6.4-x64 -O AKIAJ7GAQT52MZKJA4WQ -W QDHHZ0/Mj5pDYFWKpqEzXhwjqM1UB+cqjGQQ6l3S该命令将为我们提供新注册的 AMI 的 ID,如下所示:
IMAGE ami-9f422ff6备注
为了让 EC2 找到 AMI 并使用它运行实例,AMI 注册步骤是必需的。 请注意,一旦对存储在 S3 上的图像部件文件进行了更改,则需要重新注册才能使更改生效。
-
We can check the details of the new AMI using the following command:
ec2-describe-images ami-9f422ff6输出将类似于以下内容:
IMAGE ami-9f422ff6 869345430376/packt-centos-6.4-x64 869345430376 available private x86_64 machine instance-store paravirtual xen每列的含义为:
IMAGE标识符- 镜像的 ID
- 图像的来源
- 镜像所有者的 ID
- 映像的状态
- 图像的可见性(
public或private) - 附加到实例的产品代码(如果有)
- 镜像的体系结构(
i386或x86_64) - 图像类型(
machine、kernel或ramdisk) - 与映像关联的内核 ID(仅限机器映像)
- 与映像关联的 RAM 磁盘的 ID(仅限机器映像)
- 形象的平台
- 根设备的类型(
ebs或instance-store) - 虚拟化类型(
paravirtual或hvm) - 虚拟机管理程序类型(
xen或kvm)
-
Once the registration is completed, we can start an instance with the new AMI using the following command:
ec2-run-instances ami-9f422ff6 -n 1 -k shumin.guo此命令指定使用新的 AMI 运行实例,选项
-n指定要启动的实例数,选项-k指定用于登录这些实例的密钥对。输出将类似于以下内容:
RESERVATION r-ca8919aa 869345430376 default INSTANCE i-0020e06c ami-9f422ff6 pending shumin.guo 0 m1.small 2013-05-03T08:22:09+0000 us-east-1a monitoring-disabled instance-store paravirtual xen sg-7bb47b12 default false输出的第一行是预订信息,各列的含义为:
RESERVATION标识符- 预订的 ID
- 实例所有者的 AWS 帐户 ID
- 实例所在的每个安全组的名称
第二行显示实例信息,各列含义如下:
INSTANCE标识符。- 实例的 ID。
- 实例所基于的映像的 AMI ID。
- 与实例关联的公共 DNS 名称。 这仅适用于处于运行状态的实例。
- 与实例关联的专用 DNS 名称。 这仅适用于处于运行状态的实例。
- 实例的状态。
- 密钥名称。 如果密钥在启动时与实例关联,则会显示其名称。
- AMI 启动指数。
- 与实例关联的产品代码。
- 实例类型。
- 实例启动时间。
- 可用区。
- 内核的 ID。
- RAM 磁盘的 ID。
- 平台(Windows 或空)。
- 监控状态。
- 公有 IP 地址。
- 私有 IP 地址。
- [EC2-vpc]私有网络的 ID。
- [EC2-vPC]子网 ID。
- 根设备的类型(
ebs或instance-store)。 - 实例生命周期。
- Spot 实例请求 ID。
- 实例许可证。
- 集群实例所在的置放组。
- 虚拟化类型(
paravirtual或hvm)。 - 虚拟机管理程序类型(
xen或kvm)。 - 客户端令牌。
- 实例所在的每个安全组的 ID。
- 实例的租户(
default或dedicated)。 - 实例是否经过 EBS 优化(
true或false)。 - IAM角色的Amazon 资源名称(ARN)。
输出消息显示实例 ID 为
i-0020e06c。 -
After waiting for a while, we can check the status of the instance using the following command:
```sh
ec2-describe-instances i-0020e06c
```
输出将类似于以下内容:
```sh
RESERVATION r-ca8919aa 869345430376 default
INSTANCE i-0020e06c ami-9f422ff6 ec2-54-224-240-54.compute-1.amazonaws.com ip-10-34-102-91.ec2.internal running shumin.guo 0 m1.small 2013-05-03T08:22:09+0000 us-east-1a monitoring-disabled 54.224.240.54 10.34.102.91 instance-store paravirtual xen sg-7bb47b12 default false
```
实例状态告诉我们它处于**运行状态**。
或者,我们可以从 Web 用户界面检查实例的状态。 例如,我们可以获得类似以下截图的实例状态:

- Log in to the instance using the following command:
```sh
ssh -i ~/.ec2/shumin.guo.pem root@ec2-54-224-240-54.compute-1.amazonaws.com
```
在此命令中,`-i`指定用于登录的密钥对,`ec2-54-224-240-54.compute-1.amazonaws.com`是 EC2 实例的公共域名。
还有更多...
正如我们前面提到的,还有其他方法可以创建 AMI。 一种方法是从现有的 AMI 创建一个 AMI。 另一种方法是创建 EBS 支持的 AMI。
从现有 AMI 创建 AMI
本节列出了从现有 AMI 创建实例存储支持的 AMI 的个步骤。 我们假设您已向 AWS 注册,并已在本地计算机上成功配置安全凭据。 我们还假设您已经下载了密钥对并将其保存到正确的位置。
在本节中,我们假设私钥、证书和密钥对都位于.ec2文件夹中。
-
Start an instance from an existing AMI. For example, we can start an instance with the new AMI created in the Creating an Amazon Machine Image (AMI) recipe using the following command:
ec2-run-instances ami-9f422ff6 -n 1 -k shumin.guo此命令将从新的 AMI 启动一个实例。 密钥对
shumin.guo用于远程登录实例。 -
使用以下命令将私钥和 X.509 证书复制到实例中:
scp -i shumin.guo ~/.ec2/pk-*pem ~/.ec2/cert-*pem root@ec2-58-214-29-104.compute-1.amazonaws.com:~/.ec2/ -
使用以下命令登录实例:
ssh -i ~/.ec2/shumin.guo.pem root@ec2-58-214-29-104.compute-1.amazonaws.com -
使用以下命令配置无密码登录:
ssh-keygen -
系统将提示您输入释义;按Enter键将其留空。
ssh-copy-id localhost -
按照第 2 章,准备 Hadoop 安装的安装 Java 和其他工具配方中列出的步骤下载并安装 Java。
-
从http://www.apache.org/dyn/closer.cgi/hadoop/common/下载最新的 Hadoop 发行版。
-
使用以下命令解压 Hadoop 包并创建符号链接:
tar xvf hadoop-*.tar.gz -C /usr/local/ ln -s /usr/local/hadoop-* /usr/local/hadoop -
将以下环境变量添加到文件
.bashrc:export JAVA_HOME=/usr/java/latest export HADOOP_HOME=/usr/local/hadoop export PATH=$PATH:$HADOOP_HOME/bin -
将以下内容添加到文件
$HADOOP_HOME/conf/core-site.xml中:
```sh
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:54310</value>
</property>
<configuration>
```
- 将以下内容添加到文件
$HADOOP_HOME/conf/mapred-site.xml中:
```sh
<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop/tmp/hadoop-${user.name}/</value>
</property>
</configuration>
```
- 将以下内容添加到文件
$HAOOP_HOME/conf/hdfs-site.xml中:
```sh
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:54311</value>
</property>
<property>
<name>mapred.system.dir</name>
<value>/hadoop/mapred</value>
</property>
</configuration>
```
- 按照第 3 章、配置 Hadoop 集群中的食谱中概述的步骤下载并安装所有其他 Hadoop 生态系统组件。
- 使用以下命令安装 AMI 工具包:
```sh
rpm -ivh http://s3.amazonaws.com/ec2-downloads/ec2-ami-tools.noarch.rpm
```
- 使用以下命令禁用 SE Linux:
```sh
setenforce 0
```
- 使用以下命令禁用 iptables:
```sh
iptables -F
chkconfig iptables off
```
- Bundle the image using the following command:
```sh
ec2-bundle-vol -e ~/.ec2 -kpk-*pem -ccert-*.pem -u 123412341234
```
在此命令中,`-k`指定包含私钥的文件的名称,`-c`指定包含 X.509 证书的文件,`-u`指定当前用户没有破折号的 12 到 15 位计数 ID,`-e`指定包含私钥文件和证书文件的位置/目录。
- Upload the bundled AMI to S3 using the following command:
```sh
ec2-upload-bundle -b packt-bucket -m /tmp/image.manifest.xml -a AKIAJ7GAQT52MZKJA4WQ -p QDHHZ0/Mj5pDYFWKpqEzXhwjqM1UB+cqjGQQ6l3S
```
在此命令中,`-b`指定 S3 上的存储桶的名称,`-m`指定清单文件的位置,`-a`指定访问密钥字符串,`-p`指定密钥字符串。
- Register the AMI using the following command:
```sh
ec2-register packt-bucket/image.manifest.xml -n centos-hadoop-1.0 -O AKIAJ7GAQT52MZKJA4WQ-WQDHHZ0/Mj5pDYFWKpqEzXhwjqM1UB+cqjGQQ6l3S
```
在此命令中,第一个参数指定清单文件在 S3 存储桶中的位置,`-n`选项指定 AMI 的名称,`-O`指定访问密钥字符串,`-W`指定密钥字符串。
创建 EBS 支持的 AMI
从Web 管理控制台可以直接创建 EBS 支持的 AMI。 本节将指导您完成从正在运行的 EC2 实例创建 EBS 支持的 AMI 的步骤。 欲了解更多信息,请访问亚马逊官方文档http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#process_creating-an-ami-ebs。
使用以下步骤创建 EBS 支持的 AMI:
-
Go to https://console.aws.amazon.com/ec2/v2/home#Images: and filter the AMIs with conditions similar to the following screenshot:
![Creating an EBS-backed AMI]()
-
Start an instance by right-clicking on one of the AMIs and then click on Launch as shown in the following screenshot:
![Creating an EBS-backed AMI]()
-
When the instance is running, log in to the instance and make changes according to your requirements. Then, from the Web Management console, right-click on the running instance and then select Create Image (EBS AMI) as shown in the following screenshot:
![Creating an EBS-backed AMI]()
-
Go to the AMIs tab of the AWS web console and select Owned By Me; we will see that EBSAMI is being created as shown in the following screenshot:
![Creating an EBS-backed AMI]()
EC2 为新 AMI 创建快照。 与存储在 S3 中的映像部分文件类似,快照存储 EBS 支持的 AMI 的物理映像。
另请参阅
- 第 3 章,配置 Hadoop 集群的安装 HBase配方
- 第 3 章,配置 Hadoop 集群的安装配置单元配方
- 第 3 章,配置 Hadoop 集群的安装 Pig配方
- 第 3 章,配置 Hadoop 集群的安装 ZooKeeper配方
- 第 3 章,配置 Hadoop 集群的安装 Mahout配方
- 参考http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Tutorial_CreateImage.html
- 参考http://docs.aws.amazon.com/AWSEC2/latest/CommandLineReference/command-reference.html
使用 S3 托管数据
简单存储服务(S3)提供了方便的在线数据存储。 用户可以使用它来存储和检索数据。 有关 S3 的更多信息可以从http://aws.amazon.com/s3/获得。
本食谱将概述将 S3 配置为 MapReduce 的分布式数据存储系统的步骤。
做好准备
在开始之前,我们假设您已成功注册 AWS,并且客户端计算机已成功配置为可以访问 AWS。
怎么做……
使用以下步骤为数据存储配置 S3:
-
使用以下命令停止 Hadoop 集群:
stop-all.sh -
Open the file
$HADOOP_HOME/conf/core-site.xmland add the following contents into the file:<property> <name>fs.default.name</name> <!-- value>master:54310</value--> <value>s3n://packt-bucket</value> </property> <property> <name>fs.s3n.awsAccessKeyId</name> <value>AKIAJ7GAQT52MZKJA4WQ</value> </property> <property> <name>fs.s3n.awsSecretAccessKey</name> <value>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</value> </property>第一个属性将 Hadoop 配置为使用 S3 作为分布式文件系统。
-
Start the cluster using the following command:
start-mapred.sh提示
由于我们使用 S3 而不是 HDFS 作为数据存储文件系统,因此不再需要启动 HDFS 集群。
-
Check the configuration with S3 using the following command:
hadoop fs -ls /我们应该能够列出存储桶中的所有文件。 例如,我们应该看到以下内容:
Found 49 items -rwxrwxrwx 1 8560 2013-05-03 03:18 /centos.img.manifest.xml -rwxrwxrwx 1 10485760 2013-05-03 03:17 /centos.img.part.00 -rwxrwxrwx 1 10485760 2013-05-03 03:17 /centos.img.part.01 -rwxrwxrwx 1 10485760 2013-05-03 03:17 /centos.img.part.02 ...
使用新 AMI 配置 Hadoop 集群
使用新的 AMI 启动 Hadoop 集群非常简单明了。 本食谱将列出使用新 AMI 启动 Hadoop 集群的步骤。
做好准备
在开始之前,我们假设您已经注册了 AWS,并且已经成功创建了一个正确配置了 Hadoop 的新 AMI。
怎么做……
使用以下步骤配置带有 EC2 的 Hadoop 集群:
-
从命令行或 Web 界面运行多个实例。
-
After the instances are all in running state, run the following command to get the internal hostname of these instances:
ec2-describe-instances | grep running | egrep -o 'ip.*?internal' | sed -e 's/.ec2.internal//g' > nodes.txtnodes.txt文件将包含类似于以下内容的内容:ip-10-190-81-210 ip-10-137-11-196 ip-10-151-11-161 ip-10-137-48-163 ip-10-143-160-5 ip-10-142-132-17我们假设使用
ip-10-190-81-210节点作为主节点,并将该节点的公共域名用作ec2-174-129-127-90.compute-1.amazonaws.com。 -
从本地计算机使用以下命令将
nodes.txt文件复制到主节点:scp -i ~/.ec2/shumin.guo.pem nodes.txt ec2-user@ec2-174-129-127-90.compute-1.amazonaws.com:~/ -
使用以下命令登录新实例:
ssh -i ~/.ec2/shumin.guo.pem root@ec2-user@ec2-174-129-127-90.compute-1.amazonaws.com -
Use the following commands to create a
hostsfile:cp nodes.txt nodes.ip.txt cp nodes.txt slaves sed -i 's/ip-//g' nodes.ip.txt sed -i 's/-/./g' nodes.ip.txt sed -i '1d' slaves paste nodes.ip.txt nodes.txt > hosts主机文件应包含以下内容:
10.190.81.210 ip-10-190-81-210 10.137.11.196 ip-10-137-11-196 10.151.11.161 ip-10-151-11-161 10.137.48.163 ip-10-137-48-163 10.143.160.5 ip-10-143-160-5 10.142.132.17 ip-10-142-132-17 -
使用以下命令将主机文件移动到
/etc/hosts:for hosts in 'cat nodes.txt'; do echo 'Configuring /etc/hosts file for host : ' $host scp hosts $hosts:/etc/hosts done -
使用以下命令配置
slaves文件:cp slaves $HADOOP_HOME/conf/slaves -
使用文本编辑器打开文件
$HADOOP_HOME/conf/core-site.xml,并按如下方式更改fs.default.name:<property> <name>fs.default.name</name> <value>hdfs://ip-10-190-81-210:54310</value> </property> -
使用文本编辑器打开文件
$HADOOP_HOME/conf/mapred-site.xml,并按如下方式更改themapred.job.tracker属性:<property> <name>mapred.job.tracker</name> <value>ip-10-190-81-210:54311</value> </property> -
使用以下命令将配置复制到所有从节点:
```sh
for host in 'cat $HADOOP_HOME/conf/slaves'; do
echo "Copying Hadoop conifugration files to host: ' $host
scp $HADOOP_HOME/conf/{core,mapred}-site.xml $host:$HADOOP_HOME/conf
done
```
- Start the cluster using the following command:
```sh
start-dfs.sh
start-mapred.sh
```
当集群运行时,我们可以开始从主节点向集群提交作业。
还有更多...
使用 Amazon 云运行 MapReduce 的另一种方法是使用Amazon Elastic MapReduce(EMR)。 Amazon EMR 提供了一个基于 EC2 和 S3 的弹性并行计算平台。 数据和结果可以存储在 S3 上。 电子病历计算对于特殊的数据处理需求非常方便。
使用 Amazon Elastic MapReduce 进行数据处理
在使用 EMR 之前,我们假设您已注册 AWS。 已使用 S3 Web 控制台创建了 S3 存储桶(例如packt-bucket)。 在下面的菜谱中,我们将使用 Hadoop 示例的 JAR 包附带的wordcount作业作为示例。
我们将使用以下步骤使用电子病历进行数据处理:
-
在 S3Web Management控制台的存储桶下创建输入目录(名称为
input)和 Java 库目录(名称为jars)。 -
Upload data into the
inputfolder from the web console as shown in the following screenshot:![Data processing with Amazon Elastic MapReduce]()
-
Upload the required JAR file (
hadoop-examples-*.jarin this example) into thejarsdirectory.备注
如果您已经使用上一个配方中的命令配置了 S3,您还可以使用以下命令来完成前面的步骤:
hadoop fs -mkdir /jars /input hadoop fs -put $HADOOP_HOME/hadoop-examples-*.jar /jars hadoop fs -put words.txt /input -
words.txt包含wordcount作业的输入数据。 -
Click on the Create New Job Flow button as shown in the following screenshot:
![Data processing with Amazon Elastic MapReduce]()
-
Next, enter the Job Flow Name, select the Hadoop Version, and select the job flow type as shown in the following screenshot:
![Data processing with Amazon Elastic MapReduce]()
要测试简单的作业流,您可以选择运行示例应用。
-
Click on the Continue button at the bottom; the next window asks for the location of the JAR file and the parameters for running the Hadoop MapReduce job as shown in the following screenshot:
![Data processing with Amazon Elastic MapReduce]()
在此步骤中,我们需要指定 JAR 文件的位置和运行作业的参数。 规范应该类似于命令行中的选项规范,唯一的区别是所有文件都应该使用 S3 方案指定。
-
Click on Continue; we need to configure EC2 instances. By default, there will be one
m1.smallinstance as the master node and twom1.smallinstances as the slave nodes. You can configure the instance type and the number of instances based on the job properties (for example, big or small input data size, data intensive, or computation intensive). This step is shown in the following screenshot:![Data processing with Amazon Elastic MapReduce]()
-
单击继续按钮,我们将进入高级选项窗口。 例如,此窗口要求提供安全密钥对等引导选项。 在此步骤中,我们可以选择密钥对并使用所有其他密钥对作为默认值,然后单击继续。
-
我们将转到Bootstrap Actions窗口。 我们只需在此步骤中使用默认操作,然后单击 Continue。
-
The REVIEW window shows the options we have configured; if there is no problem, we can click on the Create Job Flow button to create an EMR job flow. This step is shown in the following screenshot:

- The job flow will be started and we can check the output when it completes. We can get its status from the web console as shown in the following screenshot:

另请参阅
- 第 3 章,配置 Hadoop 集群**

























































浙公网安备 33010602011771号