hadoop 学习笔记(一)hadoop 数据流

文件读取解析

为了了解客户端及与之交互的HDFS、namenode和datanode之间的数据流是什么样的,我们可以参考图1,该图显示了在读取文件时一些事件的主要顺序。

                                                          图1 客户端读取HDFS中的数据

1. 客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统(图1的步骤1)的一个实例。

2. DistributedFileSystem通过使用RPC来调用namenode,以确定文件起始块的位置(步骤2)。对于每一块,namenode返回存有该块复本的datanode地址。此外,这些datanode根据他们与客户端的距离来排序。如果该客户端本身就是一个datanode,并保存有相应数据块的一个复本时,该节点将从本地datanode中读取数据。

3. 接着,客户端对这个输入流调用read()方法(方法3)。存储这文件起始块的datanode地址的DFSInputStream随即连接距离最近的datanode。通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端(步骤4)。 达到块的末端时,DFSInputStream会关闭与该datanode的连接,然后寻找下一块的最佳datanode(步骤5)。客户端只需要读取连续的流,并且对于客户端都是透明的。

4. 客户端从流中读取数据时,块是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也需要询问namenode来检索下一批所需块的datanode的位置。一旦客户端完成读取,就对FSDataInputStream调用close()方法(步骤6)。


在读取数据的时候,如果DFSInputStream在与datanode通信时遇到错误,他便会尝试从这个块的另外一个最近邻datanode读取数据。它也会记住那个故障datanode,以保证以后不会反复读取该节点上的后续的块。 DFSInputStream也会通过校验和确认从datanode发来的数据是否完整。如果发现一个损坏的块,它就会在DFSInputStream试图从其他datanode读取一个块的复本之前通知namenode。


这个设计的一个重点是,namenode告知客户端每个块中最佳的datanode,并让客户端直接联系该datanode且读取数据。由于数据分散在集群中的所有datanode,所以这种设计能使HDFS可扩展到大量的并发客户端,而namenode仅需要相应块位置的请求(这些信息存储在内存中,因而非常高效)。


文件写入解析

接下来我们看看文件是如何写入HDFS的。我们要考虑的情况是如何创建一个新文件,并把数据写入该文件,最后关闭该文件。如图2。


客户端通过对DistributedFileSystem对象调用create() 函数来创建文件(步骤1)。DistributedFileSystem对namenode创建一个RPC调用,在文件系统的命名空间中创建一个新文件,此时该文件还没有相应的数据块(步骤2)。namenode执行各种检查,确保这个文件不存在,并且客户端有创建该文件的权限。如果这些检查均通过,namenode就会为创建新文件记录一条记录;否则,文件创建失败并向客户端抛出一个IOException异常。DistributedFileSystem向客户端返回一个FSDataOutputStream对象,由此客户端可以开始写入数据。

在客户端写入数据时(步骤3),DFSOutputStream将它分成一个个的数据包,并写入内部队列,称为"数据队列" (data queue)。DataStreamer处理数据队列,它的责任是根据datanode列表来要求namenode分配适合的新块来存储数据备份。这一组datanode构成一个管线---我们假设复本数为3,所以管线中有3个节点。DataStreamer将数据包流式传输到管线中的第一个datanode,该datanode存储数据包并将它发送到管线中的第二个datanode。同样的,第二个datanode存储该数据包并且发送给管线中的第三个datanode(步骤4)。

DFSOutputStream也维护着一个内部数据包队列来等待datanode的收到确认回执,成为"确认队列"(ack queue)。当收到管道中的所有datanode确认信息后,该数据包才会从确认队列中删除(步骤5)。

客户端完成数据的写入后,会对数据流调用close()方法(步骤6)。该操作将剩余的所有数据包写入datanode管线中,并在联系namenode且发送文件写入完成信号前,等待确认(步骤7)。


复本的布局

hadoop的默认布局策略是在运行客户端的节点上放第1个复本(如果客户端运行在集群之外,就随机选择一个节点,不过系统会避免挑选那些存储太满或太忙的节点)。第2个复本放在与第一个不同且随机另外选择的机架中节点上。第3个复本放在与第2个复本放在相同的机架,且随机选择另一个节点。如图3。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hadoop是一个开源的分布式计算框架,可用于大数据的存储和处理。它采用了分布式文件系统HDFS)和分布式计算框架(MapReduce),能够将大数据分割成小的数据块,并在集群中的多台计算机上并行处理这些数据块。 HDFSHadoop分布式文件系统,它将大文件切分为多个数据块,并将这些数据块存储在集群中的多个计算机上。HDFS使用主从架构,其中NameNode负责管理文件系统的元数据,而多个DataNode负责实际存储数据。HDFS具有高容错性,能够自动复制数据块以保证数据的可靠性。 MapReduce是Hadoop的分布式计算框架,它通过将计算任务划分为多个Map和Reduce阶段来进行并行计算。Map阶段将输入数据切分为多个独立的小任务,并在集群中的多个计算机上并行执行。Reduce阶段将Map阶段的输出合并并进行聚合计算。MapReduce具有自动并行化、容错性和可扩展性等优点,能够高效地处理大规模数据集。 在学习Hadoop时,首先要了解Hadoop的核心组件,包括HDFS和MapReduce。然后,需要学习Hadoop的架构和工作原理,理解Hadoop如何实现分布式存储和计算。接下来,需要学习Hadoop的安装和配置,包括在单机和集群环境下的安装和配置过程。此外,还需要学习Hadoop的命令行工具和管理工具,以及Hadoop的API和编程模型。 在实际使用Hadoop时,需要掌握Hadoop的常用操作和管理技巧,如如何上传和下载文件、如何执行MapReduce作业、如何监控和管理Hadoop集群等。同时,需要学习Hadoop的优化技术和调优方法,以提高Hadoop集群的性能和效率。 总之,对于Hadoop学习,除了理解其基础知识和工作原理外,还需要熟悉其常用操作和管理技巧,以及灵活运用Hadoop来解决实际的大数据问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值