Advertisement

Building a big data platform system, architecture desig

阅读量:

作者:禅与计算机程序设计艺术

1.简介

Apache Hadoop是一个开源的分布式计算平台,在廉价商业设备上运行的同时具备良好的扩展性和容错能力。作为Hadoop生态系统的部分之一,在这个平台上运行着MapReduce这种并行计算框架。然而由于其复杂性和庞大的架构设计,在实际应用中开发人员通常需要投入大量时间和资源来规划、构建、部署以及维护Hadoop集群系统。本文旨在介绍如何利用现有的开源工具组件以及最佳实践方法来构建一个涵盖完整生命周期管理功能的大数据综合平台系统。该系统不仅能够支持海量数据存储与分析工作还能够确保具备可靠性能高可用性安全性灵活性以及易用性的特性

2.核心概念

HDFS (Hadoop Distributed File System)

作为Hadoop文件系统的关键组件之一,HDFS经过精心设计为高度容错的分布式存储方案,能够为众多应用场景提供稳定可靠的服务。该系统采用分块存储策略,将大量数据均匀分布在经济型商业服务器集群中,从而实现了高吞吐量和极低延迟的特点。同时,HDFS具备海量级数据存储能力,并采用名字节点与数据节点相结合的方式高效管理元数据信息,确保完整性和可用性。它的主要特性包括:第一,支持超线程集群下的大规模文件存取;第二,提供按需扩展的能力;第三,实现对多种操作系统环境的支持;第四,具备强大的容错机制以保障系统的稳定性与可靠性;第五,支持异步处理机制以提高系统的吞吐量和响应速度;第六,采用分布式架构以增强系统的可扩展性和安全性

  1. 数据冗余与容错能力:该系统基于复制机制实现数据的冗余与容错功能,在保障系统可靠性和稳定性方面具有显著优势。
  2. 自动化负载均衡:根据集群节点的情况自动分配存储位置,并确保各节点的数据均匀分布。
  3. 流式访问支持:该系统具备高效的流式读取能力,在无需等待全部文件加载的情况下即可快速获取所需数据。
  4. 强大的扩展性设计:基于分片机制和动态路由策略设计的分布式文件系统方案能够灵活应对各种规模的工作负载。
  5. 高可靠性保障:通过复制机制确保即使发生硬件故障或网络分区等异常情况也会保留完整的数据副本。

Yarn (Yet Another Resource Negotiator)

YARN(Yet Another Resource Negotiator)是由Hadoop实现的一个资源管理系统,旨在实现集群资源管理和作业调度功能。作为Hadoop 2.0版本引入的重要特性之一,在Apache基金会的支持下于2012年首次推出。其核心特点体现在以下几个方面:

  1. 分布式内存管理:YARN 可以较为简便地处理系统中的内存资源分配问题。
  2. 通用任务调度器:YARN 支持跨平台的任务调度接口,并为用户提供便捷的操作流程。
  3. 智能任务调度:基于多方面因素(如资源需求、应用程序依赖关系及作业历史行为),YARN 能够智能地分配和调度计算任务。
  4. 弹性伸缩性:在不同负载情况下自动调整计算资源的数量以满足需求。
  5. 高可用性:通过多套容错方案确保系统稳定运行而不中断服务。

MapReduce 是一种并行处理和生成大型数据集的软件架构

Mapreduce是一个专为大规模数据集合设计的多线程并行计算框架及其运行时引擎。该算法旨在高效地处理大规模数据集,并在以下领域展现出卓越的能力:在线搜索引擎、复杂数据分析、机器学习算法开发、图形渲染技术以及生物医学信息分析等各类计算密集型任务中。Mapreduce的主要特点如下:

  1. 相对容易:该框架提供了一套简洁且统一的API及编程模式设计,在实际应用开发中能够高效地编写、调试及测试各种并行计算程序。
  2. 高度可移植性:由于该框架完全基于Java语言实现,在理论上能够方便地迁移至任何基于Java虚拟机的应用环境。
  3. 有效提高处理效率:该框架能够在分布式集群环境中实现大规模数据集的有效并行计算,在性能上有显著提升。
  4. 强大的数据多样性支持能力:该框架能够处理包括但不限于文本文件、图像数据、视频流以及日志记录等多种类型的复杂应用场景。
  5. 具备容错机制的能力强:该框架内置了完善的容错机制,在任务执行过程中一旦出现故障能够自动识别并重试相关的失败作业项。

Apache Kafka (Open-source distributed event streaming platform)

Apache Kafka被视为一个开放源代码的分布式流数据处理平台。它最初由LinkedIn公司负责开发,并于后成为Apache项目下的一个子模块。该系统具备高吞吐量、低延迟、持久化和容错性的特点,并且便于实施大规模的数据流处理方案。其主要特性如下:

  1. 发布-订阅模式:Kafka采用发布-订阅模式,在同一主题下允许多个消费者同步关注并实时获取数据流。
  2. 集群支持:该系统采用集群化架构,在多台服务器间自动实现横向扩展功能。
  3. 分布式日志:Kafka系统具备分布式日志复制功能,在单个节点故障时可快速切换至备用节点以保障数据安全。
  4. 消息顺序性:系统采用消息持久化机制,在读取操作中能够严格遵循消息创建时间表维持数据一致性。
  5. 支持多种语言:该平台提供Java、Scala、Python、Ruby和.NET等多种主流编程语言的客户端开发接口。

3.架构设计

整体架构概览

从整体架构来看,Hadoop的架构体系主要由四个核心组件构成:分布式存储系统、资源分配与任务调度系统、并行计算框架以及分布式消息队列。其中,分布式存储系统(HDFS)主要用于实现海量数据的存储功能;资源分配与任务调度系统(YARN)则负责集群资源的分配与任务调度安排;并行计算框架(Mapreduce)则用于对海量数据进行并行处理与分析计算;而分布式消息队列(Apache Kafka)则承担着数据传输与消息发布订阅的责任。图中黄色虚线标识了数据流动的方向路径。

为了实现上述架构,需要部署以下几个基础设施服务:

  1. Hadoop 客户端:能够连接至HDFS、YARN、Mapreduce以及Apache Kafka集群,并提交并执行多种Mapreduce和Hadoop应用程序。该客户端支持在任意操作系统环境下运行,包括Linux、Mac OS X以及Windows系统等。
  2. NameNode:充当中心角色,在文件系统中管理命名空间(nAMESPACE)的整体规划与协调工作。它不仅负责将文件映射至数据块,并且实时监控各个DataNode的状态信息。
  3. DataNode:主要负责存储与提供数据块服务的角色。该组件会接受来自NameNode的指令,并通过网络接口与NameNode进行交互。
  4. JobTracker:作为核心协调节点,在资源调度与作业管理方面发挥关键作用。它通过调用Mapreduce Application Master接口来跟踪当前运行中的任务,并将其分配给相应的Task Tracker处理。
  5. TaskTracker:作为服务提供者,在YARN集群中负责处理特定的任务分配工作。该组件会通过Task Tracker接口获取资源相关信息,并向JobTracker汇报任务进度及结果反馈。
  6. Resource Manager:在YARN系统中担任关键角色,在资源分配与请求处理方面提供重要保障功能。
  7. Node Manager:在YARN架构中扮演重要角色,在节点资源调度与管理方面发挥核心作用。
  8. Zookeeper:作为一个开源分布式协调服务,在维护集群状态信息配置数据等方面承担重要职责。

文件系统的设计

HDFS是一种具备极高可靠性与极强可访问性的分布式文件系统。该分布式文件系统被特意设计成拥有强大的容错能力和极低的延迟特性。其核心设计理念旨在通过引入冗余机制来确保数据的一致性与系统的稳定运行。HDFS的存储层次结构如下所示:

Name Node:它是HDFS的核心节点;它负责管理文件系统的名称空间,并包含所有文件及其大小及块列表的信息;此外,在DataNodes之间分配数据块并定期与它们进行通信以维持平衡

  1. DataNode:在HDFS系统中作为存储单元的角色出现的数据节点负责管理着一部分特定的数据内容。每个DataNode配备一定量的磁盘空间,并负责存储其独有的部分数据块。定期更新状态信息并传输自身存有的data block.

  2. Secondary Name Node:当Name Node发生故障时, 由系统自动选举出新的Name Node作为备用, 但由于其工作时间有限, 在短时间内无法完成客户端的数据读写操作, 因此必须配置一个辅助的Secondary Name Node来接管这些任务。此备用名节点仅负责提供基础服务而不参与数据块复制与维护, 因此在Name Node失效后仍能正常运行并提供服务。

资源调度的设计

YARN是一种基于Hadoop的分布式文件存储与处理平台。它旨在通过高效的集群管理实现大规模数据处理的任务。 ResourceManager负责将系统中的各种资源划分为多个功能区,并运用一系列调度策略将应用请求精准地分配到相应的功能区中。 YARN的核心组件主要包括ResourceManager、NodeManager以及ApplicationMaster三个部分。

ResourceManager:它是YARN中的资源管理器,在集群中负责申请和释放资源以及任务调度与撤销的任务。当客户端应用程序提交资源请求时,ResourceManager会将这些请求传递给NodeManager以处理任务分配工作。该系统会将请求对应到集群中的可用节点上,并为每个请求选择一个最佳的NodeManager来执行相应的任务操作。

属于YARN系统的节点管理模块。该模块主要承担着对节点上存储、网络和处理器等资源的管理职责。它会接收到ResourceManager发送来的资源数据以及容器申请信息,并根据任务状态更新情况动态调整资源配置策略。实时提供关于当前节点存储能力和计算能力的具体数据。

ApplicationMaster:它属于YARN的应用管理模块,在各个MapReduce程序中担任入口角色。该系统负责跟踪任务运行的状态、处理可能出现的问题,并持续监控整个作业流程。当某个作业出现故障时,它会将问题反馈至ResourceManager,并协助重启或终止相关作业。

大数据处理的设计

Mapreduce旨在作为大数据集的并行计算编程模型,并配备相应的执行引擎。该系统专为处理海量数据和高计算量场景而设计。其核心组件包括Mapper、Reducer以及Combining组件。

Mapper是在Mapreduce编程模型中最简单的实现之一。作为类程序的一部分,它负责将原始数据转换为键-值对的形式进行处理。在处理过程中,通常情况下,程序首先会将所有原始数据加载到内存中进行解析,接着分析每个记录的内容并提取关键信息,最后将这些中间结果保存到磁盘上以便后续处理过程使用.

Reducer:它是MapReduce编程模型中最为复杂的一种实现形式。该组件的主要功能是接收来自Map阶段的所有中间键值对,并将这些整合后的键值对按照预设规则进行排序后生成最终的结果文件。Reducer接收来自Map阶段的所有中间键值对,并整合相同键值信息;接着按预设规则对整合后的键值对进行排序;最后将排序后的数据依次输出到预先分配的输出通道中以完成整个流程的操作

Combiner 属于 Mapreduce 编程模型的一个附加组件。它是一个特殊的 Reducer,并且可以在 Map 阶段执行,并且其速度远超常规 Reducer。其主要功能是在 Reducing 阶段之前将相同键的值进行合并。这样处理后就能 降低数据传输量并提升处理效率

消息队列的设计

Apache Kafka是一个免费的开放源代码分布式的实时数据流传输平台,在其核心设计理念中包括:具备高度的分布性以实现大规模数据处理能力;具备良好的扩展性以支持动态增加资源;支持超高的吞吐量以处理大量同时请求;保证极低的延迟以确保数据传输及时可靠。该平台主要包括以下几大核心功能:首先是可以高效地进行消息生产与消费操作;其次提供了灵活的数据分区机制以便于实现高效的负载均衡管理;第三是具备强大的容错能力从而能够保证系统的稳定运行不受干扰因素影响;最后支持异步通信模式以便于提高整体系统的处理效率和响应速度。

pubsub模式:kafka通过主题基底实现消息发布与订阅机制。生产者能够将消息发送至预先定义的特定主题。消费者则可注册感兴趣的主题。从而使得生产者与消费者无需直接建立通信链接。

Fault Tolerance: Kafka能够持续接收并处理所有消息流,并且提供系统的容错能力,确保服务稳定运行.该系统通过负载均衡机制实现弹性伸缩,当网络或服务节点出现故障时,默认切换至备用集群以维持服务稳定

  1. Scalability:Kafka能够按规模线性扩展,并能处理PB级别的数据。其设计目标是并致力于在保证低延迟的同时应对不断增加的业务负载。

Partitioning:Kafka采用多分区机制,并使同一主题的消息能够被分配至不同的分区以实现并行处理的目的

  1. APIs:Kafka提供了多种语言的API,包括Java、Scala、Python、C++、Go等。

4.具体操作步骤

本部分基于实例分析将深入探讨构建一个完整的大数据平台系统的流程

配置系统

首先,在确保环境配置完成后,在线创建Hadoop的客户端工具,并完成必要的准备工作。配置完成后需要设置以下三个核心配置文件:core-site.xml、hdfs-site.xml和mapred-site.xml,并根据具体需求填写路径参数设置相关内容后需进行验证检查。完成上述操作后,请确保系统资源分配正确并运行相应的启动脚本;随后在控制台界面中输入命令启动NameNode服务,并在控制台中观察其状态指示符;接着依次启动Secondary NameNode、DataNode和其他相关组件服务;最后通过命令行工具对各节点进行状态查询以确认其是否正常运行状态。

复制代码
    $ sudo vi /etc/hadoop/core-site.xml # 设置HDFS默认的副本数量
    <property>
      <name>dfs.replication</name>
      <value>3</value>
    </property>
    
    $ sudo vi /etc/hadoop/hdfs-site.xml # 设置HDFS的NameNode地址
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://localhost:9000</value>
    </property>
    
    $ sudo vi /etc/hadoop/mapred-site.xml # 设置YARN的ResourceManager地址
    <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>localhost</value>
    </property>
    
    # 检查NameNode和DataNode是否正常运行
    $ hadoop dfsadmin -report
    Configured Capacity: 309016736256 (2.97 TB)
    Total Storage Space: 5958326144 (5.66 GB)
    Currently Used Space: 1394089472 (1.32 GB)
    SSD Capacity: 12800 (120.0 GB)
    Disk Usage: 0.13%
    Remaining: 46297999488 (4.42 GB)
    DFS Remaining: 46297999488 (4.42 GB)
    DFS Used: 1394089472 (1.32 GB)
    DFS Used%: 0.27%
    Under replicated blocks: 0
    Blocks with corrupt replicas: 0
    Missing blocks: 0
    Missing blocks (with replication factor 1): 0
    Last contact: Fri Dec 09 17:25:08 UTC 2020
    
    $ jps | grep NameNode # 查看NameNode进程
    $ jps | grep DataNode # 查看DataNode进程
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

创建HDFS目录

创建新目录并在其中创建一个示例文件,确认目录已经成功创建。

复制代码
    $ hadoop fs -mkdir /user/hadoop/input
    $ echo "Hello World" > input.txt
    $ hadoop fs -put input.txt /user/hadoop/input
    $ hadoop fs -ls /user/hadoop/input # 查看是否成功创建目录并上传文件
    Found 1 items
    -rw-r--r--   1 root supergroup    12 2020-12-09 17:27 /user/hadoop/input/input.txt
    
      
      
      
      
      
    
    代码解读

使用Mapreduce计算WordCount

开发一个简单的MapReduce作业来计算输入文件中每个单词出现的频率,并将该作业命名为wordcount.py后上传至HDFS存储服务。

复制代码
    #!/usr/bin/env python
    import sys
    
    def main():
    current_word = None
    word_count = 0
    
    for line in sys.stdin:
        words = line.strip().split()
    
        for word in words:
            if current_word == word:
                word_count += 1
            else:
                if current_word:
                    print ("%s\t%d" % (current_word, word_count))
    
                current_word = word
                word_count = 1
    
    if current_word:
        print ("%s\t%d" % (current_word, word_count))
    
    
    if __name__ == "__main__":
    main()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

运行Mapreduce程序。

复制代码
    $ cat /user/hadoop/input/input.txt | hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-*.jar \
       -file wordcount.py \
       -mapper 'python wordcount.py' \
       -reducer 'aggregate' \
       -input '/user/hadoop/input/input.txt' \
       -output '/user/hadoop/output'
    
    # 查看输出结果
    $ hadoop fs -cat output/part*
    apple    1
    world    1
    hello    1
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

5.总结与展望

本文阐述了Hadoop的核心概念及其体系结构。论文详细探讨了其主要组件包括但不仅限于HDFS、YARN、Mapreduce及Apache Kafka的架构设计以及相应的配置细节。接着阐述了采用具体的操作方法如使用Hadoop命令行工具来操作HDFS并编写一个简明扼要的WordCount Mapreduce程序等技术要点。最后部分中提到了本文所提出的一些改进方案:

  1. 本文主要涉及HDFS、YARN、Mapreduce和Apache Kafka等核心组件的设计与实现。此外还包含了HIVE、Spark等其他重要组件的具体架构设计。为了进一步介绍这些组件的设计细节,请参考相关技术资料。
  2. 本文中采用的是静态图片形式来展示架构图,并未充分反映系统的真实逻辑架构。建议采用专业的工具绘制系统整体架构图,并配以详细说明。
  3. 作者仅演示了基础的HDFS命令行操作流程。为了帮助读者深入理解其运行机制,请提供更多具体的命令执行案例。
  4. 本篇文章主要介绍了WordCount程序的Mapreduce实现过程,并未完整展示完整的代码运行流程及其实际效果。建议完整呈现程序运行过程及相关数据处理结果。

全部评论 (0)

还没有任何评论哟~