《Hadoop技术详解》一2.4 读写数据

2.4 读写数据

客户端可以通过多种不同的工具和应用程序接口(参见2.8节“访问与集成”)对HDFS进行读写操作,这些操作都遵循着同样的流程。在某些层面,客户端可能要使用到Hadoop库函数,因为只有Hadoop库函数才清楚知道HDFS的具体细节和相关语法。函数库封装了大部分与NameNode 和DataNode通信相关的细节,同时也考虑了分布式文件系统在诸多场景中的错误处理机制。

2.4.1 数据读取流程

首先,我们来看一下HDFS数据读取操作的处理逻辑。假设,HDFS中已经存储了一个文件/user/esammer/foo.txt,要读取文件,Hadoop客户端程序库(通常是Java的JAR文件)是必不可少的。同时,客户端还必须有集群配置数据的副本,因为它包含了NameNode的位置信息(参见第5章)。如图2-2所示,客户端首先要访问NameNode,并告诉它所要读取的文件,当然,这之前必须对客户的身份进行确认。客户身份确认有两种方式:一种是通过信任的客户端,由其指定用户名;第二种方式是通过诸如Kerberos(参见第6章)等强认证机制来完成。接下来还必须检查文件的所有者及其设定的访问权限。如果文件确实存在,而且用户对这个文件有访问权限,这时NameNode就会告诉客户端这个文件的第一个数据块的标号以及保存有该数据块的DataNode列表。这个列表是根据DataNode与客户端间的距离进行了排序的。客户端与DataNode之间的距离是根据Hadoop集群的机架拓扑结构计算得到的。机架拓扑结构记录了主机机架位置的配置信息(有关机架拓扑配置的更多详情,请参见第5.9节“机架拓扑”)。

在NameNode因为自身原因或网络故障无法访问时,客户端会收到超时或异常出错消息,数据读取操作也就无法继续。

有了数据块标号和DataNode的主机名,客户端便可以直接访问最合适的DataNode,读取所需要的数据块。这个过程会一直重复直到该文件的所有数据块读取完成或客户端主动关闭了文件流。

从DataNode读取数据时,可能会发生进程或主机异常结束的情况。这时,数据读操作不会停止,HDFS 程序库会自动尝试从其他有数据副本的DataNode中读取数据。如果所有数据副本都无法访问,则读取操作失败,客户端收到异常出错消息。还有一种情况,当客户端试图从DataNode中读取数据时,NameNode返回的数据块位置信息已经过期。这时如果还有其他DataNode保存有该数据块副本,客户端会尝试从那些DataNode中读取数据,否则至此读取操作就会失败。这些情况很少发生,但对Hadoop这样的大规模分布式系统而言,一旦发生,调查分析过程就会异常复杂。第9章将介绍什么情况可能导致出错以及如何诊断这类问题。

2.4.2 数据写操作流程

HDFS写数据操作比读取数据操作要相对复杂些。我们先来看个最简单的例子:客户端要在集群中创建一个新文件,当然客户端并不一定要真正实现这里介绍的逻辑,在这里只是作为一个例子来介绍Hadoop库函数是如何将数据写入到集群中的。其实应用程序开发人员可以像操作传统的本地文件一样,用他们熟悉的应用程序接口(API)打开文件、写入流,然后关闭流即可。

首先,客户端通过Hadoop文件系统相关API发送请求打开一个要写入的文件,如果该用户有足够的访问权限,这一请求就会被送到NameNode,并在NameNode上建立该文件的元数据。刚建立的新文件元数据并未将该文件和任何数据块关联,这时客户端会收到“打开文件成功”的响应,然后就可以开始写入数据了。当然在API层面会返回一个标准的Java流对象,这一实现只是针对HDFS的。当客户端将数据写入流时,数据会被自动拆分成数据包(这里,不要和TCP数据包或HDFS数据块混淆),并将数据包保存在内存队列中。客户端有一个独立的线程,它从队列中读取数据包,并同时向NameNode请求一组DataNode列表,以便写入下一个数据块的多个副本。接着,客户端直接连接到列表中的第一个DataNode,而该DataNode又连接到第二个DataNode,第二个又连接到第三个上……这样就建立了数据块的复制管道,如图2-3所示。数据包以流的方式写入第一个DataNode的磁盘,同时传入管道中的下一个DataNode并写入其磁盘,依此类推。复制管道中的每一个DataNode都会确认所收数据包已经成功写入磁盘。客户端应用程序维护着一个列表,记录哪些数据包尚未收到确认消息。每收到一个响应,客户端便知道数据已经成功地写入到管道中的一个DataNode。当数据块被写满时,客户端将重新向NameNode申请下一组DataNodes。最终,客户端将剩余数据包全部写入磁盘,关闭数据流并通知NameNode文件写操作已经完成。

然而,凡事绝非如此简单,出现问题在所难免。最常见的情况是,复制管道中的某一DataNode无法将数据写入磁盘(磁盘翘了辫子或DataNode死机)。发生这种错误时,管道会立即关闭,已发送的但尚未收到确认的数据包会被退回到队列中,以确保管道中错误节点的下游节点可以获得数据包。而在剩下的健康数据节点中,正在写入的数据块会被分配新的ID。这样,当发生故障的数据节点恢复后,冗余的数据块就好像不属于任何文件而被自动丢弃,由剩余数据节点组成的新复制管道会重新开放,写入操作得以继续。此时,雨过天晴,写操作将继续直至文件关闭。NameNode如果发现文件的某个数据块正在复制,就会异步地创建一个新的复制块,这样,即便集群的多个数据节点发生错误,客户端仍然可以从数据块的副本中恢复数据,前提是满足要求的最少数目的数据副本已经被正确写入(默认的最少数据副本是1)。

时间: 2024-11-23 07:15:49

《Hadoop技术详解》一2.4 读写数据的相关文章

《Hadoop技术详解》一导读

前 言 Hadoop技术详解本书采用的约定本书采用以下排版约定. 斜体 用于表明新的术语.URL.电子邮件地址.文件名和文件扩展名. 等宽字体 用于程序清单,正文段落中有关的程序元素,如变量及函数名.数据库.数据类型.环境变量.语句和关键字等. 等宽加粗字体 用于显示命令或应由用户输入的其他文本. 等宽斜体字体 表明这里的文本需要被替换成用户提供的值或由其他上下文确定的值. 目 录 第1章 简介第2章 HDFS 2.1 目标和动机2.2 设计2.3 守护进程2.4 读写数据2.5 管理文件系统元

《Hadoop技术详解》一第1章 简介

第1章 简介 Hadoop技术详解 在过去的几年里,数据的存储.管理和处理发生了巨大的变化.各个公司存储的数据比以前更多,数据来源更加多样,数据格式也更加丰富.这不是因为我们变成了林鼠(译注:林鼠喜欢收集各种物品),而是因为我们想要创造出可以让我们进一步了解某一领域的产品.功能以及对其智能预测(这个领域可以是指用户.数据搜索.机器日志或者是某机构的任何信息).为了更好地服务其成员,各组织正在寻找新的方式来使用那些曾经被认为没有什么价值或者存储起来过于昂贵的数据.采集和存储数据只是其中的一部分工作

《策略驱动型数据中心——ACI技术详解》——第1章 数据中心架构考虑因素1.1 应用和存储

第1章 数据中心架构考虑因素 本章介绍数据中心架构所需考虑的因素.其中将介绍设计时的考虑因素和设计过程中使用的方法,以便对于数据中心矩阵项目,使架构师能高效地选择端到端的网络设计,为其演进提供所需的增长能力. 在数据中心网络设计过程中,在架构选择和最终设计方面需要注意以下一些关键考虑因素. 要托管在数据中心的应用和这些应用将使用的存储类型. 数据中心的需求和限制,包括物理决策和POD模型. 不同类型的数据中心设计. 大多数的数据中心矩阵部署是用于虚拟化数据中心的.本章还介绍了数据中心的其他应用场

《策略驱动型数据中心——ACI技术详解》一1.3 数据中心设计

1.3 数据中心设计 策略驱动型数据中心--ACI技术详解数据中心网络基础架构设计,还包括定义交换机如何互联和如何保证网络中的数据通信.在包含接入.汇聚和核心的三层设计方法中,思科vPC是数据中心最常用的部署技术.还有一种被称之为"主干-叶节点"的新型两层矩阵的设计方法.这两种方法都会在本章后面的"采用主干-叶节点的ACI基础架构的逻辑数据中心设计"小节中介绍. 物理数据中心有3种基本的设计方法:列端式(EoR).列中式(MoR)和架顶式(ToR).该命名约定表示网

《Hadoop技术详解》一2.1 目标和动机

2.1 目标和动机 Apache Hadoop的重要组成部分是Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem).HDFS的设计初衷是为了支持高吞吐和超大文件的流式读写操作.传统的大型存储区域网络(Storage Area Network, SAN)和网络附加存储(Network Attached Storage, NAS)给TB级的块设备或文件系统提供了一种集中式的低延时数据访问解决方案.因为SAN和NAS支持全功能POSIX语法,具有很好的存储

《Hadoop技术详解》一2.8 访问与集成

2.8 访问与集成 本地访问HDFS的唯一方式是通过其提供的Java应用程序接口,其他的访问方式都是经过定义并建立在这些应用程序接口之上的,而且只能提供这些接口所允许的功能.为了使应用更容易使用和开发,HDFS借用了大量像Java I/O流这样的概念,因而HDFS 应用程序接口对开发者来讲非但不陌生,而且还非常简单.当然HDFS也对这些应用程序接口做了一些改动,以确保提供其所宣称的那些功能,但大部分的改动很容易理解,而且有很详细的文档. 为了访问HDFS,客户端--也就是用应用程序接口编写的应用

《Hadoop技术详解》一2.2 设计

2.2 设计 HDFS在很多方面都遵循了传统文件系统的设计思想.譬如文件以不透明的数据块形式存储,通过元数据管理文件名和数据块的映射关系.目录树结构.访问权限等信息.这些和普通的Linux文件系统(如ext3)是非常相似的.那么,HDFS又有什么与众不同的地方呢? 传统文件系统是内核模块(至少在Linux中是这样的)和用户空间工具,然后通过挂载的形式提供给终端用户使用.但是HDFS却是一种用户空间文件系统.具体来说,文件系统代码以OS进程和扩展的形式运行在内核之外,而无须注册在Linux VFS

《Hadoop技术详解》一2.6 NameNode的高可用性

2.6 NameNode的高可用性 因为管理员的主要职责是确保大规模系统的服务质量和可用性,单点故障(single point of failure)可能会给我们带来麻烦,甚至带来非常糟糕的后果.不幸的是,长期以来,HDFS的NameNode就是困扰我们的单点故障问题.近来,Hadoop社区投入大量的人力来提升NameNode的高可用性,使Hadoop可以在更多重要应用场景下部署. NameNode 高可用性(或称HA)是通过部署一对主/备NameNode的方式来实现的.主/备NameNode都

《Hadoop技术详解》一2.7 NameNode联盟

2.7 NameNode联盟 很多Hadoop用户心里一直不爽:对存储在NameNode内存中的元数据大小有限制.为了冲破单个NameNode服务器中物理内存的限制,需要一种大规模系统来取代之前的按比例增长模式.正如HDFS的块存储一样,可以将文件系统元数据分布存储在多台主机上,这一技术被称之为命名空间联盟(Namespace Federation),即通过一组自治系统来组织一个逻辑名字空间.Linux文件系统是一个例子:多个设备被动态地配置在一个名字空间下,客户端可以方便地通过寻址访问就该名字