Hadoop 和 Spark 简介

发布时间 2023-08-25 15:18:43作者: 風栖祈鸢

Hadoop 和 Spark 简介

Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop 过去一直是大数据的经典解决方案,它包含两个部分:Hadoop HDFS 和 Hadoop MapReduce,分别是分布式存储模块和分布式处理模块,但现在已经有了更好的处理模块 Spark,不过仍要基于 Hadoop 的分布式存储模块 HDFS。

HDFS

HDFS(Hadoop Distributed File System,分布式文件系统)是一个用于存储大规模数据的分布式文件系统,是 Apache Hadoop 生态系统的一部分。它旨在处理大规模数据集并能够在计算集群中高效地存储和访问数据。HDFS 是为支持大数据处理而设计的,特别适用于那些需要跨多台计算机进行分布式存储和处理的场景。

HDFS 的主要特点包括:

  1. 分布式存储: HDFS 将文件切分成小块(block),并将这些块分布式存储在计算集群的多个节点上。这样可以实现数据的并行存储和处理。
  2. 容错性: HDFS 具有高度的容错性,当某个节点发生故障时,系统会自动将存储在该节点上的数据复制到其他节点上,确保数据的可靠性和可用性。
  3. 扩展性: HDFS 可以轻松地扩展到数百甚至数千台计算机,适应不断增长的数据量。
  4. 数据流式传输: HDFS 通过数据流式传输的方式来处理数据,提高了数据的传输效率。
  5. 副本机制: HDFS 使用副本机制来增加数据的冗余性和容错性。通常,每个块会被复制到集群中的多个节点上。
  6. 适合大文件: HDFS 特别适合存储大文件,因为它将文件切分成固定大小的块,适应大文件的存储和处理。

HDFS 在大数据处理、批处理、数据仓库等场景下得到广泛应用,特别是在 Apache Hadoop 生态系统中,被用作底层存储引擎来支持各种大数据处理框架和工具。

img

HDFS(Hadoop Distributed File System)的架构是为大规模数据存储和处理而设计的分布式文件系统。它的架构具有高度的可靠性、扩展性和容错性,适用于大数据处理应用。以下是 HDFS 的基本架构和组件:

  1. NameNode(主节点):
    NameNode 是 HDFS 的关键组件之一,负责管理文件系统的命名空间和元数据。它维护了文件和目录的层次结构、文件块的映射关系以及副本位置等元数据信息。NameNode 还负责对数据块的分配和复制进行控制,以保障数据的可靠性和高效性。
  2. DataNode(数据节点):
    DataNode 是存储实际数据块的节点。每个 DataNode 存储自己所在节点上的数据块,并定期向 NameNode 报告它所持有的数据块信息。DataNode 也负责处理数据块的读写请求。
  3. Secondary NameNode(辅助主节点):
    Secondary NameNode 负责辅助 NameNode 的工作,但它并不是一个热备份的主节点。Secondary NameNode 定期从主节点复制元数据信息,并生成一个新的镜像文件,然后将这个镜像文件交给主节点,以帮助主节点恢复元数据的一致性。尽管名字中带有 "Secondary",但它并不替代主节点,仅用于协助主节点的工作。
  4. Block:
    数据在 HDFS 中以固定大小的数据块(Block)存储。默认情况下,一个块的大小是 128 MB 或 256 MB。块是 HDFS 存储和管理数据的最小单元。

HDFS 的工作流程如下:

  1. 客户端发送文件写请求给 NameNode,NameNode 返回适合写入数据的 DataNode 列表。
  2. 客户端将数据块分成小块,依次发送给 DataNode。
  3. DataNode 将数据块写入本地磁盘,然后向 NameNode 报告已写入成功。
  4. 客户端读取文件时,发送读请求给 NameNode,NameNode 返回适合读取数据的 DataNode 列表。
  5. 客户端从 DataNode 读取数据块。

HDFS 的架构通过分布式存储和复制机制来保障数据的可靠性和容错性,适合于大规模数据存储和处理的应用场景。

MapReduce

MapReduce 是一种用于大规模数据处理的编程模型和处理框架,最早由 Google 提出,并在 Apache Hadoop 中得到广泛实现和应用。MapReduce 可以用于并行处理分布式存储的大规模数据集,以进行数据的转换、整理、计算和分析。

为什么需要MapReducer

(1)海量数据在单机上处理因为硬件资源限制,无法胜任;

(2)而一旦将单机版程序扩展到集群来分布式运行,将极大增加程序的复杂度和开发难度;

(3)引入 MapReduce 框架后,开发人员可以将绝大部分工作集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。

MapReduce 模型实际上包含三个主要阶段:Map 阶段、Shuffle 阶段和 Reduce 阶段:

  1. Map 阶段:
    在 Map 阶段中,大规模数据集被分成若干个数据块,每个数据块由一系列的键值对组成。Map 函数会对每个键值对进行处理,生成一组中间键值对作为输出。Map 阶段通常用于将数据进行过滤、分组、计数等转换操作。
  2. Shuffle 阶段:
    Shuffle 阶段是 MapReduce 模型中的重要步骤,它会对 Map 阶段输出的中间键值对进行分组和排序,以确保相同的键值对被分配到同一个 Reduce 任务中。这个阶段也涉及数据在节点之间的传输,因此在性能优化中具有重要地位。
  3. Reduce 阶段:
    在 Reduce 阶段中,每个 Reduce 任务会处理一组分组好的键值对,这些键值对具有相同的键。Reduce 函数会对每组键值对进行汇总、聚合、计算等操作,生成最终的结果。

MapReduce 提供了一种简化大规模数据处理的方法,它可以在分布式计算集群上同时进行多个 Map 和 Reduce 任务,以提高计算效率。虽然 MapReduce 在处理大规模批量数据上非常有效,但它并不适合处理一些需要迭代、交互式和复杂数据分析的场景。

Apache Hadoop 是一个著名的开源框架,提供了 MapReduce 编程模型的实现,用于在分布式环境中进行大规模数据处理。不过,在现代大数据处理中,越来越多的框架(如 Apache Spark)提供了更高级别、更灵活和更高效的数据处理方式,逐渐取代了传统的 MapReduce 模型。

Spark

Apache Spark 是一个快速、通用的大数据处理框架,它支持在分布式环境中进行批处理、交互式查询、流处理和机器学习等任务。

RDD

RDD(Resilient Distributed Dataset,弹性分布式数据集)是 Apache Spark 中的核心数据抽象,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型;它是一种分布式的、可弹性恢复的数据集合。RDD 提供了高级别的数据操作接口,允许开发者在大规模集群上进行并行计算,而无需过多关注底层的分布式细节。

RDD 具有以下特点:

  1. 分布式性质: RDD 能够跨多台计算机进行分布式存储和计算,充分利用集群的计算资源。
  2. 弹性恢复: RDD 具有弹性,即在计算节点发生故障时能够恢复数据。通过数据的分片和副本机制,RDD 可以重新计算丢失的数据块。
  3. 不可变性: RDD 是不可变的,一旦创建就不能被修改。如果你想对 RDD 进行操作,通常是创建新的 RDD。
  4. 惰性计算: RDD 使用惰性计算(Lazy Evaluation),只有在需要计算结果的时候才会进行实际的计算。这种方式可以优化计算资源的使用。
  5. 支持多种数据源: RDD 可以从多种数据源中创建,如 HDFS、本地文件、数据库等。
  6. 可操作性: RDD 提供了丰富的高阶操作,如映射、过滤、聚合等,以及自定义的函数操作。

Spark 的编程模型基于 RDD,它是构建 Spark 应用程序的核心基础。通过对 RDD 进行一系列的转换操作,可以构建出复杂的数据处理流程。RDD 也在 Spark 内部优化了计算执行计划,以提高计算效率。

尽管 RDD 是 Spark 的核心抽象,但后续版本的 Spark 引入了 DataFrame 和 Dataset 等高级数据抽象,为开发者提供更方便、更高效的数据处理方式。

RDD(Resilient Distributed Dataset)和 HDFS(Hadoop Distributed File System)是两个不同的概念,但在大数据处理中它们通常会结合使用,特别是在 Apache Spark 中。

  1. RDD:
    RDD 是 Spark 中的核心数据抽象,它是一种分布式的、不可变的数据集合。RDD 提供了高级别的数据操作接口,允许在大规模集群上进行并行计算。RDD 可以从各种数据源中创建,如 HDFS、本地文件、数据库等。RDD 支持数据的分片和副本机制,以及弹性恢复,使得数据能够在计算节点发生故障时进行恢复。
  2. HDFS:
    HDFS 是分布式文件系统,用于存储大规模数据。它将数据分成固定大小的数据块,然后将这些数据块分布式存储在计算集群的多个节点上。HDFS 提供了高度的容错性和可靠性,能够在节点故障时自动恢复数据。HDFS 通常用作底层存储引擎,支持各种大数据处理框架和工具,包括 Spark。

在 Spark 中,通常会将数据存储在 HDFS 上,并通过 Spark 的 RDD 抽象来进行分布式计算。Spark 可以直接从 HDFS 读取数据,并将其转换为 RDD 进行处理。这样,RDD 提供了高级别的抽象,允许开发者在大数据集群上进行数据处理,而无需过多关注底层的分布式细节。

总结起来,RDD 是 Spark 中的核心数据抽象,用于进行分布式计算,而 HDFS 则是 Spark 数据存储的一种选择,通常与 RDD 结合使用,提供数据的分布式存储和高可靠性。

Spark 执行流程

Spark 任务的简要执行流程如下:

  1. 应用程序启动: 用户编写 Spark 应用程序,通常使用 Scala、Java、Python 或 R 等编程语言。应用程序的入口点是 SparkSession,它负责创建 Spark 上下文,充当应用程序与 Spark 集群之间的接口。
  2. 构建 RDDs 或 DataFrames: Spark 的核心数据结构是弹性分布式数据集(Resilient Distributed Dataset,RDD)和数据框架(DataFrame)。应用程序通过对数据集的操作来构建 RDDs 或 DataFrames,这些操作可以包括从文件、数据库、内存数据等来源加载数据,或者对现有数据进行转换和处理。
  3. 转换操作: 应用程序可以对 RDDs 或 DataFrames 执行一系列的转换操作,如 mapfiltergroupBy 等。这些操作会创建一个新的 RDD 或 DataFrame,而不会立即执行计算。
  4. 触发转换操作: Spark 的转换操作是惰性求值的,意味着在应用程序中定义转换操作并不会立即执行计算。只有当触发一个需要计算结果的操作时,Spark 才会开始执行计算。这个触发操作通常是一个动作(Action)操作。
  5. 动作操作: 动作操作会触发 Spark 集群上的实际计算。例如,countcollectsaveAsTextFile 等操作会触发计算,并将结果返回给应用程序。
  6. 任务划分: 当触发一个动作操作时,Spark 会将任务划分成一系列的任务(Task)。每个任务会在集群的不同节点上执行,并处理数据的不同分区。
  7. 任务调度: Spark 集群的集群管理器(如YARN、Mesos、Standalone等)负责将任务分配给集群中的可用资源。调度器会考虑资源的可用性、数据本地性等因素,以优化任务的执行。
  8. 任务执行: 每个任务在各自的节点上执行,它们会按照转换操作的指令对数据进行处理。如果数据本地性较好,那么任务可以直接在节点上进行计算,减少数据传输。
  9. 数据分片和聚合: 在任务执行过程中,数据会被分片处理,然后在最后的步骤中进行聚合,以生成最终的结果。
  10. 结果返回: 一旦所有任务完成执行,结果将被汇总并返回给应用程序。结果可以被保存到文件系统、数据库等,或者在应用程序中进一步处理和分析。
  11. 资源释放: 当应用程序执行完成后,Spark 会释放所使用的资源,关闭与集群的连接,然后应用程序终止。

Spark 任务的执行流程涉及数据的加载、转换、任务划分、调度、执行和结果返回等多个阶段,它通过惰性求值和分布式计算优化来实现高效的大数据处理。