耗费 2.5h终于解决了 hadoop可视化 web端的端口访问 bug,放在这里记录一下。
一.HDFS
Hadoop 生态是一个庞大的、功能齐全的生态,但是围绕的还是名为 Hadoop 的分布式系统基础架构,其核心组件由四个部分组成,分别是:Common、HDFS、MapReduce 以及 YARN。
- Common 是 Hadoop 架构的通用组件;
- HDFS 是 Hadoop 的分布式文件存储系统;
- MapReduce 是Hadoop 提供的一种编程模型,可用于大规模数据集的并行运算;
- YARN 是 Hadoop 架构升级后,目前广泛使用的资源管理器。
1.介绍
HDFS(The Hadoop Distributed File System),是被设计成适合运行在通用硬件(commodity hardware)上的 Hadoop 的分布式文件系统。它与其他的分布式系统有非常显著的不同,首先 HDFS 具有高容错性,并且它可以被部署到廉价的硬件上。此外,HDFS提供对应用程序数据的高吞吐量访问,适用于具有大型数据集的应用程序。
2.HDFS的优点
2.1 硬件故障防治
一个 HDFS 实例有可能包含数百台或数千台服务器,每一个台机器都存储文件系统数据的一部分,这种情况下硬件故障是常态。而 HDFS 可检测故障并从中快速自动恢复。
2.2 流数据访问
HDFS 设计用于批处理而不是用户的交互式使用,其重点是数据访问的高吞吐量而并不追求数据访问的低延迟。
2.3 处理大数据集
HDFS 的核心目标就是为处理具有大数据量的应用,在其上运行的应用的文件大小一般都为 TB 级别。HDFS 可提供高聚合数据带宽并且要扩展到集群中的数百个节点上,并对于单个应用可支持上千万个文件。
2.4 简单一致模型
HDFS 应用程序是一个”一次写入多次读取”的文件访问模型。这种模型可以简化数据的一致性问题并且能够实现高吞吐数据访问。官方文档表示有计划支持追加写入文件的功能。
2.5 移动计算替代移动数据
“Moving Computation is Cheaper than Moving Data”,当一个计算程序与数据同在一个物理节点上时,运算最高效,特别是当数据量特别大时,移动计算远优于移动数据集。移动计算可以最大限度地减少网络拥塞并提高系统的整体吞吐量。HDFS 设计的是将计算迁移到更靠近数据所在的位置,而不是将数据移动到运行应用程序的位置,HDFS 为应用程序提供了接口,使其自身更靠近数据。
2.6 跨异构硬件和软件平台的可移植性
HDFS 的设计便于从一个平台移植到另一个平台。 这有助于广泛采用 HDFS 作为大量应用程序的首选大数据处理平台。
3.NameNode & DataNode
NameNode 与 DataNode 是 HDFS 系统的重要知识点。HDFS 是 master/slave 体系结构。一个 HDFS 集群是由单个 NameNode 和众多 DataNode 组成,文件会被分成一个或多个块,这些块存储在一组 DataNode 中。
因为 HDFS 是用 Java 语言搭建的,所以只要是支持 Java 语言的机器都可以运行 NameNode 和 DataNode。并且因为 Java 的高可移植性,HDFS 也具有非常广泛的应用范围。一种典型的 HDFS 部署模式是指定一个物理主机运行 NameNode,然后其余的机器运行 DataNode,在实际部署情况中,一般都是一台主机部署一个 DataNode。
群集中存在单个 NameNode 极大地简化了系统的体系结构。 NameNode 是所有 HDFS 元数据的决定者和存储库。系统的这种设计使用户数据永远不会流经 NameNode,可理解 NameNode 为整个系统的中枢。
架构如下图:
Replication: 复制;ops: 操作;Metadata: 元数据;Rack: 机架
首先图中的 rack 翻译为“机架”,可以理解为两个处于不同地方的机群,每个机群内部有自己的连接方式。其次在 DataNode 中存储的不是当个文件,而是文件块(Block),在 HDFS 中,每个大文件会拆分成多个 Block,然后将这些 Block 散布存储在不同的 DataNode 中,并且每个 Block 会有多个复制,也会存储到其他的 DataNode中。
可以看出上图分别解释了“读”和“写”两种操作:
- 当有客户端要向 HDFS 写入文件时,图中将文件拆分的 Block 写入到了两个机架的 DataNode 中,一般情况下就是两个机架的两个物理主机中,可以看出文件数据没有经过 NameNode。
- 当有客户端要从 HDFS 读取文件时,会将操作命令传向 NameNode,然后 NameNode 转为对应的数据块的操作,指挥相应的 DataNode 将所需数据返回给客户端。
NameNode
NameNode 是管理文件系统命名空间的主服务器,负责客户端请求的响应,用于管理客户端对文件的访问,执行文件系统命名空间操作,如打开,关闭和重命名文件和目录。它还确定了 Block 到 DataNode 的映射。
NameNode 做着有关块复制的所有决定,它定期从群集中的每个 DataNode 接收 Heartbeat 和 Blockreport。收到 Heartbeat 意味着 DataNode正常运行,Blockreport 包含 DataNode 上所有块的列表。
Name功能总结:
- 响应客户端请求
- 元数据存储
- DataNode管理
DataNode
DataNode 通常是群集中每个节点一个,用于存储数据块 Block,负责提供来自文件系统客户端的读写请求。并且还会根据 NameNode 的指令执行块创建,删除和复制。要定期向 NameNode 汇报本身及所有 Block 的信息。
DataNode功能总结:
- 数据的存储
- 和客户端之间IO操作
- 定期向NameNode汇报自身情况
二.MapReduce
完整的 MapReduce 框架包含两部分:
- 算法逻辑层面,即 map、shuffle 以及 reduce 三个重要算法组成部分。
- 实际运行层面,即算法逻辑作业在分布式主机中是以什么形式和什么流程运行的,因为自 MapReduce version2 以后,作业都是提交给 YARN 进行管理。
1.什么是MapReduce
MapReduce是一个基于 java 的并行分布式计算框架,使用它来编写的数据处理应用可以运行在大型的商用硬件集群上来处理大型数据集中的可并行化问题,数据处理可以发生在存储在文件系统(非结构化)或数据库(结构化)中的数据上。MapReduce 可以利用数据的位置,在存储的位置附近处理数据,以最大限度地减少通信开销。
MapReduce 框架通过编组分布式服务器,并行运行各种任务,管理系统各部分之间的所有通信和数据传输;其还能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算涉及到的很多系统底层的复杂细节交由系统负责处理,减少开发人员的负担。
MapReduce 还是一个并行程序设计模型与方法(Programming Model & Methodology)。它借助于函数式程序设计语言 Lisp 的设计思想,提供了一种简便的并行程序设计方法,将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数: Map 和 Reduce,用 Map 和 Reduce 两个函数编程实现基本的并行计算任务,提供了抽象的操作和并行编程接口,以简单方便地完成大规模数据的编程和计算处理。
2.算法
MapReduce框架通常由三个操作(或步骤)组成:
- Map:每个工作节点将 map 函数应用于本地数据,并将输出写入临时存储。主节点确保仅处理冗余输入数据的一个副本。
- Shuffle:工作节点根据输出键(由 map 函数生成)重新分配数据,对数据映射排序、分组、拷贝,目的是属于一个键的所有数据都位于同一个工作节点上。
- Reduce:工作节点现在并行处理每个键的每组输出数据。
MapReduce 流程图:
MapReduce 允许分布式运行 Map 操作,只要每个 Map 操作独立于其他 Map 操作就可以并行执行。
另一种更详细的,将 MapReduce 分为5个步骤的理解是:
- Prepare the Map() input:MapReduce 框架先指定 Map 处理器,然后给其分配将要处理的输入数据 — 键值对 K1,并为该处理器提供与该键值相关的所有输入数据;
- Run the user-provided Map() code:Map() 在 K1 键值对上运行一次,生成由 K2 指定的键值对的输出;
- Shuffle the Map output to the Reduce processors:将先前生成的 K2 键值对,根据『键』是否相同移至相同的工作节点;
- Run the user-provided Reduce() code:对于每个工作节点上的 K2 键值对进行 Reduce() 操作;
- Produce the final output:MapReduce 框架收集所有 Reduce 输出,并按 K2 对其进行排序以产生最终结果进行输出。
实际生产环境中,数据很有可能是分散在各个服务器上,对于原先的大数据处理方法,则是将数据发送至代码所在的地方进行处理,这样非常低效且占用了大量的带宽,为应对这种情况,MapReduce 框架的处理方法是,将 Map() 操作或者 Reduce() 发送至数据所在的服务器上,以『移动计算替代移动数据』,来加速整个框架的运行速度,大多数计算都发生在具有本地磁盘上数据的节点上,从而减少了网络流量。
三.YARD
1.介绍
Apache Hadoop YARN 是开源 Hadoop 分布式处理框架中的资源管理和作业调度技术。作为 Apache Hadoop 的核心组件之一,YARN 负责将系统资源分配给在 Hadoop 集群中运行的各种应用程序,协调多个框架共同访问 hdfs 集群资源,并调度要在不同集群节点上执行的任务。
YARN 的基本思想是将资源管理和作业调度/监视的功能分解为单独的 daemon (守护进程),其拥有一个全局 ResourceManager(RM) 和每个应用程序的 ApplicationMaster(AM)。应用程序可以是单个作业,也可以是作业的 DAG。
ResourceManager 和 NodeManager 构成了数据计算框架。 ResourceManager 是在系统中的所有应用程序之间仲裁资源的最终权限。NodeManager 是每台机器框架代理,负责 Containers,监视其资源使用情况(CPU,内存,磁盘,网络)并将其报告给 ResourceManager。
每个应用程序 ApplicationMaster 实际上是一个框架特定的库,其任务是协调来自 ResourceManager 的资源,并与 NodeManager 一起执行和监视任务。
2.基本组件服务
YARN 总体上是 master/slave 结构,在整个资源管理框架中,ResourceManager 为 master,NodeManager 是 slave。
YARN的基本组成结构,主要由 ResourceManager、NodeManager、ApplicationMaster 和 Container 等几个组件构成。
- ResourceManager(RM资源管理器) 是 Master上一个独立运行的进程,负责集群统一的资源管理、调度、分配等;
- NodeManager(NM节点管理器) 是 Slave 上一个独立运行的进程,整个集群上有多个。
- 定时向 RM 负责上报节点的状态,接收并处理来自RM的各种命令,启动 Container。
- 处理来自 AM 的命令;
- ApplicationMaster(AM) 相当于这个 Application 的监护人和管理者,负责监控、管理这个 Application 的所有 Attempt 在 cluster (集群) 中各个节点上的具体运行。
- 为应用程序向 RM 申请资源(core、memory),分配给内部 task。
- 与NM通信:启动/停止task,task是运行在container里面,AM 也是运行在 container ;
- Container (容器) 是 YARN 中分配资源的一个单位,封装了CPU、Memory等资源的一个容器,是一个任务运行环境的抽象;
- Client 提交作业,查询作业的运行进度,杀死作业。
ResourceManager 负责对各个 NadeManager 上资源进行统一管理和调度。当用户提交一个应用程序时,为用户程序分配第一个Container(容器),提供一个用来跟踪和管理程序的 ApplicationMaster 并分发到这个 Container(容器) 上,它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。由于不同的 ApplicationMaster 被分布到不同的节点上,因此它们之间不会相互影响。
Client 向 ResourceManager 提交的每一个应用程序都必须有一个 ApplicationMaster。它经过 ResourceManager 分配资源后,运行于某一个 Slave 节点的 Container 中;具体做事情的 Task,同样也运行与某一个 Slave 节点的 Container 中。Container 启动后,执行对应的任务。Task 执行完毕之后,向 ApplicationMaster 返回结果。ApplicationMaster 向 ResourceManager 汇报任务结束,请求 kill 进程。
3.YARD应用提交过程
Application 在 Yarn 中的执行过程,整个执行过程可以总结为三步:
- 应用程序提交
- 启动应用的 ApplicationMaster 实例
- ApplicationMaster 实例管理应用程序的执行