
Hadoop 学习笔记
Chapter 1:Big Data Concept
一、Type of Big Data
1、Structured(结构化)
以固定格式存储、访问和处理的数据都称为结构化数据,但灵活性差。比如 MySQL 中储存的数据表。
2、Unstructred(非结构化数据)
任何形式或结构未知的数据都属于非结构化数据。这类数据通常包含大量文本、图像、音频、视频等信息,格式多样且复杂。比如你在搜索引擎中搜索关键词后返回的结果。
3、Semi-structred(半结构化)
半结构化数据是介于结构化数据和非结构化数据之间的一种数据类型。它虽然没有严格的数据模式(Schema),但包含一定的结构信息,通常通过标签、标记或格式来组织数据。比如 XML 文件中表示的数据。
二、Characteristics of Big Data
1、Volume(数据量)
指数据的规模巨大。随着互联网、物联网等技术的发展,数据量呈指数级增长,传统的数据处理工具难以应对。
2、Variety(多样性)
指数据的类型多样。包括结构化数据(如数据库)、半结构化数据(如XML、JSON)和非结构化数据(如文本、图像、视频等)。
3、Velocity (速度)
指数据生成和处理的速度快。数据实时或近实时地产生,要求系统能够快速处理和分析,以支持实时决策。
4、Veracity(真实性)
指数据的准确性和可信度。大数据中可能存在噪声、不一致或错误,确保数据的质量是分析结果可靠的关键。
三、Hadoop Ecosystem tools
1、HBASE
HBase 是一个开源的、非关系型的分布式数据库。换句话说,它是一种 NoSQL 数据库。它支持所有类型的数据,因此能够处理 Hadoop 生态系统中的任何内容。
2、HIVE
Apache Hive 数据仓库软件构建在 Apache Hadoop 之上,用于查询和管理大规模分布式数据集。它提供以下功能:HIVE 提供了一系列工具来实现 ETL(extract提取/transform转换/load加载)。HIVE 可以存储、查询和分析存储在 HDFS(或 HBase)中的大规模数据。SQL 被转换为 MapReduce 作业并在 Hadoop 上运行,以执行统计分析和处理海量数据。
Hive 定义了一种类似于 SQL 的查询语言,称为 HQL。熟悉 SQL 的用户可以直接使用 Hive 查询数据。
3、HADOOP
在传统方式中,所有数据都存储在单一的中央数据库中。随着大数据的兴起,单一的数据库已不足以处理这些任务。解决方案是使用分布式方法来存储海量信息。数据被分割并分配到许多独立的数据库中。HDFS 是一个专门为在商用硬件上存储大规模数据集而设计的文件系统,它将信息以不同的格式存储在多台机器上。
4、STORM
Apache Storm 是一个免费、开源的分布式实时计算系统,它简化了流数据的可靠处理。
Storm 使用 Hadoop Zookeeper 进行集群协调,可以充分确保大型集群的良好运行。每条信息的处理都可以得到保证。
5、Zookeeper
Apache Zookeeper 是任何 Hadoop 作业的协调者,在 Zookeeper 之前,Hadoop 生态系统中不同服务之间的协调非常困难且耗时。早期的服务在交互时存在许多问题,例如同步数据时的常见配置。即使服务配置好了,服务配置的变化也会使其变得复杂且难以处理。分组和命名也是一个耗时的因素。
由于上述问题,Zookeeper 被引入。它通过执行同步、配置维护、分组和命名节省了大量时间。尽管它是一个简单的服务,但它可以用于构建强大的解决方案。
6、SQOOP
Sqoop 是 Apache 的顶级项目,它允许用户将数据从关系数据库提取到 Hadoop 中进行进一步处理。在获得分析结果后,Sqoop 还可以将分析结果导回数据库,供其他客户端使用。
Chapter 2:Hadoop and Big Data Architecture
一、 Hadoop Operating Modes
1、Local runtime mode(本地运行模式)
默认情况下,Hadoop 会以非分布式模式运行,作为一个单独的 Java 进程,这种模式称为 本地模式(Local/Standalone Mode)。在这种模式下,不需要运行任何守护进程,所有的程序都在单个 JVM 上执行。由于在本地模式下更容易测试和调试 MapReduce 程序,因此这种模式适合在开发阶段使用。
2、Pseudo-distributed operating mode(伪分布式运行模式)
Hadoop 可以在单个节点上运行,每个 Hadoop 守护进程以单独的 Java 进程运行,这种模式称为 伪分布式模式(Pseudo-Distributed Mode)。在这种模式下,所有的 Hadoop 进程都运行在单个服务器节点上,以模拟一个完全分布式的环境,通常用于实验学习阶段。Hadoop 伪分布式集群启动后,也会像完全分布式集群一样有五个进程。这些进程的名称如下:
- NameNode
- DataNode
- SecondaryNameNode
- ResourceManager
- NodeManager
HDFS 守护进程
HDFS(分布式文件系统)用于解决海量数据存储的问题。HDFS 的正常运行需要以下三个进程:
- NameNode
- DataNode
- SecondaryNameNode
也就是说,运行 start-dfs.sh
命令可以启动 HDFS 守护进程,以对外提供服务。
YARN 守护进程
YARN 是 Hadoop 3.x 中的资源管理系统。YARN 的正常运行需要以下两个进程:
- ResourceManager
- NodeManager
运行 start-yarn.sh
命令可以启动 YARN 守护进程,以对外提供服务。
3、Fully distributed operating mode(完全分布式运行模式)
Hadoop 可以在集群上运行,每个 Hadoop 守护进程以 Java 进程的形式运行在集群中的每个服务器节点上,这种模式称为 完全分布式模式(Full-Distributed Mode)。这种模式通常用于实验验证和企业部署阶段。集群中的进程总数与伪分布式模式相同,即以下五个进程:
- NameNode
- DataNode
- SecondaryNameNode
- ResourceManager
- NodeManager
4、High availability (HA) operating mode(高可用运行模式)
高可用性集群(High Availability Cluster) 的概念是在 Hadoop 2.x 中引入的,目的是解决 Hadoop 1.x 中存在的单点故障问题。众所周知,HDFS 架构遵循 主从拓扑(Master/Slave Topology),其中 NameNode 作为主守护进程,负责管理其他称为 DataNode 的从节点。这种单一的主守护进程(NameNode)成为了系统的瓶颈。尽管 SecondaryNameNode 的引入确实防止了数据丢失,并减轻了 NameNode 的部分负担,但它并没有解决 NameNode 的可用性问题。
而 HDFS 的高可用性(HA)架构通过引入 Active/Standby NameNode 配置,解决了 NameNode 的单点故障问题。在高可用性集群中,同时运行两个 NameNode:
- Active NameNode:负责处理所有客户端请求和管理 DataNode。
- Standby/Passive NameNode:作为备份 NameNode,实时同步 Active NameNode 的状态,准备在故障时接管工作。
如果一个 NameNode 宕机,另一个 NameNode 可以接管责任,从而减少集群的停机时间,为 Hadoop 集群提供了故障转移能力。
在 HDFS HA 架构中,保持一致性有两个问题:
- 主动和备用 NameNode 应始终保持同步,即它们应具有相同的元数据。这将使我们能够将 Hadoop 集群恢复到崩溃时的相同命名空间状态,从而提供快速的故障转移。
- 应始终只有一个主动 NameNode,因为两个主动 NameNode 会导致数据损坏。即集群被分成多个较小的集群,每个集群都认为自己是唯一的主动集群,这种情况称为 "脑裂"(split-brain)。为了避免这种情况,需要进行隔离。隔离是确保在特定时间只有一个 NameNode 保持活动的过程。
HDFS HA 架构使用两种方法解决 Active 和 Standby NameNode 同步的配置:
使用法定日记节点( Quorum Journal Nodes):
- 备用 NameNode 和活动 NameNode 通过一组独立的节点或守护进程(称为 JournalNodes)保持同步。这些节点处理请求并将信息复制到网络中的其他节点,从而在 JournalNode 发生故障时提供容错能力。
- 活动 NameNode 负责更新 JournalNodes 中的 EditLogs(编辑日志)。
- 备用 NameNode 持续读取 JournalNodes 中的 EditLogs 变化,并将其应用到自身。
- 在故障转移期间,备用 NameNode 确保在成为新的活动 NameNode 之前,已从 JournalNodes 更新其元数据信息,与 活动 NameNode 保持同步。
- 所有 DataNodes 都可以访问两个 NameNode 的 IP 地址,并向其发送数据块位置信息。这种机制使备用 NameNode 能够快速接管,减少系统停机时间。
使用共享存储(Shared Storage):
- 备用 NameNode 和活动 NameNode 通过共享存储设备保持同步。活动 NameNode 会记录对其的任何修改,并将其写入共享存储中的 EditLog。
- 备用 NameNode 读取共享存储中的 EditLogs 并写入自身。
- 在发生故障转移时,备用 NameNode 会优先从 EditLogs 更新元数据,然后接管活动 NameNode 的职责,从而保证状态与故障转移前保持一致。
- 管理员必须配置至少一种隔离方法(fencing method)以避免 "脑裂"(split-brain)情况。
- 可能使用的隔离机制包括:终止 NameNode 进程、撤销其对共享存储目录的访问权限等。
Chapter 3:Hadoop Composition and Structure
一、Hadoop Architecture and Components(Hadoop 架构和组件)
Hadoop 采用主从拓扑结构。在这种拓扑结构中,我们有一个主节点(Master Node)和多个从节点(Slave Nodes)。主节点的功能是向各个从节点分配任务并管理资源,而从节点执行实际的计算。从节点存储真实数据,而主节点存储元数据(即关于数据的数据,即记录数据存放位置)。
1、Hadoop Core Components(Hadoop 核心组件)
Hadoop 是一个框架,允许在多个节点系统上存储大规模数据。Hadoop 架构通过多个组件实现数据的并行处理:
- Hadoop HDFS:在多个从节点上存储数据。
- Hadoop YARN:用于Hadoop集群的资源管理。
- Hadoop MapReduce:用于分布式数据处理。
2、Hadoop Architecture(Hadoop 架构)
- HDFS(Hadoop 分布式文件系统):Hadoop生态系统中的主要存储单元。HDFS 使 Hadoop 能够快速访问数据,并具备良好的扩展性。
- YARN(Yet Another Resource Negotiator):是 Hadoop 2.0 版本后引入的更新,负责资源管理和作业调度。
- MapReduce:是一种基于 Java 编程语言的软件数据处理模型,由 Map(映射)和 Reduce(归约)两部分组成。 MapReduce 处理流程可以执行各种大数据操作,如数据过滤和排序等。
二、Hadoop HDFS Architecture(Hadoop HDFS架构)
HDFS(Hadoop Distributed File System,Hadoop 分布式文件系统)是 Hadoop 的数据存储系统。HDFS 将数据单元拆分为更小的单元,称为数据块(Blocks),并以分布式方式存储。HDFS 运行两个守护进程:主节点(NameNode)和从节点(DataNode)。
1、HDFS Core Components(HDFS 核心组件)
HDFS 由以下 3 个组件组成:
- NameNode:在内存(RAM)和磁盘上存储元数据。
- Secondary NameNode:在磁盘上存储 NameNode 的元数据副本。
- DataNode:以数据块的形式存储实际数据。
Client(客户端):客户端是一个充当服务提供者的客户端(如命令行或程序),它请求资源并向 Hadoop 集群发送请求。具体职责如下
- 文件共享:当文件上传到 HDFS 时,客户端会将文件拆分为多个数据块并存储到 DataNode 中。
- 与 NameNode 交互:获取文件位置信息。
- 与 DataNode交互:执行数据的读取或写入操作。
- 提供 HDFS 管理命令:如启动或关闭 HDFS,以及使用
start-all.sh
命令启动集群。
NameNode 和 DataNode:
- NameNode(主节点):HDFS 的核心组件,负责存储元数据、监控从节点的运行状态,并向 DataNode 分配任务。
- DataNode(从节点):存储实际数据,并通过 心跳机制 向 NameNode 报告其运行状态和任务状态。如果 DataNode 未能响应NameNode,则该节点被视为失效,并由 NameNode 将任务重新分配给其他可用的 DataNode。
- Secondary NameNode(辅助NameNode):并不是 NameNode 的备份,而是充当缓存(Buffer),定期将 NameNode 的 **Edit-log(日志)**合并到 **FS-image(文件系统快照)**中,以减少 NameNode 的存储负担。
2、Block in HDFS(HDFS 数据块)
HDFS 是 Hadoop 的存储层,数据分布在多个服务器上。**数据块(Block)**是计算机系统中最小的存储单元。在 Hadoop 中,默认的数据块大小为 128MB。这些数据块会被随机分配并存储在不同的从节点(DataNode)上。HDFS 会将大规模数据拆分成多个 128MB 的数据块,并分布存储在多个机器上。
3、Replication Management(HDFS 复制管理)
HDFS 具有很高的容错能力,它采用**副本机制(Replication)**来处理故障,即同一份数据会在不同的 DataNode 上存储多个副本,以确保即使某个 DataNode 失效,数据仍然可以从其他节点读取。
为了提供容错能力,HDFS 使用复制技术,将数据块(Blocks)复制多份,并存储在不同的 DataNode 上。**复制因子(Replication Factor)**决定了每个数据块的副本数量,默认值为 3,但可以根据需求进行配置。
复制管理规则
- 同一个 DataNode 上不能存放相同的数据块。
- 在启用机架感知(Rack Awareness)模式时,同一数据块的所有副本不能存放在同一个机架(Rack)上。
例如,假设数据块 A、B、C 和 D 被复制 3 次,并分布在不同的机架上。如果 DataNode 7 宕机,仍然可以从 Rack 1 的 DataNode 4 和 Rack 3 的 DataNode 9 访问数据块 C,从而确保数据的高可用性。
4、Advantages and Disadvantages of HDFS Architecture(HDFS 架构的优缺点)
优点
✔ 高容错性:数据会自动存储多个副本,丢失后可自动恢复,提高系统可靠性。
✔ 适合大数据处理:可处理 PB 级别数据,支持存储超过百万个文件。
✔ 支持流式数据读取:确保数据一致性,适用于大规模数据处理。
✔ 可部署在低成本硬件上:通过**多播机制(Multicast Mechanism)**提高可靠性,降低硬件成本。
缺点
✘ 不适用于低延迟数据访问:例如毫秒级存储需求的应用场景。
✘ 不适合存储大量小文件:小文件会占用大量 NameNode 内存,导致存储效率低下。小文件的查找时间可能超过读取时间,不符合 HDFS 的设计目标。
✘ 不支持并发写入和随机修改:
- 文件只能由一个线程写入,不支持多线程同时写入。
- 仅支持追加写入(Append),不支持随机修改文件内容。
二、Hadoop's YARN Architecture(Hadoop YARN 架构)
Hadoop YARN(Yet Another Resource Negotiator)是 Hadoop 的集群资源管理层,负责资源分配和作业调度。YARN 作为 Hadoop 2.0 版本引入的组件,是 Hadoop 体系结构中HDFS 和 MapReduce 之间的中间层。
1、Why YARN?(为什么需要 YARN?)
在 Hadoop 1.0(MRV1,MapReduce Version 1)中,MapReduce 同时执行数据处理和资源管理的功能。
MRV1 架构的问题:
- Job Tracker 负责资源分配、调度和任务监控。它将 map 和 reduce 任务分派给多个下级进程,称为 Task Trackers。Task Trackers 会定期向 Job Tracker 报告进度。
- 这种设计由于只有一个 Job Tracker,因此在扩展性方面存在瓶颈。实际上,在拥有 5000 个节点、4 万个并发任务的集群上,这种架构就已经达到极限。
- 除了扩展性的问题外,MRV1 在计算资源的利用率方面也不高。同时,Hadoop 框架也被限制在只能运行 MapReduce 类型的任务。
为了解决上述问题,在 Hadoop 2.0 中引入了 YARN。
YARN 的基本思想是将资源管理和作业调度的职责从 MapReduce 中分离出来。YARN 开始让 Hadoop 能够运行非 MapReduce 类型的作业。
2、YARN Core Components (YARN 核心组件)
YARN 包含以下几个关键组件:
- ResourceManager(资源管理器):每个集群一个
- ApplicationMaster(应用主控):每个应用一个
- NodeManagers(节点管理器):每个节点一个
- Container(容器)
YARN 的基本原理是将资源管理和作业调度/监控功能分离到不同的守护进程中:
NodeManager(NM):监控容器的资源使用情况(如 CPU、内存、磁盘、网络等),并定期向 ResourceManager 发送信号(前面提到过的心跳机制)。
ApplicationMaster(AM):管理单个应用的资源需求,与调度器交互以获取所需资源,并与 NodeManager 协作来执行和监控任务。
Container(容器):容器封装了一组资源(如内存、CPU 和网络带宽),YARN 根据资源情况进行分配。容器为应用分配使用特定资源的权限。
ResourceManager(RM):集群资源的总管,负责跟踪集群中所有可用资源及各个 NodeManager 的资源贡献情况。包含两个主要子组件:
- Scheduler(调度器):根据应用需求,为不同的运行中应用分配资源。这是一个“纯调度器”,不会监控应用状态,也不会重新调度因软硬件错误失败的任务。
- Application Manager(应用管理器):接收客户端提交的作业,并在 ApplicationMaster 失败时进行重启。
Hadoop YARN 的应用提交过程:
- 提交作业
- 获取 Application ID
- 创建 Application Submission Context(应用提交上下文)
- 启动容器启动流程
- 4a. 启动容器
- 4b. 启动 ApplicationMaster
- 分配资源
- 启动容器执行
- 6a. 创建容器
- 6b. 启动任务
- 执行应用
Hadoop YARN 中的应用执行流程
Apache Hadoop YARN 的应用执行涉及以下步骤:
- 客户端提交一个应用程序
- ResourceManager 分配一个容器来启动 ApplicationMaster
- ApplicationMaster 向 ResourceManager 注册
- ApplicationMaster 向 ResourceManager 请求更多容器资源
- ApplicationMaster 通知 NodeManager 启动容器
- 应用程序代码在容器中执行
- 客户端通过 ResourceManager 或 ApplicationMaster 来监控应用程序状态
- 应用程序完成后,ApplicationMaster 向 ResourceManager 注销