- Hadoop是什么?
- 基本概念
- Hadoop的构建模块
- HDFS - 分布式文件系统
- YARN
- MapReduce
- Hive
- Hadoop和Spark 的区别
- Spark是什么?
- 基本概览
- Spark 生态系统包含五个关键组件
- KEY TERMS
- RDD
- DataFrame
Hadoop是什么?
基本概念
- Apache Hadoop 是一种开源框架,用于高效存储和处理从 GB 级到 PB 级的大型数据集。利用 Hadoop,可以将多台计算机组成集群以便更快地并行分析海量数据集。
- 狭义上的Hadoop框架可可以概括为:Hadoop = HDFS(分布式文件系统,用于解决大数据存储) + MapReduce(分布式运算框架) + YARN(管理与监控集群节点和资源使用情况,对作业和任务进行安排)
- 广义上可指代Hadoop生态圈,除了 HDFS、YARN 和 MapReduce 以外,整个 Hadoop 开源生态系统仍在不断发展,其中包括许多可帮助收集、存储、处理、分析和管理大数据的工具和应用。例如 Apache Pig、Apache Hive、Apache HBase、Apache Spark、Presto 和 Apache Zeppelin。
Hadoop的构建模块
HDFS - 分布式文件系统
- 理解HDFS
多台计算机联网协同工作(有时也称为一个集群)就像单台系统一样解决某种问题,这样的系统我们称之为分布式系统。 分布式文件系统是分布式系统的一个子集,它们解决的问题就是数据存储。换句话说,它们是横跨在多台计算机上的存储系统。存储在分布式文件系统上的数据自动分布在不同的节点上。Hadoop在分布式计算与分布式存付中都采用了主/从(Master/slave)结构.
- 分离元数据和数据: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.
- NameNode:集群中的主要节点,主要用于管理及群众的各种数据。运行NameNode消耗大量的内存与IO资源。因此,为了减轻机器的负载,驻留NameNode的服务器通常不会存储用户数据或者执行MapReduce程序的计算任务。这意味着NameNode服务器不会同时是DataNode或者TaskTracker.
- HDFS的副本机制
- HDFS将每个文件存储成一系列的数据块,这个数据块称为block。为了容错,每个block都会有副本,以供block丢失或宕机时可以自动恢复。默认情况下每个block都有三个副本。
- 当一切运行正常时,DataNode会周期性发送心跳信息给NameNode(默认是每3秒钟一次)。如果NameNode在预定的时间内没有收到心跳信息(默认是10分钟),它会认为DataNode出问题了,把它从集群中移除,并且启动一个进程去恢复数据。DataNode可能因为多种原因脱离集群,如硬件故障、主板故障、电源老化和网络故障等。
- 对于HDFS来说,丢失一个DataNode意味着丢失了存储在它的硬盘上的数据块的副本。假如在任意时间总有超过一个副本存在(默认3个),故障将不会导致数据丢失。当一个硬盘故障时,HDFS会检测到存储在该硬盘的数据块的副本数量低于要求,然后主动创建需要的副本,以达到满副本数状态。
- JobTracker
- JobTracker守护进程是应用程序和Hadoop之间的纽带。
一旦提交代码到集群上,JobTracker就会确定执行计划,包括决定处理哪些文件,为不同的任务分配节点以及监控所有任务的运行。如果任务失败,JobTracker将自动重启任务,但所分配的节点可能会不同,同时受到预定义的重试次数限制。
- 每一个Hadoop集群只有一个JobTracker守护进程,它通常运行在服务器集群的主节点上。
- JobTracker守护进程是应用程序和Hadoop之间的纽带。
- TaskTracker
- 与存储的守护进程一样,计算的守护进程也遵循主从架构:JobTracker作为主节点,监测MapReduce作业的整个执行过程。同时,TaskTracker管理各个任务在每个从节点上的执行情况。
- TaskTracker的一个职责就是负责持续不断地与JobTracker通讯。如果JobTracker在指定的时间内没有收到来自TaskTracker的心跳,它会假定TaskTracker已经崩溃,进而重新提交相应的任务到集群的其他节点中。
- HDFS写过程
- NameNode负责管理存储在HDFS上所有文件的元数据,它会确认客户端的请求,并记录下文件的名字和存储这个文件的DataNode集合。它把该信息存储在内存中的文件分配表里。
- EXAMPLE:客户端发送一个请求给NameNode,说它要将“zhou.log”文件写入到HDFS。那么,其执行流程可如下描述。
- HDFS读过程
- 为了理解读的过程,可以认为一个文件是由存储在DataNode上的数据块组成的。
- EXAMPLE:客户端查看之前写入的内容的过程可如下描述。
- 跨多个DataNode切分文件
- 在HDFS里,文件被切分成数据块,通常每个数据块64MB~128MB,然后每个数据块被写入文件系统。同一个文件的不同数据块不一定保存在相同的DataNode上。这样做的好处是,当对这些文件执行运算时,能够通过并行方式读取和处理文件的不同部分。
- 当客户端准备写文件到HDFS并询问NameNode应该把文件写到哪里时,NameNode会告诉客户端,那些可以写入数据块的DataNode。写完一批数据块后,客户端会回到NameNode获取新的DataNode列表,把下一批数据块写到新列表中的DataNode上。
YARN
- 任务调度和集群资源管理。
MapReduce
- 基于YARN的大型数据集并行处理系统。是一种计算模型,用以进行大数据量的计算。Hadoop的MapReduce实现,和Common、HDFS一起,构成了Hadoop发展初期的三个组件。
MapReduce将应用划分为Map和Reduce两个步骤,其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果;Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。
Hive
- 是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
- 优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hadoop和Spark 的区别
- 目的
- Hadoop和Spark二者都是大数据框架。Hadoop是一个分布式的数据基础设施,它是将庞大的数据集分派到由若干台计算机组成的集群中的多个节点进行存储。
- Spark是一个专门用来对那些分布式存储的大数据进行处理的工具,spark本身并不会进行分布式数据的存储。
- 部署
- Hadoop的框架最核心的设计是:HDFS和MapReduce。HDFS为海量的数据提供了存储,则MapReduce为海量的数据提供了计算。所以使用Hadoop则可以抛开spark,而直接使用Hadoop自身的mapreduce完成数据的处理。
- Spark不提供文件管理系统,但也不是只能依附在Hadoop上,它同样可以选择其他的基于云的数据系统平台,但spark默认的一般选择的还是hadoop。
- 数据处理速度
- Spark拥有Hadoop、 MapReduce所具有能更好地适用于数据挖掘与机器学习等需要迭代的的优点。但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS。
- Spark和Hadoop的不同之处使Spark在某些工作负载方面表现得更加优越。换言之,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
- 数据安全恢复
- Hadoop每次处理的后的数据是写入到磁盘上,所以其天生就能很有弹性的从而对系统的错误进行处理。
- Spark的数据对象存储在分布于数据集群中的叫做弹性分布式数据集(Spark RDD)中,这些数据对象既可以放在内存,也可以放在磁盘,所以spark同样可以完成数据的安全恢复。
Spark是什么?
基本概览
- Apache Spark 是一种用于大数据工作负载的分布式开源处理系统。它使用内存中缓存和优化的查询执行方式,可针对任何规模的数据进行快速分析查询。
- 内置了 SQL、流式传输、机器学习和图处理模块。Spark 可以在云中针对不同的数据源在 Apache Hadoop、Apache Mesos、Kubernetes 上运行,也可以独立运行。
- Spark也提供使用 Java、Scala、Python 和 R 语言的开发 API,支持跨多个工作负载重用代码—批处理、交互式查询、实时分析、机器学习和图形处理等。
- Motivation
Hadoop MapReduce 是一种用于处理大数据集的编程模型,它采用并行的分布式算法。开发人员可以编写高度并行化的运算符,而不用担心工作分配和容错能力。不过,MapReduce 所面对的一项挑战是它要通过连续多步骤流程来运行某项作业。在每个步骤中,MapReduce 要读取来自集群的数据,执行操作,并将结果写到 HDFS。因为每个步骤都需要磁盘读取和写入,磁盘 I/O 的延迟会导致 MapReduce 作业变慢。
开发 Spark 的初衷就是为了突破 MapReduce 的这些限制,它可以执行内存中处理,减少作业中的步骤数量,并且跨多项并行操作对数据进行重用。借助于 Spark,将数据读取到内存、执行操作和写回结果仅需要一个步骤,大大地加快了执行的速度。Spark 还能使用内存中缓存显著加快在相同数据集上重复调用某函数的机器学习算法的速度,进而重新使用数据。数据重用通过在弹性分布式数据集 (RDD) 上创建数据抽象—DataFrames 得以实现,而弹性分布式数据集是一个缓存在内存中并在多项 Spark 操作中重新使用的对象集合。它大幅缩短了延迟,使 Spark 比 MapReduce 快数倍,在进行机器学习和交互式分析时尤其明显。
Spark 生态系统包含五个关键组件
- Spark Core:通用的分布式数据处理引擎。在其上有 SQL、流式处理、机器学习和图计算的库,所有这些库都可以在应用中一起使用。Spark Core 是整个项目的基础,提供分布式任务调度、安排和基本的 I/O 功能。
- Spark SQL:处理结构化数据的 Spark 模块,支持访问各种数据源的通用方法。用户使用 SQL 或 DataFrame API 在 Spark 程序中查询结构化数据。Spark SQL 支持 HiveQL 语法,并允许访问现有的 Apache Hive 仓库。服务器模式通过 Java 数据库连接或开放数据库连接提供标准连接。
- Spark Streaming:支持轻松构建可扩缩、具有容错性的流式解决方案。它将集成了 Spark 语言的 API 引入流处理中,可以像编写批量作业一样编写流式作业。Spark Streaming 支持 Java、Scala 和 Python等语言。流处理是指数据以某些外部系统或多个外部系统产生的事件的连续“流”形式进入处理引擎,并且处理引擎的运行速度非常快,以至于所有决策都无需停止数据流和首先存储信息。
- MLlib:Spark 可扩容的机器学习库,它所提供的工具可以简化实际的机器学习并为其扩容。
- GraphX:用于图和图并行计算的 Spark API。具有高灵活性,可以无缝处理图和集合 - 统一提取、转换、加载;进行探索性分析;在一个系统中迭代图计算。除了灵活性较高的 API 外,GraphX 还提供了多种图算法。同时具备 Spark 的灵活性、容错性和易用性。
KEY TERMS
RDD
- 定义
- RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
- Dataset:一个数据集合,用于存放数据的(本地集合:都在一个进程中)。
- Distributed:RDD中的数据是分布式存储的,可用于分布式计算(跨机器跨进程)
- Resilient:RDD中的数据可以存储在内存中或者磁盘中。
- 在分布式计算中,需要分区控制,Shuffle控制,数据存储\序列化\发送,数据计算API ,等一系列功能。这些功能,不能简单的通过Python内置的本地集合对象(如 List,字典等)去完成。我们在分布式框架中,需要有一个统一的数据抽象对象,来实现上述分布式计算所需功能,这个抽象对象就是RDD。
- 所有的运算以及操作都建立在 RDD 数据结构的基础之上。
- 可以认为RDD是分布式的List或Array,抽象的数据结构,RDD是一个抽象类Abstract Class和泛型Generic Type。
- RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象。代码中是一个抽象类,它代表一个不可变、可分区、里面的元素可并行计算的集合。
- 特性
- 分区列表(a list of partitions)
- Spark RDD逻辑上是被分区的,每个分区的数据是抽象存在。
- 每一个分区都会被一个计算任务(Task)处理,分区数决定并行计算数量,RDD的并行度默认从父RDD传给子RDD。可以在创建RDD时指定RDD分片个数,如果不指定分区数量,当RDD从程序内存中已有的集合对象创建时,则默认分区数量就是程序所分配到的CPU核数(每个Core可以承载2~4个Partition),如果是从HDFS文件创建,默认分区数为HDFS文件的Block数。
- 每一个分区都有一个计算函数(a function for computing each split)
- 每个分区都会有计算函数,Spark的RDD的计算函数是以分片为基本单位的,每个RDD都会实现compute计算函数,对具体的分片进行计算;RDD中的分片是并行的,所以是分布式并行计算。
- 计算的时候会通过一个compute函数得到每个分区的数据。如果RDD是通过已有的文件系统构建,则compute函数是读取指定文件系统中的数据,如果RDD是通过其他RDD转换而来,则compute函数是执行转换逻辑将其他RDD的数据进行转换。
- 依赖于其他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程序。
- 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分区等。
- 每个分区都有一个优先位置列表(Optionally, a list of preferred locations to compute each split on)
它会存储每个Partition的优先位置,对于一个HDFS文件来说,就是每个Partition块的位置。在具体分片前,它已经清楚地知道任务发生在什么节点上,也就是说,任务本身是计算层面的、代码层面的,代码发生运算之前已经知道它要运算的数据在什么地方,有具体节点的信息。
数据不动代码动的特点:数据不动代码动的最理想情况就是数据就在当前节点的内存中。Spark本身在进行任务调度时候,会尽可能将task任务分配到处理数据的数据块所在的具体位置。
- 分区列表(a list of partitions)
DataFrame
- DataFrame的前身是SchemaRDD,从Spark 1.3.0开始SchemaRDD更名为DataFrame。
- 与SchemaRDD的主要区别是:DataFrame不再直接继承自RDD,而是自己实现了RDD的绝大多数功能。你仍旧可以在DataFrame上调用rdd方法将其转换为一个RDD。
- 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库的二维表格,DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化。DataFrame可以从很多数据源构建,比如:已经存在的RDD、结构化文件、外部数据库、Hive表。
DataFrame是一个二维表结构,那么表格结构为: • 行 • 列 •
表结构描述 DataFrame的组成如下:
- StructType对象描述整个DataFrame的表结构
- StructField对象描述一个列在数据层面的信息
- Row对象记录一行数据
- Column对象记录一列数据并包含列的信息
RDD可看作是分布式的对象的集合,Spark并不知道对象的详细模式信息,DataFrame可看作是分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。
EXAMPLE