理解什么是大数据和Hadoop
HDFS是Hadoop系统的存储部分。它是块结构的文件系统,其中每个文件被分成预定大小的块。这些块存储在一台或多台机器的集群中。HDFS适用于两种类型的节点:NameNode(主节点)和DataNodes(从节点)
Hadoop NameNodes
NameNodes是HDFS文件系统的核心。它们保留文件系统中所有文件的目录树,并跟踪集群中数据的保存位置。它们不存储这些文件的数据。这是一台非常高效的机器。客户端应用程序只要希望查找文件,或者想要添加/复制/移动/删除文件,就可以与NameNode通信。NameNodes还执行文件系统执行,例如命名,关闭和打开文件/目录。所有DataNode都会将心跳和阻止报告发送到Hadoop集群中的NameNode。它确保DataNode存活。块报告包含datanode上所有块的列表。与namenode中的群集元数据关联的主要文件是:
- EditLogs:包含最近对最新FsImage文件系统所做的所有修改。NameNodes从客户端接收创建/更新/删除请求。之后,首先记录此请求以编辑文件。
- FsImage:代表文件系统映像。它包含自NameNode创建以来的完整文件系统命名空间。文件和目录由NameInode在inode中表示。Inode记录属性,如权限,修改和访问时间,或命名空间和磁盘空间配额。
Hadoop DataNodes
这些是真实数据所在的商品硬件。这些也称为从节点。多个数据节点组合在一起形成机架。DataNodes根据NameNode的指令阻止副本的创建,删除和复制。DataNode将心跳发送到NameNode以报告HDFS数据的运行状况。默认情况下,此频率设置为3秒。
Secondary NameNodes
在HDFS中,当NameNode启动时,它首先从FsImage文件中读取HDFS文件的状态。之后,它将应用编辑日志文件中的编辑。NameNode然后将新的HDFS状态写入FsImage。然后它使用空的编辑文件开始正常操作。在启动时,NameNode与FsImage合并并编辑文件,因此编辑日志文件可能会随着时间的推移而变得非常大。较大的编辑文件的副作用是NameNode的下一次重新启动需要更长时间。辅助NameNode解决了此问题。辅助NameNode从NameNode下载FsImage和EditLogs,然后将编辑日志与FsImage(文件系统映像)合并。它使编辑日志的大小保持在一个限制内。它将修改后的FsImage存储到持久存储中,因此我们可以在NameNode失败的情况下使用它。
HDFS如何工作
HDFS在以下假设下工作:一次写入并经常读取。
在这里插入图片描述用HDFS写
当客户端想要将文件写入HDFS时,它会与NameNode通信以获取元数据。NameNode以许多块,它们的位置,副本和其他详细信息进行响应。根据NameNode的信息,客户端将文件分成多个块。之后,它开始将它们发送到第一个DataNode。
客户端首先使用其他两个DataNode的详细信息将块A发送到DataNode 1。当DataNode 1从客户端接收块A时,DataNode 1将同一块复制到同一机架的DataNode 2。由于两个DataNode都在同一个机架中,因此可以通过机架式交换机传输块。现在,DataNode 2将相同的块复制到DataNode 3.由于两个DataNode位于不同的机架中,因此块通过机架外交换机传输数据。当DataNode从客户端接收这些块时,它会向NameNode发送写入确认。对文件中的每个块重复相同的过程。
在HDFS中创建文件
如果客户端必须在HDFS内创建文件,则需要与NameNode进行交互。NameNode提供客户端可以写入其数据的所有从站的地址。客户端还从NameNode获取安全令牌,他们需要在写入块之前向从属设备进行身份验证。
要创建文件,客户端将create()
在DistributedFileSystem上执行该 方法。现在,DistributedFileSystem通过创建一个RPC(远程过程调用)来与NameNode进行交互,以创建一个在文件系统命名空间中没有与之关联的块的新文件。NameNode执行各种检查,以确保不存在此类文件,并且客户端有权创建新文件。
如果这一切顺利进行,则NameNode会创建新文件的记录; 否则,文件创建失败,并向客户端抛出IOException。FSDataOutputStream为客户端返回DistributedFileSystem,以便开始将数据写入DataNode。与DataNode和客户端的通信由DFSOutputStream处理,DFSOutputStream是FSDataOutputStream的一部分。
读入HDFS
这是一个相对容易的操作。此操作分两步进行:
- 客户端与NameNode的交互。
- 客户端与DataNode的交互。
NameNodes包含有关哪个块存储在HDFS中哪个特定从站上的所有信息,哪些块用于该特定文件。因此,客户端需要与NameNode交互以获得实际存储块的从站的地址。NameNode将提供包含所需块的从站的详细信息。让我们更详细地了解客户端和NameNode交互。为了访问存储在HDFS中的块,客户端使用该命令发起请求 open()
获取FileSystem对象的方法,该对象是DistributedFileSystem的一部分。现在,FileSystem将使用RPC(远程过程调用)与NameNode进行交互,以获取包含客户端请求的文件块的从属的位置。在此级别,NameNodes将检查客户端是否有权访问该文件。如果是,则发送有关块位置的信息。此外,它还为客户端提供了一个安全令牌,客户端需要向客户端显示这些令牌以进行身份验证。
现在,在接收到包含块的从设备的地址之后,客户端将直接与从设备交互以读取块。数据将直接从从服务器流向客户端(它不会通过NameNode流动)。客户端并行从多个从站读取数据块。让我们更详细地了解客户端和NameNode交互。客户端将通过FSDataInputStream对象向从属服务器发送读取请求。客户端和DataNode之间的所有交互都由DFSInputStream管理,DFSInputStream是客户端API的一部分。客户端将向NameNode提供的从属设备显示身份验证令牌。现在,客户端将使用InputStream API开始读取块,并且将从DataNode和客户端连续传输数据。到达一个街区结束后,DFSInputStream关闭与DataNode的连接。读取操作是高度优化的,因为它不涉及NataNode实际数据读取,否则NameNode将成为瓶颈。由于采用分布式并行读取机制,数千个客户端可以非常有效地直接从DataNode读取数据。