在当今时代,处理海量数据已成为常态。从下一条WhatsApp消息到下一条推文,当与技术互动时,每一步都在创造数据。现在,将这个数字乘以45亿互联网用户——这个数学问题简直令人难以置信!
但曾想过如何处理这些数据吗?它是存储在一台机器上吗?如果机器失败怎么办?会丢失可爱的凌晨3点推文吗?
答案是不会的。敢肯定已经在考虑Hadoop了。Hadoop是一个了不起的框架。有了Hadoop,可以利用Hadoop分布式文件系统(HDFS)的惊人力量——Hadoop的存储组件。它可能是Hadoop最重要的组件,需要详细解释。
Hadoop分布式文件系统(HDFS)是什么?
在单台机器上维护大量数据是困难的。因此,有必要将数据分解成更小的块,并将其存储在多台机器上。
管理跨机器网络存储的文件系统被称为分布式文件系统。Hadoop分布式文件系统(HDFS)是Hadoop的存储组件。所有存储在Hadoop上的数据都以分布式方式存储在机器集群中。但它有一些属性定义了它的存在。
巨大体积——作为一个分布式文件系统,它非常能够存储PB级别的数据而不出现任何问题。
数据访问——它基于这样的理念:“最有效的数据处理模式是写一次,多次读取模式”。
成本效益——HDFS运行在普通硬件的集群上。这些是可以从任何供应商那里购买的廉价机器。
HDFS的组成部分是什么?
HDFS大致有两个主要组件——数据块和存储这些数据块的节点。但除此之外,还有更多的东西。所以,让逐一看看这些,以获得更好的理解。
HDFS块
HDFS将文件分解成更小的单元。这些单元中的每一个都存储在集群中的不同机器上。然而,这对在HDFS上工作的用户来说是透明的。对他们来说,它看起来像是将所有数据存储在一台机器上。
这些更小的单元是HDFS中的块。这些块的默认大小是128MB,可以根据需要轻松更改它。所以,如果有一个512MB大小的文件,它将被分成4个块,每个块存储128MB。
然而,如果有一个524MB大小的文件,那么它将被分成5个块。其中4个将存储128MB,总计512MB。而第5个将存储剩余的12MB。没错!这个最后的块不会占用磁盘上的完整128MB。
但一定在想,为什么一个块要这么大的量?为什么不分成多个10KB的块呢?好吧,通常在Hadoop中处理的数据量通常在PB级别或更高。
因此,如果创建小块,将最终得到一个庞大的块数量。这意味着将不得不处理同样大量的关于块位置的元数据,这将只是造成很多开销。真的不想要那样!
将数据存储在块中而不是保存完整文件有几个好处。文件本身太大,无法单独存储在任何单个磁盘上。因此,将其分散在集群中的不同机器上是明智的。
它还允许适当地分散工作负载,并防止单台机器因利用并行性而窒息。现在,一定在想,集群中的机器呢?它们如何存储块,元数据存储在哪里?让找出答案。
HDFS中的Namenode
HDFS在一个主从架构中运行,这意味着集群中有一个主节点和几个工作节点。主节点是Namenode。
Namenode是运行在集群中单独节点上的主节点。它管理文件系统名称空间,即文件和目录的文件系统树或层次结构。它还存储所有文件的所有者、文件权限等信息。
它还知道文件的所有块的位置和大小。所有这些信息都以Fsimage和Edit Log的形式在本地磁盘上持久保存。
Fsimage存储文件和目录的信息。对于文件,它存储复制级别、修改和访问时间、访问权限、文件由哪些块组成以及它们的大小。对于目录,它存储修改时间和权限。
Edit Log另一方面跟踪客户端执行的所有写操作。这定期更新到内存中的元数据以服务于读取请求。
每当客户端想要向HDFS写入信息或从HDFS读取信息时,它会连接到Namenode。Namenode返回块的位置给客户端,然后执行操作。
没错,Namenode不存储块。为此,有单独的节点。
HDFS中的数据节点
数据节点是工作节点。它们是可以轻松添加到集群中的廉价普通硬件。数据节点负责存储、检索、复制、删除等块,当Namenode请求时。
它们定期向Namenode发送心跳,以便Namenode了解它们的健康状况。此外,DataNode还发送存储在其上的块的列表,以便Namenode可以在其内存中维护块到DataNodes的映射。
但是除了集群中的这两种类型的节点之外,还有另一个称为辅助Namenode的节点。让看看那是什么。
HDFS中的辅助Namenode
假设需要重启Namenode,这可能发生在故障情况下。这意味着必须将Fsimage从磁盘复制到内存。此外,还需要将最新的Edit Log副本复制到Fsimage以跟踪所有事务。但如果在长时间后重启节点,那么Edit log可能已经增长到很大。这意味着应用Edit log中的事务将需要很长时间。在此期间,文件系统将离线。因此,为了解决这个问题,引入了辅助Namenode。
辅助Namenode是集群中的另一个节点,其主要任务是定期将Edit log与Fsimage合并,并产生主节点的内存文件系统元数据的检查点。这也被称为检查点。
但是,检查点过程在计算上非常昂贵,需要大量的内存,这就是为什么辅助Namenode在集群中的单独节点上运行。
然而,尽管它的名字,辅助Namenode并不充当Namenode。它只是在那里进行检查点并保存最新的Fsimage副本。
HDFS中的复制管理
现在,HDFS最好的特性之一是块的复制,这使得它非常可靠。但是它是如何复制块的,以及它将它们存储在哪里?让回答这些问题。
块的复制
HDFS是Hadoop的可靠存储组件。这是因为存储在文件系统中的每个块都在集群中不同的数据节点上复制。这使得HDFS具有容错性。
HDFS中默认的复制因子是3。这意味着每个块将有两个更多的副本,每个副本都存储在集群中不同的数据节点上。然而,这个数字是可配置的。
但一定在想,这是否意味着占用了太多的存储。例如,如果有5个128MB的块,那就是5*128*3 = 1920 MB。确实。但这些节点是普通硬件。可以轻松地扩展集群以添加更多的这些机器。购买机器的成本远低于丢失数据的成本!
现在,一定在想,Namenode如何决定将副本存储在哪个数据节点上?好吧,在回答这个问题之前,需要看看Hadoop中的机架是什么。
Hadoop中的机架是什么?
机架是存储在同一物理位置的机器集合(在Hadoop中大约30-40台)。Hadoop集群中有多个机架,所有机架都通过交换机连接。
机架意识
副本存储是可靠性和读写带宽之间的权衡。为了增加可靠性,需要将块副本存储在不同的机架和数据节点上以增加容错性。而当副本存储在同一节点上时,写带宽最低。因此,Hadoop有一个默认策略来处理这个难题,也称为机架意识算法。
例如,如果块的复制因子是3,那么第一个副本存储在客户端写入的同一个数据节点上。第二个副本存储在不同的数据节点上,但在不同的机架上,随机选择。而第三个副本存储在与第二个相同的机架上,但在不同的数据节点上,再次随机选择。如果复制因子更高,那么后续的副本将存储在集群中随机的数据节点上。
结束语
希望现在对Hadoop分布式文件系统(HDFS)是什么,它的主要组成部分是什么,以及它如何存储数据有了扎实的理解。然而,还有一些更多的概念需要进一步探讨,但那是另一篇文章的故事了。
现在,建议阅读以下文章,以更好地理解Hadoop和大数据世界!
Hadoop生态系统
MapReduce介绍
Apache Hive表类型
最后但同样重要的是,建议阅读Tom White的《Hadoop:权威指南》。这篇文章深受其启发。
:Aniruddha Bhandari