Hadoop Notes
Hadoop Intro
Hadoop is a open-source framework for
reliable, scalable, distributed computing
Modules 模块
- Common: The common utilities that support the other Hadoop modules.
 - Hadoop Distributed File System (HDFS): A distributed file system that provides high-throughput access to application data. 分布式文件系统
 - YARN: A framework for job scheduling and cluster resource management.
 - MapReduce: A YARN-based system for parallel processing of large data sets. 分布式计算框架
 
HDFS
简介 Intro
HDFS (Hadoop Distributed File System) 是 Hadoop 中的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。

HDFS 是一个分布式的文件系统
- commodity hardware
 - fault-tolerant 容错
 - high throughput 高吞吐
 - large data sets
 - Streaming Data Access 流式数据
 
架构 Architecture
HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成:
- NameNode : 负责执行有关 
The File System Namespace的操作,例如打开,关闭、重命名文件和目录等。它同时还负责集群元数据的存储,记录着文件中各个数据块的位置信息。 - DataNode:负责提供来自文件系统客户端的读写请求,执行块的创建,删除等操作。
 
运行机制
用户文件会被切块后存储在多台 DataNode 服务器当中,并且每个文件在整个集群中存放多个副本,可以提高数据的安全性
- 对用户提供统一的目录,存储时会把文件切分为若干个块存储在不同 
DataNode中 - 用户可以设置多个数据副本,以增强数据的安全性
 - 用户存储的信息放在 
NameNode中,可以理解为目录 
NameNode
整个文件系统的管理节点,接收用户的请求,保存这文件/目录的元数据信息和每个文件对应的 block 映射表。即目录。 不会存储任何的用户数据
- fsimage:元数据镜像文件,存储一段时间内 NameNode 的元数据信息
 - edits:保存操作日志文件
 - fstime:保存最近一次 checkpoint 的时间
 - seen_txid:最后一个 edites 的数字
 - VERSION
 
DataNode
- 提供正式文件的数据存储服务.
 block是最基础的存储单元. HDFS 默认的block大小是 128M
数据复制 Data Replication
由于 Hadoop 被设计运行在廉价的机器上,这意味着硬件是不可靠的,为了保证容错性,HDFS 提供了数据复制机制。HDFS 将每一个文件存储为一系列block,每个块由多个副本来保证容错,块的大小和复制因子可以自行配置 (默认情况下,块大小是 128M,默认复制因子是 3).

大型的 HDFS 实例在通常分布在多个机架的多台服务器上,不同机架上的两台服务器之间通过交换机进行通讯。在大多数情况下,同一机架中的服务器间的网络带宽大于不同机架中的服务器之间的带宽。因此 HDFS 采用 rack-aware replica placement policy 机架感知副本放置策略,对于常见情况,当复制因子为 3 时,HDFS 的放置策略是:
- 在写入程序位于 
DataNode上时,就优先将写入文件的一个副本放置在该DataNode上,否则放在随机DataNode上。 - 之后在另一个远程机架上的任意一个节点上放置另一个副本,并在该机架上的另一个节点上放置最后一个副本。
 - This policy cuts the inter-rack write traffic which generally improves write performance. 此策略可以减少机架间的写入流量,从而提高写入性能。
 

如果复制因子大于 3,则随机确定第 4 个和之后副本的放置位置,同时保持每个机架的副本数量低于上限,上限值通常为 (复制系数 - 1)/机架数量 + 2,需要注意的是不允许同一个 DataNode 上具有同一个块的多个副本。
健壮性 Robustness
1. 心跳机制和重新复制 Heartbeats and Re-Replication
每个 DataNode 定期向 NameNode 发送心跳消息,如果超过指定时间没有收到心跳消息,则将 DataNode 标记为死亡。NameNode 不会将任何新的 I/O 请求转发给标记为死亡的 DataNode, 也不会再使用这些 DataNode 上的数据。 由于数据不再可用,可能会导致某些块的复制因子小于其指定值,NameNode 会跟踪这些块,并在必要的时候进行重新复制。
2. 数据的完整性 Data Integrity
由于存储设备故障等原因,存储在 DataNode 上的数据块也会发生损坏。为了避免读取到已经损坏的数据而导致错误,HDFS 提供了数据完整性校验机制来保证数据的完整性,具体操作如下:
当客户端创建 HDFS 文件时,它会计算文件的每个块的 checksum 校验和,并将 checksum 存储在同一 HDFS namespace 下的单独的隐藏文件中。当客户端检索文件内容时,它会验证从每个 DataNode 接收的数据是否与存储在关联校验和文件中的 checksum 匹配。如果匹配失败,则证明数据已经损坏,此时客户端会选择从其他 DataNode 获取该块的其他可用副本。
3.元数据的磁盘故障 Metadata Disk Failure
FsImage 和 EditLog 是 HDFS 的核心数据,这些数据的意外丢失可能会导致整个 HDFS 服务不可用。为了避免这个问题,可以配置 NameNode 使其支持 FsImage 和 EditLog 多副本同步,这样 FsImage 或 EditLog 的任何改变都会引起每个副本 FsImage 和 EditLog 的同步更新。
4.支持快照 Snapshots
- Snapshots support storing a copy of data at a particular instant of time. One usage of the snapshot feature may be to roll back a corrupted HDFS instance to a previously known good point in time.
 - 快照支持在特定时刻存储数据副本,在数据意外损坏时,可以通过回滚操作恢复到健康的数据状态。