HADOOP

Posted on Sat, Aug 17, 2019 大数据

Hadoop是什么?

基本概念

Hadoop的构建模块

HDFS - 分布式文件系统

  1. 理解HDFS

    多台计算机联网协同工作(有时也称为一个集群)就像单台系统一样解决某种问题,这样的系统我们称之为分布式系统。 分布式文件系统是分布式系统的一个子集,它们解决的问题就是数据存储。换句话说,它们是横跨在多台计算机上的存储系统。存储在分布式文件系统上的数据自动分布在不同的节点上。Hadoop在分布式计算与分布式存付中都采用了主/从(Master/slave)结构.

  2. 分离元数据和数据:NameNode和DataNode
    • NameNode:集群中的主要节点,主要用于管理及群众的各种数据。运行NameNode消耗大量的内存与IO资源。因此,为了减轻机器的负载,驻留NameNode的服务器通常不会存储用户数据或者执行MapReduce程序的计算任务。这意味着NameNode服务器不会同时是DataNode或者TaskTracker.
      • NameNode是Hadoop守护进程中最重点的一个,是master。
      • 管理HDFS元数据,例如文件路径,大小,权限,文件的block切片信息等。(元数据:描述文件信息,并非文件内部的真实内容。)
      • 配置副本策略。
      • 处理客户端的读写请求。
    • DataNode:负责执行NameNode下达的命令,当希望对HDFS文件进行读写时,文件被分割为多个块,由NameNode告知客户端每个数据块驻留在那个DataNode,客户端直接与DataNode守护进程通信,来处理与数据块相对应的本地文件.然而DataNode会与其他DataNode进行通信,复制这些数据块以实现冗余。
      • 通过心跳来向NameNode汇报自己还在工作。
      • 将HDFS数据块读取或者写入到本地文件系统的实际文件中.
      • 执行数据块的读写操作。
      • 定时向NameNode汇报block信息。
    • Secondary NameNode:协助NameNode管理。并非NameNode的替补,当NameNode故障可辅助恢复NameNode。NameNode是Hadoop集群的单一故障点,SNN的快照可以有助于减少停机的时间并降低数据丢失的风险。

      NameNode的失效处理需要人工的干预,即手动地重新配置集群,将SNN用作主要的NameNode.

  3. HDFS的副本机制
    • HDFS将每个文件存储成一系列的数据块,这个数据块称为block。为了容错,每个block都会有副本,以供block丢失或宕机时可以自动恢复。默认情况下每个block都有三个副本。
    • 当一切运行正常时,DataNode会周期性发送心跳信息给NameNode(默认是每3秒钟一次)。如果NameNode在预定的时间内没有收到心跳信息(默认是10分钟),它会认为DataNode出问题了,把它从集群中移除,并且启动一个进程去恢复数据。DataNode可能因为多种原因脱离集群,如硬件故障、主板故障、电源老化和网络故障等。
    • 对于HDFS来说,丢失一个DataNode意味着丢失了存储在它的硬盘上的数据块的副本。假如在任意时间总有超过一个副本存在(默认3个),故障将不会导致数据丢失。当一个硬盘故障时,HDFS会检测到存储在该硬盘的数据块的副本数量低于要求,然后主动创建需要的副本,以达到满副本数状态。
  4. JobTracker
    • JobTracker守护进程是应用程序和Hadoop之间的纽带。

      一旦提交代码到集群上,JobTracker就会确定执行计划,包括决定处理哪些文件,为不同的任务分配节点以及监控所有任务的运行。如果任务失败,JobTracker将自动重启任务,但所分配的节点可能会不同,同时受到预定义的重试次数限制。

    • 每一个Hadoop集群只有一个JobTracker守护进程,它通常运行在服务器集群的主节点上。
  5. TaskTracker
    • 与存储的守护进程一样,计算的守护进程也遵循主从架构:JobTracker作为主节点,监测MapReduce作业的整个执行过程。同时,TaskTracker管理各个任务在每个从节点上的执行情况。
    • TaskTracker的一个职责就是负责持续不断地与JobTracker通讯。如果JobTracker在指定的时间内没有收到来自TaskTracker的心跳,它会假定TaskTracker已经崩溃,进而重新提交相应的任务到集群的其他节点中。
  6. HDFS写过程
    • NameNode负责管理存储在HDFS上所有文件的元数据,它会确认客户端的请求,并记录下文件的名字和存储这个文件的DataNode集合。它把该信息存储在内存中的文件分配表里。
    • EXAMPLE:客户端发送一个请求给NameNode,说它要将“zhou.log”文件写入到HDFS。那么,其执行流程可如下描述。
  7. HDFS读过程
    • 为了理解读的过程,可以认为一个文件是由存储在DataNode上的数据块组成的。
    • EXAMPLE:客户端查看之前写入的内容的过程可如下描述。
  8. 跨多个DataNode切分文件
    • 在HDFS里,文件被切分成数据块,通常每个数据块64MB~128MB,然后每个数据块被写入文件系统。同一个文件的不同数据块不一定保存在相同的DataNode上。这样做的好处是,当对这些文件执行运算时,能够通过并行方式读取和处理文件的不同部分
    • 当客户端准备写文件到HDFS并询问NameNode应该把文件写到哪里时,NameNode会告诉客户端,那些可以写入数据块的DataNode。写完一批数据块后,客户端会回到NameNode获取新的DataNode列表,把下一批数据块写到新列表中的DataNode上。

YARN

MapReduce

Hive

Hadoop和Spark 的区别

Spark是什么?

基本概览

Spark 生态系统包含五个关键组件

  1. Spark Core:通用的分布式数据处理引擎。在其上有 SQL、流式处理、机器学习和图计算的库,所有这些库都可以在应用中一起使用。Spark Core 是整个项目的基础,提供分布式任务调度、安排和基本的 I/O 功能。
  2. Spark SQL:处理结构化数据的 Spark 模块,支持访问各种数据源的通用方法。用户使用 SQL 或 DataFrame API 在 Spark 程序中查询结构化数据。Spark SQL 支持 HiveQL 语法,并允许访问现有的 Apache Hive 仓库。服务器模式通过 Java 数据库连接或开放数据库连接提供标准连接。
  3. Spark Streaming:支持轻松构建可扩缩、具有容错性的流式解决方案。它将集成了 Spark 语言的 API 引入流处理中,可以像编写批量作业一样编写流式作业。Spark Streaming 支持 Java、Scala 和 Python等语言。流处理是指数据以某些外部系统或多个外部系统产生的事件的连续“流”形式进入处理引擎,并且处理引擎的运行速度非常快,以至于所有决策都无需停止数据流和首先存储信息。
  4. MLlib:Spark 可扩容的机器学习库,它所提供的工具可以简化实际的机器学习并为其扩容。
  5. GraphX:用于图和图并行计算的 Spark API。具有高灵活性,可以无缝处理图和集合 - 统一提取、转换、加载;进行探索性分析;在一个系统中迭代图计算。除了灵活性较高的 API 外,GraphX 还提供了多种图算法。同时具备 Spark 的灵活性、容错性和易用性。

KEY TERMS

RDD

  1. 定义
    • RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
      • Dataset:一个数据集合,用于存放数据的(本地集合:都在一个进程中)。
      • Distributed:RDD中的数据是分布式存储的,可用于分布式计算(跨机器跨进程)
      • Resilient:RDD中的数据可以存储在内存中或者磁盘中。
    • 在分布式计算中,需要分区控制,Shuffle控制,数据存储\序列化\发送,数据计算API ,等一系列功能。这些功能,不能简单的通过Python内置的本地集合对象(如 List,字典等)去完成。我们在分布式框架中,需要有一个统一的数据抽象对象,来实现上述分布式计算所需功能,这个抽象对象就是RDD。
    • 所有的运算以及操作都建立在 RDD 数据结构的基础之上。
    • 可以认为RDD是分布式的List或Array,抽象的数据结构,RDD是一个抽象类Abstract Class和泛型Generic Type。
  2. 特性
    1. 分区列表(a list of partitions)
      • Spark RDD逻辑上是被分区的,每个分区的数据是抽象存在。
      • 每一个分区都会被一个计算任务(Task)处理,分区数决定并行计算数量,RDD的并行度默认从父RDD传给子RDD。可以在创建RDD时指定RDD分片个数,如果不指定分区数量,当RDD从程序内存中已有的集合对象创建时,则默认分区数量就是程序所分配到的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认分区数为HDFS文件的Block数。
    2. 每一个分区都有一个计算函数(a function for computing each split)
      • 每个分区都会有计算函数,Spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute计算函数,对具体的分片进行计算;RDD中的分片是并行的,所以是分布式并行计算。
      • 计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。
    3. 依赖于其他RDD的列表(a list of dependencies on other RDDs)
      • RDD间有依赖关系,RDD都会有一个依赖的链条,称之为血缘关系,RDD之间进行迭代计算,和mapreduce的相似。我们总是由一个RDD计算产生新的RDD再由新的RDD迭代计算产生新的RDD,最后产生结果。
      • 因为有前后的依赖关系,所以当有分区数据丢失的时候,Spark会通过依赖关系重新计算,算出丢失的数据,而不是对RDD所有的分区进行重新计算。RDD之间的依赖有两种:窄依赖(Narrow Dependency)、宽依赖(Wide Dependency)。RDD是Spark的核心数据结构,通过RDD的依赖关系形成调度关系。通过对RDD的操作形成整个Spark程序。
    4. key-value数据类型的RDD分区器(Optionally, a Partitioner for key-value RDDS)

      控制分区策略和分区数。每个key-value形式的RDD都有Partitioner属性,它决定了RDD如何分区。当然,Partition的个数还决定每个Stage的Task个数。Partitioner是针对key-value的形式,如果不是key-value的形式,它就不会有具体的Partitioner。用户可以自定义分区策略,如Hash分区等。

    5. 每个分区都有一个优先位置列表(Optionally, a list of preferred locations to compute each split on)

      它会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Partition块的位置。在具体分片前,它已经清楚地知道任务发生在什么节点上,也就是说,任务本身是计算层面的、代码层面的,代码发生运算之前已经知道它要运算的数据在什么地方,有具体节点的信息。

      数据不动代码动的特点:数据不动代码动的最理想情况就是数据就在当前节点的内存中。Spark本身在进行任务调度时候,会尽可能将task任务分配到处理数据的数据块所在的具体位置。

DataFrame

DataFrame是一个二维表结构,那么表格结构为: • 行 • 列 •

表结构描述 DataFrame的组成如下:

  1. StructType对象描述整个DataFrame的表结构
  2. StructField对象描述一个列在数据层面的信息
  3. Row对象记录一行数据
  4. Column对象记录一列数据并包含列的信息

RDD可看作是分布式的对象的集合,Spark并不知道对象的详细模式信息,DataFrame可看作是分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。

EXAMPLE