引言

在本章,通过对 Hadoop 和 Spark 的概述,使您对它们的框架,包括核心组件、数据怎样在 MapReduce 和 Spark 中流转有所了解;通过分析它们的运行框架,以便更好的理解应用怎样在 Hadoop 和 Spark 中工作。另外,您也将了解到它们生态系统中的各个组件功能特点。

Hadoop & Spark 概述

Apache Hadoop 是一种通过服务集群并使用 MapReduce 编程数据模型完成大数据的分布式处理框架,核心模块包括:MapReduce,Hadoop Utilites,YARN(Yet Another Resource Negotiator)和 HDFS(Hadoop Distributed File System)。 MapReduce是一个提供平行计算的编程模型,具有位置感知计划(locality-aware scheduling),容错(fault-tolerance)和可扩展性(scalability)。

MapReduce 把数据处理分为两个阶段:Map 阶段和 Reduce 阶段,处理流程如下:

  1. 每一个分割文件对应一个 map 任务,mapper 首先将输入数据转化为中间数据,然后将结果输出到一个循环的内存缓冲中(默认100M);
  2. 当这个缓冲中的数据接近阀值(默认80%),mapper 开始将缓存中的内容写入本地磁盘,但在数据写入之前,mapper 将数据分成几个写入区,写入区的数据量对应于 reducer 的数量(或 reduce task 数量);同时,在数据分区期间,数据结果默认以 key 排序;
  3. 在数据写入磁盘的同时,当完成在缓存中写入数据时,这个 map 任务被阻塞,直到缓存中的内容全部被清空;
  4. 一旦 mapper 完成输出,reducer 或 reduce task(负责将相同 key 的中间结果收缩到一个更小的结果集)开始从 mapper 中抓取一个特定分区数据,这种将 mapper 的输出结果转换为 reducer 的输入称之为数据洗牌(data shuffling),即 all-map-to-all-reduce personalized communication, Hadoop 使用自己的算法实现了这种数据洗牌;
  5. 洗牌一旦完成,reducer 开始合并(merge)这些分区,然后 reduce 函数被调用处理这些合并的数据;
  6. 最后,reduce 函数将结果输出到HDFS上。

YARN 在 Hadoop 里是一个集群资源管理框架,它包括两个主要的守护线程:一个线程是计划 job 和 task 管理器(即在集群之间分配资源),另一个线程是启动和监视容器的节点管理器;一个容器对应一个 JVM 实例,每个 JVM 实例即为一个应用或 MapReduce 任务,并分配一定 CPU、内存和其它资源。

HDFS 是一个存储大数据的分布式文件系统,在分布式的数据块之间建立逻辑关系;它从应用数据中分离出文件系统元数据,将元数据存储在主节点(Name Node),应用数据存储在数据节点上(Data Node),并且 HDFS 在集群的节点上相互复制一定重复数量的数据块以提高系统的可靠性(以防止节点失败而导致应用不可用)。

Hadoop 被认为是可靠的、可扩展的、可容错的,MapReduce 虽然适合于处理大数据的应用,但不适合迭代算法和低延迟的应用,因为 MapReduce 为了提供容错而依赖于持久化的数据,在运行分析查询之前,需将整个数据集加载到系统,这就是为什么 Spark 诞生的原因。

Spark 也是一种处理大数据应用的集群计算框架和引擎,它在内存里构建了一个分布式的对象集合,即 Resilent Distrubted Dataset(RDD),然后对这些数据集执行各类平行计算。 Spark 在迭代机器学习任务中的性能是 MapReduce 的10倍以上,甚至在某些迭代应用超过20倍。

Spark 主要适用于实时数据流处理和迭代算法应用,RDDs 是一种分布式内存抽象;每一个RDD 是跨集群并可进行平行计算的、只读的、被分区的元素集合, 这种 RDD 的不可变性意味着修改任何一个 RDD 将创建一个新的 RDD,且便于缓存和共享。当对 RDD 进行操作时,分区的数量决定了平行计算的层级;

RDDs 可通过两种方式创建:从外部资源加载数据集,如 HDFS,或在一个驱动程序(drive program)里对数据集进行并行分割(parallizing)。

RDDs 的操作有两种类型:转换(transformations)和动作(actions),转换即将一个 RDD 转化为另个一个 RDD ,但动作是基于 RDD 计算出结果并将其返回到驱动程序,最后写入外部的存储资源上。转换 RDDs 会被惰性评估(lazily evaluated),即 Spark 不会马上执行实际操作,而只是记录怎样处理或计算这些数据的元数据,一旦动作被请求,Spark 才开始执行所有的实际操作(如果再次有新的动作请求,Spark 会从头开始计算 RDD,所以前一次动作生成中间结果数据可进行缓存或持久)。通过这种方式,Spark 减少了在各个节点之间转换原始数据的次数,整个逻辑流程如下:

Spark 可根据特定的环境为资源管理框架和文件系统提供多种可选的运行模式,比如当前有一个干净的集群服务器,可直接使用 Standalone Cluster Manager 来安装 Spark 集群;但如果已经有一个 Hadoop 的集群系统存在,Spark 被要求访问 HDFS 上的数据,那最好让 Spark 运行在 YARN 上,而且 YARN 也提供一些安全策略和集成资源管理策略。

运行架构。。。

该论文更多内容请查看(包括英文原版,中文翻译)

https://gitbook.cn/gitchat/activity/5d48f8d60b3c014c980e80b8

spark_hadoop_common有这个名字的依赖吗_HDFS