hadoop 操作实战 [中文版]


第 1 章 Hadoop 简介 本章内容 什么是 Hadoop Hadoop 项目及其结构 Hadoop 的体系结构 Hadoop 与分布式开发 Hadoop 计算模型—MapReduce Hadoop 的数据管理 小结 2   Hadoop 实战 1.1 什么是 Hadoop 1.1.1 Hadoop 概述 Hadoop 是 Apache 软件基金会旗下的一个开源分布式计算平台。以 Hadoop 分布式文 件 系 统(HDFS,Hadoop Distributed Filesystem) 和 MapReduce(Google MapReduce 的 开 源实现)为核心的 Hadoop 为用户提供了系统底层细节透明的分布式基础架构。HDFS 的 高容错性、高伸缩性等优点允许用户将 Hadoop 部署在低廉的硬件上,形成分布式系统 ; MapReduce 分布式编程模型允许用户在不了解分布式系统底层细节的情况下开发并行应用程 序。所以用户可以利用 Hadoop 轻松地组织计算机资源,从而搭建自己的分布式计算平台, 并且可以充分利用集群的计算和存储能力,完成海量数据的处理。 1.1.2 Hadoop 的历史 Hadoop 的源头是 Apache Nutch,该项目开始于 2002 年,是 Apache Lucene 的子项目 之 一。2004 年,Google 在“ 操 作 系 统 设 计 与 实 现 ”(OSDI,Operating System Design and Implementation)会议上公开发表了题为“MapReduce :Simplified Data Processing on Large Clusters”(MapReduce :简化大规模集群上的数据处理)的论文,之后受到启发的 Doug Cutting 等人开始尝试实现 MapReduce 计算框架,并将它与 NDFS(Nutch Distributed File System)结合,以支持 Nutch 引擎的主要算法。由于 NDFS 和 MapReduce 在 Nutch 引擎中 有着良好的应用,所以它们于 2006 年 2 月被分离出来,成为了一套完整而独立的软件,起 名为 Hadoop。到了 2008 年年初,Hadoop 已成为 Apache 的顶级项目,它被包括 Yahoo! 在 内的很多互联网公司所采用。现在,Hadoop 已经发展成为包含 HDFS、MapReduce、Pig、 ZooKeeper 等子项目的集合,用于分布式计算。 1.1.3 Hadoop 的功能与作用 我们为什么需要 Hadoop 呢?众所周知,现代社会的信息量增长速度极快,这些信息里 又积累着大量的数据,其中包括个人数据和工业数据。预计到 2020 年,每年产生的数字信 息将会有超过 1/3 的内容驻留在云平台中或借助云平台处理。我们需要对这些数据进行分析 和处理,以获取更多有价值的信息。那么我们如何高效地存储和管理这些数据,如何分析这 些数据呢?这时可以选用 Hadoop 系统,它在处理这类问题时,采用了分布式存储方式,提 高了读写速度,并扩大了存储容量。采用 MapReduce 来整合分布式文件系统上的数据,可 保证分析和处理数据的高效。与此同时,Hadoop 还采用存储冗余数据的方式保证了数据的 安全性。 Hadoop 中 HDFS 的高容错特性,以及它是基于 Java 语言开发的,这使得 Hadoop 可以 部署在低廉的计算机集群中,同时不限于某个操作系统。Hadoop 中 HDFS 的数据管理能力, MapReduce 处理任务时的高效率,以及它的开源特性,使其在同类的分布式系统中大放异 第 1 章 Hadoop 简介   3 彩,并在众多行业和科研领域中被广泛采用。 1.1.4 Hadoop 的优势 Hadoop 是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在 Hadoop 上开发和运行处理海量数据的应用程序。它主要有以下几个优点: 高可靠性。Hadoop 按位存储和处理数据的能力值得人们信赖。 高扩展性。Hadoop 是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇 可以方便地扩展到数以千计的节点中。 高效性。Hadoop 能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因 此其处理速度非常快。 高容错性。Hadoop 能够自动保存数据的多个副本,并且能够自动将失败的任务重新 分配。 1.1.5 Hadoop 的应用现状和发展趋势 由于 Hadoop 优势突出,基于 Hadoop 的应用已经遍地开花,尤其是在互联网领域。 Yahoo! 通过集群运行 Hadoop,以支持广告系统和 Web 搜索的研究 ;Facebook 借助集群 运行 Hadoop,以支持其数据分析和机器学习 ;百度则使用 Hadoop 进行搜索日志的分析 和网页数据的挖掘工作 ;淘宝的 Hadoop 系统用于存储并处理电子商务交易的相关数据 ; 中国移动研究院基于 Hadoop 的“大云”(BigCloud)系统用于对数据进行分析和并对外 提供服务。 2008 年 2 月,Hadoop 最大贡献者的 Yahoo!构建了当时规模最大的 Hadoop 应用,它们 在 2000 个节点上面执行了超过 1 万个 Hadoop 虚拟机器来处理超过 5PB 的网页内容,分析 大约 1 兆个网络连接之间的网页索引资料。这些网页索引资料压缩后超过 300TB。Yahoo ! 正是基于这些为用户提供了高质量的搜索服务。 Hadoop 目前已经取得了非常突出的成绩。随着互联网的发展,新的业务模式还将不 断涌现,Hadoop 的应用也会从互联网领域向电信、电子商务、银行、生物制药等领域拓 展。相信在未来,Hadoop 将会在更多的领域中扮演幕后英雄,为我们提供更加快捷优质 的服务。 1.2 Hadoop 项目及其结构 现在 Hadoop 已经发展成为包含多个子项目的集合。虽然其核心内容是 MapReduce 和 Hadoop 分布式文件系统(HDFS),但 Hadoop 下的 Common、Avro、Chukwa、Hive、HBase 等子项目也是不可或缺的。它们提供了互补性服务或在核心层上提供了更高层的服务。 图 1-1 展现了 Hadoop 的项目结构图。 下面将对 Hadoop 的各个子项目进行更详细的介绍。 4   Hadoop 实战 1)Core/Common : 从 Hadoop 0.20 版 本 开 始,Hadoop Core 项 目 便 更 名 为 Common。 Common 是为 Hadoop 其他子项目提供支持的常用工具,它主要包括 FileSystem、RPC 和串 行化库,它们为在廉价的硬件上搭建云计算环境提供基本的服务,并且为运行在该运平台上 的软件开发提供了所需的 API。 Pig Chukwa Hive HBase MapReduce HDFS ZooKeeper Core Avro 图 1-1 Hadoop 的项目结构图 2)Avro :Avro 是用于数据序列化的系统。它提供了丰富的数据结构类型、快速可压缩 的二进制数据格式、存储持久性数据的文件集、远程调用 RPC 的功能和简单的动态语言集成 功能。其中,代码生成器既不需要读写文件数据,也不需要使用或实现 RPC 协议,它只是一 个可选的对静态类型语言的实现。 Avro 系统依赖于模式(Schema),Avro 数据的读和写是在模式之下完成的。这样就可以 减少写入数据的开销,提高序列化的速度并缩减其大小。同时,也可以方便动态脚本语言的 使用,因为数据连同其模式都是自描述的。 在 RPC 中,Avro 系统的客户端和服务端通过握手协议进行模式的交换。因此当客户端 和服务端拥有彼此全部的模式时,不同模式下的相同命名字段、丢失字段和附加字段等信息 的一致性问题就得到了很好的解决。 3)MapReduce :MapReduce 是一种编程模型,用于大规模数据集(大于 1TB)的并行 运算。“映射”(map)、“化简”(reduce)等概念和它们的主要思想都是从函数式编程语言中 借来的。它使得编程人员在不了解分布式并行编程的情况下也能方便地将自己的程序运行在 分布式系统上。MapReduce 在执行时先指定一个 map(映射)函数,把输入键值对映射成一 组新的键值对,经过一定的处理后交给 reduce,reduce 对相同 key 下的所有 value 进行处理 后再输出键值对作为最终的结果。 图 1-2 是 MapReduce 的任务处理流程图,它展示了 MapReduce 程序将输入划分到不同 的 map 上,再将 map 的结果合并到 reduce,然后进行处理的输出过程。详细介绍请参考本 图 1-2 MapReduce 的任务处理流程图 第 1 章 Hadoop 简介   5 章的 1.3 节。 4)HDFS : 是 一 个 分 布 式 文 件 系 统。 由 于 HDFS 具 有 高 容 错 性(fault-tolerant) 的 特点,所以可以设计部署在低廉(low-cost)的硬件上。它可以通过提供高吞吐率(high throughput)来访问应用程序的数据,适合那些有着超大数据集的应用程序。HDFS 放宽了可 移植操作系统接口(POSIX,Portable Operating System Interface)的要求,这样就可以实现 以流的形式访问文件系统中的数据。HDFS 原本是开源的 Apache 项目 Nutch 的基础结构,最 后它成为了 Hadoop 的基础架构之一。 以下是 HDFS 的设计目标: 检测和快速恢复硬件故障。硬件故障是常见的问题,整个 HDFS 系统由数百台或数千 台存储着数据文件的服务器组成,而如此多的服务器意味着高故障率,因此,故障的 检测和自动快速恢复是 HDFS 的一个核心目标。 流式的数据访问。HDFS 使应用程序能流式地访问它们的数据集。HDFS 被设计成适 合进行批量处理,而不是用户交互式的处理。所以它重视数据吞吐量,而不是数据访 问的反应速度。 简化一致性模型。大部分的 HDFS 程序操作文件时需要一次写入,多次读取。一个文 件一旦经过创建、写入、关闭之后就不需要修改了,从而简化了数据一致性问题和高 吞吐量的数据访问问题。 通信协议。所有的通信协议都在 TCP/IP 协议之上。一个客户端和明确配置了端口的 名字节点(NameNode)建立连接之后,它和名称节点(NameNode)的协议便是客户 端协议(Client Protocal)。数据节点(DataNode)和名字节点(NameNode)之间则 用数据节点协议(DataNode Protocal)。 关于 HDFS 的具体介绍请参考本章的 1.3 节。 5)Chukwa :Chukwa 是开源的数据收集系统,用于监控和分析大型分布式系统的数据。 Chukwa 是在 Hadoop 的 HDFS 和 MapReduce 框架之上搭建的,它同时继承了 Hadoop 的可 扩展性和健壮性。Chukwa 通过 HDFS 来存储数据,并依赖于 MapReduce 任务处理数据。 Chukwa 中也附带了灵活且强大的工具,用于显示、监视和分析数据结果,以便更好地利用 所收集的数据。 6)Hive :Hive 最早是由 Facebook 设计的,是一个建立在 Hadoop 基础之上的数据仓库, 它提供了一些用于数据整理、特殊查询和分析存储在 Hadoop 文件中的数据集的工具。Hive 提供的是一种结构化数据的机制,它支持类似于传统 RDBMS 中的 SQL 语言来帮助那些熟 悉 SQL 的用户查询 Hadoop 中的数据,该查询语言称为 Hive QL。与此同时,那些传统的 MapReduce 编程人员也可以在 Mapper 或 Reducer 中通过 Hive QL 查询数据。Hive 编译器会 把 Hive QL 编译成一组 MapReduce 任务,从而方便 MapReduce 编程人员进行 Hadoop 应用 的开发。 7)HBase :HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Google 的论 文“Bigtable :一个结构化数据的分布式存储系统”。如同 Bigtable 利用了 Google 文件系统 6   Hadoop 实战 (Google File System)提供的分布式数据存储方式一样,HBase 在 Hadoop 之上提供了类似 于 Bigtable 的能力。HBase 是 Hadoop 项目的子项目。HBase 不同于一般的关系数据库,其 一,HBase 是一个适合于存储非结构化数据的数据库 ;其二,HBase 是基于列而不是基于行 的模式。HBase 和 Bigtable 使用相同的数据模型。用户将数据存储在一个表里,一个数据行 拥有一个可选择的键和任意数量的列。由于 HBase 表示疏松的,用户可以给行定义各种不同 的列。HBase 主要用于需要随机访问、实时读写的大数据(Big Data)。具体介绍请参考本书 第 12 章“HBase 详解”。 8)Pig :Pig 是一个对大型数据集进行分析和评估的平台。Pig 最突出的优势是它的 结构能够经受住高度并行化的检验,这个特性让它能够处理大型的数据集。目前,Pig 的底层由一个编译器组成,它在运行的时候会产生一些 MapReduce 程序序列,Pig 的语 言层由一种叫做 Pig Latin 的正文型语言组成。有关 Pig 的具体内容请参考本书第 14 章 “Pig 详解”。 上面讨论的 8 个子项目在本书中都有相应的章节进行详细的介绍。 1.3 Hadoop 的体系结构 如前面的内容所说,HDFS 和 MapReduce 是 Hadoop 的两大核心。而整个 Hadoop 的体 系结构主要是通过 HDFS 来实现对分布式存储的底层支持的,并且它会通过 MapReduce 来 实现对分布式并行任务处理的程序支持。 1.3.1 HDFS 的体系结构 我们首先介绍 HDFS 的体系结构,HDFS 采用了主从(Master/Slave)结构模型,一个 HDFS 集群是由一个 NameNode 和若干个 DataNode 组成的。其中 NameNode 作为主服务器, 管理文件系统的命名空间和客户端对文件的访问操作 ;集群中的 DataNode 管理存储的数据。 HDFS 允许用户以文件的形式存储数据。从内部来看,文件被分成若干个数据块,而且这若 干个数据块存放在一组 DataNode 上。NameNode 执行文件系统的命名空间操作,比如打开、 关闭、重命名文件或目录等,它也负责数据块到具体 DataNode 的映射。DataNode 负责处理 文件系统客户端的文件读写请求,并在 NameNode 的统一调度下进行数据块的创建、删除和 复制工作。图 1-3 给出了 HDFS 的体系结构。 NameNode 和 DataNode 都被设计成可以在普通商用计算机上运行。这些计算机通常运 行的是 GNU/Linux 操作系统。HDFS 采用 Java 语言开发,因此任何支持 Java 的机器都可以 部署 NameNode 和 DataNode。一个典型的部署场景是集群中的一台机器运行一个 NameNode 实例,其他机器分别运行一个 DataNode 实例。当然,并不排除一台机器运行多个 DataNode 实例的情况。集群中单一的 NameNode 的设计则大大简化了系统的架构。NameNode 是所有 HDFS 元数据的管理者,用户数据永远不会经过 NameNode。 第 1 章 Hadoop 简介   7 图 1-3 HDFS 的体系结构图 1.3.2 MapReduce 的体系结构 接下来介绍 MapReduce 的体系结构,MapReduce 是一种并行编程模式,这种模式使得 软件开发者可以轻松地编写出分布式并行程序。在 Hadoop 的体系结构中,MapReduce 是一 个简单易用的软件框架,基于它可以将任务分发到由上千台商用机器组成的集群上,并以一 种高容错的方式并行处理大量的数据集,实现 Hadoop 的并行任务处理功能。MapReduce 框 架是由一个单独运行在主节点上的 JobTracker 和运行在每个集群从节点上的 TaskTracker 共 同组成的。主节点负责调度构成一个作业的所有任务,这些任务分布在不同的从节点上。主 节点监控它们的执行情况,并且重新执行之前失败的任务 ;从节点仅负责由主节点指派的任 务。当一个 Job 被提交时,JobTracker 接收到提交作业和配置信息之后,就会将配置信息等 分发给从节点,同时调度任务并监控 TaskTracker 的执行。 从上面的介绍可以看出,HDFS 和 MapReduce 共同组成了 Hadoop 分布式系统体系结构 的核心。HDFS 在集群上实现了分布式文件系统,MapReduce 在集群上实现了分布式计算和 任务处理。HDFS 在 MapReduce 任务处理过程中提供了文件操作和存储等支持,MapReduce 在 HDFS 的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完 成了 Hadoop 分布式集群的主要任务。 1.4 Hadoop 与分布式开发 我们通常说的分布式系统其实是分布式软件系统,即支持分布式处理的软件系统,它 是在通信网络互联的多处理机体系结构上执行任务的,包括分布式操作系统、分布式程序设 计语言及其编译(解释)系统、分布式文件系统和分布式数据库系统等。Hadoop 是分布式 8   Hadoop 实战 软件系统中文件系统这一层的软件,它实现了分布式文件系统和部分分布式数据库的功能。 Hadoop 中的分布式文件系统 HDFS 能够实现数据在计算机集群组成的云上高效的存储和管 理,Hadoop 中的并行编程框架 MapReduce 能够让用户编写的 Hadoop 并行应用程序运行更 加简化。下面简单介绍一下基于 Hadoop 进行分布式并发编程的相关知识,详细的介绍请参 看后面有关 MapReduce 编程的章节。 Hadoop 上的并行应用程序开发是基于 MapReduce 编程框架的。MapReduce 编程模型的 原理是 :利用一个输入的 key/value 对集合来产生一个输出的 key/value 对集合。MapReduce 库的用户用两个函数来表达这个计算:Map 和 Reduce。 用户自定义的 map 函数接收一个输入的 key/value 对,然后产生一个中间 key/value 对的 集合。MapReduce 把所有具有相同 key 值的 value 集合在一起,然后传递给 reduce 函数。 用户自定义的 reduce 函数接收 key 和相关的 value 集合。reduce 函数合并这些 value 值, 形成一个较小的 value 集合。一般来说,每次 reduce 函数调用只产生 0 或 1 个输出的 value 值。通常我们通过一个迭代器把中间的 value 值提供给 reduce 函数,这样就可以处理无法全 部放入内存中的大量的 value 值集合了。 图 1-4 是 MapReduce 的数据流图,这个过程简而言之就是将大数据集分解为成百上千 个小数据集,每个(或若干个)数据集分别由集群中的一个节点(一般就是一台普通的计算 机)进行处理并生成中间结果,然后这些中间结果又由大量的节点合并,形成最终结果。图 1-4 也指出了 MapReduce 框架下并行程序中的三个主要函数:map、reduce、main。在这个结 构中,需要用户完成的工作仅仅是根据任务编写 map 和 reduce 两个函数。 图 1-4 MapReduce 的数据流图 MapReduce 计算模型非常适合在大量计算机组成的大规模集群上并行运行。图 1-4 中的每 一个 map 任务和每一个 reduce 任务均可以同时运行于一个单独的计算节点上,可想而知,其 运算效率是很高的,那么这样的并行计算是如何做到的呢?下面将简单介绍一下其原理。 1. 数据分布存储 Hadoop 分布式文件系统(HDFS)由一个名称节点(NameNode )和 N 个数据节点 (DataNode)组成,每个节点均是一台普通的计算机。在使用方式上 HDFS 与我们熟悉的单 机文件系统非常类似,它可以创建目录,创建、复制和删除文件,以及查看文件的内容等。 但 HDFS 底层把文件切割成了 Block,然后这些 Block 分散地存储于不同的 DataNode 上,每 个 Block 还可以复制数份数据存储于不同的 DataNode 上,达到容错容灾的目的。NameNode 则是整个 HDFS 的核心,它通过维护一些数据结构来记录每一个文件被切割成了多少个 第 1 章 Hadoop 简介   9 Block、这些 Block 可以从哪些 DataNode 中获得,以及各个 DataNode 的状态等重要信息。 2. 分布式并行计算 Hadoop 中 有 一 个 作 为 主 控 的 JobTracker, 用 于 调 度 和 管 理 其 他 的 TaskTracker, JobTracker 可以运行于集群中的任意一台计算机上。TaskTracker 则负责执行任务,它必须运 行于 DataNode 上,也就是说 DataNode 既是数据存储节点,也是计算节点。 JobTracker 将 map 任务和 reduce 任务分发给空闲的 TaskTracker,让这些任务并行运行,并负责监控任务 的运行情况。如果某一个 TaskTracker 出了故障,JobTracker 会将其负责的任务转交给另一 个空闲的 TaskTracker 重新运行。 3. 本地计算 数据存储在哪一台计算机上,就由哪台计算机进行这部分数据的计算,这样可以减少数 据在网络上的传输,降低对网络带宽的需求。在 Hadoop 这类基于集群的分布式并行系统中, 计算节点可以很方便地扩充,它所能够提供的计算能力近乎无限,但是由于数据需要在不同 的计算机之间流动,故网络带宽变成了瓶颈,“本地计算”是一种最有效的节约网络带宽的 手段,业界把这形容为“移动计算比移动数据更经济”。 4. 任务粒度 把原始大数据集切割成小数据集时,通常让小数据集小于或等于 HDFS 中一个 Block 的 大小(默认是 64MB),这样能够保证一个小数据集是位于一台计算机上的,便于本地计算。 有 M 个小数据集待处理,就启动 M 个 map 任务,注意这 M 个 map 任务分布于 N 台计算机 上,它们会并行运行,reduce 任务的数量 R 则可由用户指定。 5. 数据分割(Partition) 把 map 任务输出的中间结果按 key 的范围划分成 R 份(R 是预先定义的 reduce 任务的 个数),划分时通常使用 hash 函数(如 :hash(key) mod R),这样可以保证某一范围内的 key 一定是由一个 reduce 任务来处理的,可以简化 Reduce 的过程。 6. 数据合并(Combine) 在数据分割之前,还可以先对中间结果进行数据合并(Combine),即将中间结果中有相 同 key 的 对合并成一对。Combine 的过程与 reduce 的过程类似,很多情况下可 以直接使用 reduce 函数,但 Combine 是作为 map 任务的一部分,在执行完 map 函数后紧接 着执行的。Combine 能够减少中间结果中 对的数目,从而降低网络流量。 7. Reduce Map 任务的中间结果在做完 Combine 和 Partition 之后,以文件形式存于本地磁盘 上。中间结果文件的位置会通知主控 JobTracker,JobTracker 再通知 reduce 任务到哪一个 DataNode 上去取中间结果。注意,所有的 map 任务产生的中间结果均按其 key 值用同一个 hash 函数划分成了 R 份,R 个 reduce 任务各自负责一段 key 区间。每个 reduce 需要向许多 个 map 任务节点取得落在其负责的 key 区间内的中间结果,然后执行 reduce 函数,形成一 10   Hadoop 实战 个最终的结果文件。 8. 任务管道 有 R 个 reduce 任务,就会有 R 个最终结果,很多情况下这 R 个最终结果并不需要合并 成一个最终结果,因为这 R 个最终结果又可以作为另一个计算任务的输入,开始另一个并行 计算任务,这也就形成了任务管道。 这里简要介绍了在并行编程方面 Hadoop 中 MapReduce 编程模型的原理、流程、程序结 构和并行计算的实现,MapReduce 程序的详细流程、编程接口、程序实例等请参见后面章节。 1.5 Hadoop 计算模型—MapReduce MapReduce 是 Google 公司的核心计算模型,它将运行于大规模集群上的复杂的并行计 算过程高度地抽象为了两个函数 :map 和 reduce。Hadoop 是 Doug Cutting 受到 Google 发表 的关于 MapReduce 的论文的启发而开发出来的。Hadoop 中的 MapReduce 是一个使用简易的 软件框架,基于它写出来的应用程序能够运行在由上千台商用机器组成的大型集群上,并以 一种可靠容错的方式并行处理上 T 级别的数据集,实现了 Hadoop 在集群上的数据和任务的 并行计算与处理。 一个 MapReduce 作业(job) 通常会把输入的数据集切分为若干个独立的数据块,由 map 任务(task)以完全并行的方式处理它们。框架会先对 map 的输出进行排序,然后把结 果输入给 reduce 任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务 的调度和监控,以及重新执行已经失败的任务。 通常,MapReduce 框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计 算节点和存储节点在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任 务,这可以使整个集群的网络带宽被非常高效的利用。 MapReduce 框架由一个单独的 master JobTracker 和集群节点上的 slave TaskTracker 共同组成。master 负责调度构成一个作业的所有任务,这些任务分布在不同的 slave 上。 master 监控它们的执行情况,并重新执行已经失败的任务,而 slave 仅负责执行由 master 指派的任务。 在 Hadoop 上运行的作业需要指明程序的输入 / 输出位置(路径),并通过实现合适的 接口或抽象类来提供 map 和 reduce 函数。同时还需要指定作业的其他参数,构成作业配置 (job configuration)。在 Hadoop 的 jobclient 提交作业(jar 包 / 可执行程序等)和配置信息给 JobTracker 之后,JobTracker 会负责分发这些软件和配置信息给 slave 及调度任务,并监控它 们的执行,同时提供状态和诊断信息给 jobclient。 1.6 Hadoop 的数据管理 前面重点介绍了 Hadoop 及其体系结构和计算模型 MapReduce,现在开始介绍 Hadoop 第 1 章 Hadoop 简介   11 的数据管理,主要包括 Hadoop 的分布式文件系统 HDFS、分布式数据库 HBase 和数据仓库 工具 Hive 的数据管理。 1.6.1 HDFS 的数据管理 HDFS 是分布式计算的存储基石,Hadoop 分布式文件系统和其他分布式文件系统有很多 类似的特质: 对于整个集群有单一的命名空间; 具有数据一致性。适合一次写入多次读取的模型,客户端在文件没有被成功创建之前 是无法看到文件存在的; 文件会被分割成多个文件块,每个文件块被分配存储到数据节点上,而且会根据配置 由复制文件块来保证数据的安全性。 从前面的介绍和图 1-3 可以看出,HDFS 通过三个重要的角色来进行文件系统的管理 : NameNode、DataNode 和 Client。NameNode 可以看做是分布式文件系统中的管理者,主要 负责管理文件系统的命名空间、集群配置信息和存储块的复制等。NameNode 会将文件系统 的 Metadata 存储在内存中,这些信息主要包括文件信息、每一个文件对应的文件块的信息 和每一个文件块在 DataNode 中的信息等。 DataNode 是文件存储的基本单元,它将文件块 (Block)存储在本地文件系统中,保存了所有 Block 的 Metadata,同时周期性地将所有存在 的 Block 信息发送给 NameNode。Client 就是需要获取分布式文件系统文件的应用程序。以 下通过三个具体的操作来说明 HDFS 对数据的管理。 (1)文件写入 1) Client 向 NameNode 发起文件写入的请求。 2)NameNode 根据文件大小和文件块的配置情况,返回给 Client 它所管理的 DataNode 的信息。 3)Client 将文件划分为多个 Block,根据 DataNode 的地址信息,按顺序将其写入每一 个 DataNode 块中。 (2)文件读取 1) Client 向 NameNode 发起读取文件的请求。 2) NameNode 返回文件存储的 DataNode 信息。 3)Client 读取文件信息。 (3)文件块(Block)复制 1) NameNode 发现部分文件的 Block 不符合最小复制数这一要求或部分 DataNode 失效。 2)通知 DataNode 相互复制 Block。 3)DataNode 开始直接相互复制。 HDFS 作为分布式文件系统在数据管理方面还有几个值得借鉴的功能: 文件块(Block)的放置 :一个 Block 会有三份备份,一份放在 NameNode 指定的 DataNode 上,另一份放在与指定的 DataNode 不在同一台机器上的 DataNode 上,最 12   Hadoop 实战 后一份放在与指定的 DataNode 在同一 Rack 上的 DataNode 上。备份的目的是为了数 据安全,采用这种配置方式主要是考虑同一 Rack 失败的情况,以及不同 Rack 之间的 数据拷贝会带来的性能问题。 心跳检测 :用心跳检测 DataNode 的健康状况,如果发现问题就采取数据备份的方式 来保证数据的安全性。 数 据 复 制( 场 景 为 DataNode 失 败、 需 要 平 衡 DataNode 的 存 储 利 用 率 和 平 衡 DataNode 数据交互压力等情况):使用 Hadoop 时可以用 HDFS 的 balancer 命令配置 Threshold 来平衡每一个 DataNode 的磁盘利用率。假设设置了 Threshold 为 10%,那 么执行 balancer 命令的时候,首先会统计所有 DataNode 的磁盘利用率的平均值,然 后判断如果某一个 DataNode 的磁盘利用率超过这个均值,那么将会把这个 DataNode 的 block 转移到磁盘利用率低的 DataNode 上,这对于新节点的加入来说十分有用。 数据校验 :采用 CRC32 做数据校验。在写入文件 Block 的时候,除了写入数据外还 会写入校验信息,在读取的时候则需要校验后再读入。 单个 NameNode :如果失败,任务处理信息将会记录在本地文件系统和远端的文件系 统中。 数据管道性的写入 :当客户端要写入文件到 DataNode 上时,客户端首先会读取一个 Block,然后写到第一个 DataNode 上,接着由第一个 DataNode 将其传递到备份的 DataNode 上,直到所有需要写入这个 Block 的 DataNode 都成功写入后,客户端才会 开始写下一个 Block。 安全模式 :分布式文件系统启动的时候会有安全模式(系统运行期间也可以通过命令 进入安全模式),当分布式文件系统处于安全模式时,文件系统中的内容不允许修改 也不允许删除,直到安全模式结束。安全模式主要是为了在系统启动的时候检查各 个 DataNode 上的数据块的有效性,同时根据策略进行必要的复制或删除部分数据块。 在实际操作过程中,若在系统启动时修改和删除文件会出现安全模式不允许修改的错 误提示,只需要等待一会儿即可。 1.6.2 HBase 的数据管理 HBase 是一个类似 Bigtable 的分布式数据库,它的大部分特性和 Bigtable 一样,是一个 稀疏的、长期存储的(存在硬盘上)、多维度的排序映射表。这张表的索引是行关键字、列 关键字和时间戳。每个值是一个不解释的字符数组,数据都是字符串,没有类型。用户在 表格中存储数据,每一行都有一个可排序的主键和任意多的列。由于是稀疏存储的,所以 同一张表里面的每一行数据都可以有截然不同的列。列名字的格式是“:

pdf贡献者

xxstong

贡献于2016-09-17

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf