什么是HDFS?
管理跨网络的存储特定操作的文件系统称为分布式文件系统。
HDFS是一种分布式文件系统,用于存储在商用硬件集群上运行的非常大的数据文件。它具有容错性,可扩展性和扩展性,非常简单。 Hadoop捆绑了HDFS(Hadoop分布式文件系统)。
HDFS架构
HDFS集群主要由管理文件系统元数据的NameNode和存储实际数据的DataNode组成。
-
NameNode:NameNode可以视为系统的主节点。它维护文件系统树以及系统中存在的所有文件和目录的元数据。两个文件的“命名空间image”和“编辑日志”用于存储元数据信息。 Namenode了解包含给定文件的数据块的所有数据节点,但是,它不会持久存储块位置。系统启动时,每次从数据节点重建此信息。
-
DataNode:DataNode是驻留在集群中每台计算机上的从属服务器,提供实际存储。它负责为客户提供服务,读写请求。
HDFS中的读/写操作在块级操作。 HDFS中的数据文件被分成块大小的块,这些块作为独立单元存储。默认块大小为64 MB。
HDFS基于数据复制的概念运行,其中创建多个数据块副本并将其分布在整个集群中的节点上,以在节点发生故障时实现数据的高可用性。
HDFS中的文件小于单个块,不会占用块的完整存储空间。
HDFS读操作
数据读取请求由HDFS,NameNode和DataNode提供。
image.png-
客户端通过调用FileSystem对象的 'open()' 方法来启动读取请求;它是DistributedFileSystem类型的对象。
-
此对象使用RPC连接到namenode,并获取元数据信息,例如文件块的位置。请注意,这些地址是文件的前几个块。
-
响应于该元数据请求,返回具有该块的副本的DataNode的地址。
-
一旦接收到DataNode的地址,就会将类型为FSDataInputStream的对象返回给客户端。 FSDataInputStream包含DFSInputStream,它负责与DataNode和NameNode的交互。在上图所示的步骤4中,客户端调用'read()' 方法,该方法使DFSInputStream与第一个DataNode建立与文件的第一个块的连接。
-
以流的形式读取数据,其中客户端重复调用'read()' 方法。 read()'操作的这个过程一直持续到块结束。
-
到达块的结尾后,DFSInputStream关闭连接并继续查找下一个块的下一个DataNode
-
一旦客户端完成了读取操作,它就会调用close()方法。
HDFS写操作
在本节中,我们将了解如何通过文件将数据写入HDFS。
image.png- 客户端通过调用DistributedFileSystem对象的create()' 方法启动写操作,该方法创建一个新文件。
- DistributedFileSystem对象使用RPC调用连接到NameNode并启动新文件创建。但是,此文件创建操作不会将任何块与文件关联。 NameNode负责验证文件是否已经存在,并且客户端具有创建新文件的正确权限。如果文件已存在或客户端没有足够的权限来创建新文件,则会向客户端抛出IOException。否则,操作成功,NameNode将创建该文件的新记录。
- 一旦在NameNode中创建了新记录,就会将类型为FSDataOutputStream的对象返回给客户端。客户端使用它将数据写入HDFS。调用数据写入方法。
F- SDataOutputStream包含DFSOutputStream对象,该对象负责与DataNodes和NameNode的通信。当客户端继续写入数据时,DFSOutputStream继续使用此数据创建数据包。这些数据包被排入队列,称为DataQueue。
- 还有一个名为DataStreamer的组件使用此DataQueue。 DataStreamer还要求NameNode分配新块,从而选择用于复制的理想DataNode。
- 现在,复制过程从使用DataNodes创建管道开始。在我们的例子中,我们选择了3的复制级别,因此管道中有3个DataNode。
- DataStreamer将数据包注入管道中的第一个DataNode。
- 管道中的每个DataNode都存储由它接收的数据包,并将其转发到管道中的第二个DataNode。
- 另一个队列'Ack Queue'由DFSOutputStream维护,用于存储等待DataNode确认的数据包。
- 一旦从管道中的所有DataNode接收到对队列中的分组的确认,就将其从'Ack Queue'中移除。如果任何DataNode发生故障,来自此队列的数据包将用于重新启动操作。
- 在客户端完成写入数据之后,它调用close()方法,结果将剩余的数据包刷新到管道,然后等待确认。
- 收到最终确认后,将联系NameNode告诉它文件写入操作已完成。
使用JAVA API访问HDFS
在本节中,我们尝试了解用于访问Hadoop文件系统的Java接口。
为了以编程方式与Hadoop的文件系统进行交互,Hadoop提供了多个JAVA类。名为org.apache.hadoop.fs的包中包含有助于操作Hadoop文件系统中的文件的类。这些操作包括打开,读取,写入和关闭。实际上,Hadoop的文件API是通用的,可以扩展为与HDFS以外的其他文件系统进行交互。
以编程方式从HDFS读取文件
Object java.net.URL用于读取文件的内容。首先,我们需要让Java识别Hadoop的hdfs URL方案。这是通过在URL对象上调用setURLStreamHandlerFactory方法并将FsUrlStreamHandlerFactory的实例传递给它来完成的。此方法每个JVM只需执行一次,因此它包含在静态块中。
一个示例代码是 -
网友评论