Hadoop 随笔
包含模块:
- Hadoop Common:支持 Hadoop 其他模块的公共实用工具
- Hadoop Distributed File System (HDFS™):能够为应用数据提供高吞吐量的访问的分布式文件系统
- Hadoop YARN:作业调度和集群资源管理框架
- Hadoop MapReduce:一个基于 YARN 的大型数据集并行处理系统
- Hadoop Ozone:用于 Hadoop 的对象存储
名词解释
Server:可以理解为单个机器,提供服务。包括 CPU、DRAM、Disks
Rack:Multi Servers,40 ~ 80 servers 组成 Rack(机架、机柜),servers 之间通过 Ethernet(以太网)连接
Clusters:Multi Racks,多个 Rack 组成 Cluster,Rack 之间通过 Cluster Switch 连接,
Datacenter:更偏向于物理、地域的划分,一个 Datacenter 可能有多个集群,一个集群也可能跨多个数据中心。
关于网络带宽:单个 server 内不需要网络带宽;多个 server 交互时,同一 Rack 中的网络带宽最为充足,其次为同一 Cluster,不同地域的 Datacenter 网络带宽限制最大。
Hadoop Common
Rack
Hadoop 组件支持 Rack。HDFS 中就是用 Rack ,其通过将 Block 放置在不同的 Rack 上来使用 Rack 的容错机制。Rack 能保证在网络交换机故障时或者在集群中的分区提供数据的可用性。
HDFS
分布式文件系统 HDFS 被设计用于普通硬件上的,其和现有的分布式文件系统很相似,当然也有不同点,这些不同点正正是 HDFS 的优越性的体现。
与其他分布式文件系统的不同点、特点:
- 支持高容错
- 部署在低成本的硬件上
- 提供应用的高吞吐量访问
- 适应与拥有大型数据集的应用
- 放宽了对 POSIX 的一些要求,允许对文件系统进行流访问
HDFS 设计时的目标:
- 硬件的错误处理
HDFS 中包含数百台、数千台服务器,其中服务器挂掉是常态,因此 HDFS 能够识别错误,并且迅速的、自动的恢复是其设计结构的目标
- 流式数据访问
这里的流式数据访问是针对特殊应用的,而且此处"流式"的概念更像是批处理,而不是用于交互(interactive)。HDFS 更注重高吞吐量而不是低延迟。
- 大型数据集
文件大小通常在 GB 到 TB 之间,因此他需要提供高聚合数据带宽,并且在单个集群中扩展到数百个节点,并且在单个实例中支持千万个文件。
- 简单的一致性模型
HDFS 需要对文件的"单次写多次读"模型,一个文件一旦被创建、写入、关闭之后,除了 append 和 truncate 操作之外,是不希望被更改的(update)。这种模型假设简化了数据一致性问题,并且支持了高吞吐量访问。
- 移动计算比移动数据更加简单
当计算在数据附近时会变得更高效,对于大型数据集更是如此,因为这样会最小化网络拥塞,并且最大化系统的总吞吐量。HDFS 为此提供了应用程序接口,将计算移动到数据旁边。
- 异构硬件和软件平台的可移植性
将 HDFS 从一个平台移植到另一个平台是很容易的。
NameNode 和 DataNodes
HDFS 使用主从接结构。一个 HDFS 集群包含一个 NameNode,它是一个主服务器,用来管理文件系统命名空间和控制客户端对文件的访问。另外,包含大量的 DataNodes,通常集群中每个节点都有一个,它用来管理其所在节点的存储。
HDFS 暴露一个文件系统命名空间并且允许用户存储数据到文件中。在存储时,每个文件被分成一个或多个 blocks,并且这些 blocks 被存储在 DataNodes 集合中。NameNode 执行文件系统命名空间操作,例如打开、关闭、重命名文件和目录。同时 NameNode 决定 blocks 和 DataNodes 的对应关系。DataNodes 用来响应来自文件系统客户端的读或者写请求。DataNodes 同时执行 NameNode 的指令,如创建、删除、复制等。
与 HDFS 的整体设计目标一致,NameNode 与 dataNodes 同样也是被设计基于普通机器的。具体做法为:
- 运行于 Lnux 机器上
- 使用 Java 语言,移植性好
- 一般来说每个机器运行一个 DataNode
系统中仅存在单个 nameNode 简化了体系结构。metadata 被 namenode 决策和存储,而用户数据永远不会流经 NameNode。
文件系统命名空间
HDFS 支持传统的层次化文件组织。用户或者应用程序可以创建和存储数据到目录中。文件系统命名空间可以创建、移动、重命名文件,其支持用户配额和访问权限,目前 HDFS 并不支持硬链接和软链接。
除了文件系统命名空间信息,NameNode 同时存储复制因子(replication factor )等信息。
数据复制
HDFS 通过存储 blocks 序列的方式存储文件,为了达到高容错的目的,HDFS 采用复制的方式,每个文件的 block 大小和复制因子都是可配置的。HDFS 中除了最后一个 block,其余 block 的大小相同,尽管可以添加可变长度 block 的支持。HDFS 的复制因子可以被指定,其可以在文件创建时、或者创建之后被指定。
NameNode 负责关于 block 复制工作的所有决策。它定期从集群中的所有节点收集 Heartbeat 和 Blockreport,收到 Heartbeat 代表 DataNodes 正常工作,Blockreport 中包含所有 block 的列表。
HDFS 中复制位置和 Rack 息息相关,其可以保证可靠性、可用性和带宽利用率。集群中两个节点的交流需要网络交换机,其中不同 Rack 上的机器的网络带宽比相同 Rack 上机器的网络交带宽差。
复制放置位置、策略:
从 Rack 的角度:
NameNode 决定每个 DataNodes 所属的 Rack id。其中有集中策略:
- 均匀的将副本放置在不同的机架上
优点:当整个机架失败时不会损失数据;在读取数据时可以使用多个机架的带宽;可以很轻松的达到负载均衡;
缺点:提高了写操作的成本,因为按照这样方式写操作需要将块转移到多个机架上,之前提高过不同机架上机器传输对应的网络带宽差。
- 复制因子为 3 时,其中一个副本在当前写机器上的机架上,其余的副本在相同的其余机架上但是不同节点;复制因子为 4 时,前三个按照上述策略,其余的副本随机放置,并且每个机架上的副本数量少于上限。
上限计算公式:$frac{replicas - 1}{racks + 2}$
优点:减少了机架间的写流量,以提高写性能;由于机架失败的概率远远小于节点失败的概率,因此这个策略同样可以保证可靠性和可用性;在读取文件时减少了使用的聚合网络带宽,因此所有的节点并不是分布在不同的机架上。
从 DataNodes 的角度:
每个 DataNode 不允许拥有同一 block 的多个副本,因此副本的最大数量是当时 DataNodes 的总数。
除上述考虑基于机架感知的存储策略,还需要考虑存储类型。即确定候选节点后,还需要检查候选节点是否拥有满足要求的存储空间,如果不满足将查找另一个节点,如果在当前路径中找不到符合要求的足够节点,将会在第二个路径中寻找具有回退类型的节点。
副本选择
为达到最小化网络带宽消耗和读取延迟,HDFS 选择副本的原则是:就近原则。具体为如果读取节点机架存在副本,那么当前副本将会响应请求,不然考虑同一数据中心中,是否存在副本可以使用。
安全模式
启动时,NameNode 会进入安全模式,在安全模式中,不会发生数据块的复制。在这个模式中,NameNode 接收 Heartbeat 和 Nodereport