前言:基于人大的《数据科学概论》第十二章。主要内容为Hadoop简介、Hadoop分布式文件系统、MapReduce工作原理、Hadoop生态系统、Hadoop2.0、Hadoop2.0在交互式查询引擎、Hadoop平台上的列存储。
文章目录
一、Hadoop简介
简说:Apache Hadoop是存储和处理大数据的开源软件框架。它在普通服务器组成的大规模集群上,对大数据进行分布式处理。
Hadoop软件框架,包含如下主要模块:
- Hadoop Common,这个模块包含了其他模块需要的库函数和实用函数。
- Hadoop Distributed File System(HDFS),这是在由普通服务器组成的集群上运行的分布式文件系统,支持大数据的存储,通过多个节点的并行I/O,提供极高的吞吐能力。
- Hadoop MapReduce,是一种支持大数据处理的编程模型。
- Hadoop YARN,这是Hadoop2.0的基础模块,它本质上是一个资源管理和任务调度软件框架。它把集群的计算资源管理起来,为调度和执行用户程序提供资源的支持。
二、Hadoop分布式文件系统
Hadoop分布式文件系统(Hadoop Distributed File System,简称HDFS),是一个分布式的、高度可扩展的文件系统,它是模仿GFS(Google File System)的开源软件实现。
- 一个HDFS集群,一般由一个NameNode和若干个DataNode组成(主从架构),分别负责元信息的管理(每个文件的数据块所在的DataNode的对应关系)和数据块的管理。
- HDFS支持TB级甚至PB级大小文件的存储,它把文件划分成数据块(Block,大小64MB),分布到多台机器进行存储。
- 为了保证系统的可靠性,HDFS把数据块在多个节点上进行复制。一般复制3份,多副本存放于本机、同机架、另外一个机架。
2.1HDFS特点
- 高度扩展性
- 高度容错性
2.2文件写入的过程
- 客户端程序调用HDFS的create()方法
- HDFS想NameNode发起一个远程过程调用,由其在其文件系统的命名空间里,创建一个新文件。这时,该文件还没有任何数据块。
- 当客户端开始写入数据,DFSOutputStream把数据分解成数据包,并且写入一个内部队列,称为数据队列。
- 第二个DataNode保存这个数据包,并且转发给第三个(最后一个)DataNode。
- DFSOutputStream同时维护一个数据包的内部队列,用于等待接收DataNode的应答信息,称为ACk Queue。
- 当客户端程序完成数据写入,它调用数据流的close()方法。
- 客户端把所有剩余的数据包发送到DataNode流水线上,并且等待应答信息,最后联系NameNode,告诉它文件结束。
2.3文件的读取过程
- 客户端程序通过调用FileSystem对象的open()方法,打开文件,获得Distributed FileSystem类的一个实例。
- DistributedFileSystem 通过RPC调用NameNode,获得文件开始若干数据块的位置信息(Locations of Blocks)。对于每个数据块来讲,NameNode会返回拥有这个数据块的副本的所有DataNode的地址。
- 客户端程序从输入流上调用函数read()。由于DFSInputStream已经保存了文件开始若干数据块所在的DataNode的地址,DFSInputStream连接到最近的(Closest)DataNode,读取文件的第一个数据块。
- 数据从DataNode源源不断传送回客户端程序,而客户端程序则不断地调用数据流的read()方法。
- 当到达数据块的末尾的时候,DFSInputStream将关闭到DataNode的连接,然后寻找下一个数据块的最优的DataNode,以便进行后续数据块的读取。DataNode的选择对客户端程序来讲是透明的,客户端程序只是从一个连续的数据流进行读取。
- 客户端按照顺序读取各个数据块。当客户端不断读取数据流的时候,在数据块的边界,DFSInputStream不断创建到保存其它数据块的DataNode的连接。DFSInputStream同时向NameNode询问和提取,下一批数据块的DataNode的位置信息。
- 当客户端完成文件的读取,它调用FSDataInputStream实例的close()方法。