这是我参与更文挑战的第7天,活动详情查看: 更文挑战
背景
之前学习Hadoop时收集的一些零散资料,下面准备把这个系列整理一下记录下来,方便自己以后复习.
Hadoop资料汇总
最核心的两个设计
Hadoop框架最核心的两个设计:
- HDFS: 为海量的数据提供了存储
- MapReduce: 为海量的数据提供计算
HDFS的容错性
- HDFS是Hadoop实现的一个分布式文件系统(Hadoop Distributed File System),简称HDFS。
- HDFS有高容错性的特点,并且设计用来部署在低廉的硬件上,比如Google就是部署在大量地Linux PC上,而不是Server及其上
- Hadoop是可靠的,因为它假设计算元素和存储会失败,因此它维护多个工作数据副本,确保能够针对失败的节点重新分布处理
- Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配
HDFS文件系统
Hadoop最底部是Hadoop Distributed File System(HDFS),它存储Hadoop集群中所有存储节点上的文件:
- 对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括NameNode(仅一个),它在HDFS内部提供元数据服务;DataNode,它为HDFS提供存储块
- 缺点: 由于仅存在一个NameNode,因此这是 HDFS 的一个缺点(单点失败)。
- 存储在HDFS中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作
NameNode
- NameNode是一个通常在 HDFS实例中的单独机器上运行的软件。它负责管理文件系统名称空间和控制外部客户机的访问。NameNode 决定是否将文件映射到 DataNode 上的复制块上。最常见的是3个复制块
- 实际的 I/O事务并没有经过 NameNode,只有表示DataNode和块的文件映射的元数据经过NameNode。当外部客户机发送请求要求创建文件时,NameNode 会以块标识和该块的第一个副本的DataNode IP地址作为响应。这个NameNode还会通知其他将要接收该块的副本的DataNode。
- NameNode上存储文件系统名称空间的信息和事务的日志文件,这些信息都存储在 NameNode 的本地文件系统上,要防止这些文件的损坏或 NameNode 系统丢失
- NameNode本身不可避免地具有SPOF(Single Point Of Failure)单点失效的风险,主备模式并不能解决这个问题,通过Hadoop Non-stop namenode才能实现100% uptime可用时间
DataNode
- DataNode在HDFS实例中的单独机器上运行
- Hadoop集群包含一个NameNode和大量DataNode
- DataNode响应来自HDFS客户机的读写请求。它们还响应来自 NameNode 的创建、删除和复制块的命令。
- NameNode依赖来自每个DataNode的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode 可以根据这个报告验证块映射和其他文件系统元数据。如果 DataNode 不能发送心跳消息,NameNode 将采取修复措施,重新复制在该节点上丢失的块
文件操作流程
- 如果客户机想将文件写到 HDFS 上,首先需要将该文件缓存到本地的临时存储。如果缓存的数据大于所需的 HDFS 块大小,创建文件的请求将发送给 NameNode。NameNode 将以 DataNode 标识和目标块响应客户机。
- 同时也通知将要保存文件块副本的 DataNode。当客户机开始将临时文件发送给第一个 DataNode 时,将立即通过管道方式将块内容转发给副本 DataNode。客户机也负责创建保存在相同 HDFS名称空间中的校验和(checksum)文件。
- 在最后的文件块发送之后,NameNode 将文件创建提交到它的持久化元数据存储(在 EditLog 和 FsImage 文件)