关于大数据:Spark-架构设计与原理思想

25次阅读

共计 5700 个字符,预计需要花费 15 分钟才能阅读完成。

Spark 在 MapReduce 的根底上进行了改良,它次要应用内存进行两头计算数据存储,放慢了计算执行工夫,在某些状况下性能能够晋升百倍。

       除了速度更快,Spark 和 MapReduce 相比,还有更简略易用的编程模型。

       Spark 的次要编程模型是 RDD,即弹性数据集。在 RDD 上定义了许多常见的大数据计算函数,利用这些函数能够用极少的代码实现较为简单的大数据计算。

       例如咱们在介绍 Hive 架构设计时谈到的 WordCount 示例。应用 Scala 语言在 Spark 上编写,代码只需三行。

val textFile = sc.textFile(“hdfs://…”)

val counts = textFile.flatMap(line => line.split(” “))

                .map(word => (word, 1))

                .reduceByKey(_ + _)

counts.saveAsTextFile(“hdfs://…”)

       这个 demo 的代码含意就不开展具体介绍。首选,从 HDFS 读取数据,构建一个 RDD textFile,而后在这个 RDD 上执行三个操作:一是将输出数据的每一行文本用空格拆分单词;二是将单词进行转换,比方:word ——> (word,1),生成 < Key , Value > 的构造;三是针对雷同的 Key 进行统计,统计形式是对 Value 求和。最初,将 RDD counts 写入 HDFS,实现后果输入。

Spark 编程模型

       RDD 是 Spark 的外围概念,是弹性数据集(Resilient Distributed Datasets)的缩写。RDD 既是 Spark 面向开发者的编程模型,又是 Spark 本身架构的外围元素。

       咱们先来认识一下作为 Spark 编程模型的 RDD。咱们晓得,大数据计算就是在大规模的数据集上进行一系列的数据计算解决。MapReduce 针对输出数据,将计算过程分为两个阶段,一个 Map 阶段,一个 Reduce 阶段,能够了解成是面向过程的大数据计算。咱们在用 MapReduce 编程的时候,思考的是,如何将计算逻辑用 Map 和 Reduce 两个阶段实现,map 和 reduce 函数的输出和输入是什么,这也是咱们在学习 MapReduce 编程的时候一再强调的。大数据培训

       而 Spark 则间接针对数据进行编程,将大规模数据汇合形象成一个 RDD 对象,而后在这个 RDD 上进行各种计算解决,失去一个新的 RDD,持续计算解决,直到失去最初的后果数据。所以 Spark 能够了解成是面向对象的大数据计算。咱们在进行 Spark 编程的时候,思考的是一个 RDD 对象须要通过什么样的操作,转换成另一个 RDD 对象,思考的重心和落脚点都在 RDD 上。

       所以在下面 WordCount 的代码示例里,第 2 行代码实际上进行了 3 次 RDD 转换,每次转换都失去一个新的 RDD,因为新的 RDD 能够持续调用 RDD 的转换函数,所以间断写成一行代码。事实上,能够分成 3 行

val rdd1 = textFile.flatMap(line => line.split(” “))

val rdd2 = rdd1.map(word => (word, 1))

val rdd3 = rdd2.reduceByKey(_ + _)

Spark 架构外围

       RDD 上定义的函数分两种,一种是转换(transformation)函数,这种函数的返回值还是 RDD;另一种是 执行(action)函数,这种函数不再返回 RDD。

       RDD 定义了很多转换操作函数,比方有计算 map(func)、过滤 filter(func)、合并数据集 union(otherDataset)、依据 Key 聚合 reduceByKey(func, [numPartitions])、连贯数据集 join(otherDataset, [numPartitions])、分组 groupByKey([numPartitions]) 等十几个函数。

       作为 Spark 架构外围元素的 RDD。跟 MapReduce 一样,Spark 也是对大数据进行分片计算,Spark 分布式计算的数据分片、任务调度都是以 RDD 为单位开展的,每个 RDD 分片都会调配到一个执行过程去解决。

       RDD 上的转换操作又分成两种,一种转换操作产生的 RDD 不会呈现新的分片,比方 map、filter 等,也就是说一个 RDD 数据分片,通过 map 或者 filter 转换操作后,后果还在以后分片。就像你用 map 函数对每个数据加 1,失去的还是这样一组数据,只是值不同。实际上,Spark 并不是依照代码写的操作程序去生成 RDD,比方 rdd2 = rdd1.map(func) 这样的代码并不会在物理上生成一个新的 RDD。物理上,Spark 只有在产生新的 RDD 分片时候,才会真的生成一个 RDD,Spark 的这种个性也被称作 惰性计算。

       另一种转换操作产生的 RDD 则会产生新的分片,比方 reduceByKey,来自不同分片的雷同 Key 必须聚合在一起进行操作,这样就会产生新的 RDD 分片。

       所以,大家只须要记住,Spark 利用程序代码中的 RDD 和 Spark 执行过程中生成的物理 RDD 不是一一对应的,RDD 在 Spark 外面是一个非常灵活的概念,同时又十分重要,须要认真了解。

Spark 的计算阶段

       和 MapReduce 一样,Spark 也遵循挪动计算比挪动数据更划算 这一大数据计算根本准则。然而和 MapReduce 僵化的 Map 与 Reduce 分阶段计算相比,Spark 的计算框架更加富裕弹性和灵活性,进而有更好的运行性能。

       Spark 会依据程序中的转换函数生成计算工作执行打算,这个执行打算就是一个 DAG。Spark 能够在一个作业中实现非常复杂的大数据计算。

       所谓 DAG 也就是 有向无环图,就是说不同阶段的依赖关系是有向的,计算过程只能沿着依赖关系方向执行,被依赖的阶段执行实现之前,依赖的阶段不能开始执行,同时,这个依赖关系不能有环形依赖,否则就成为死循环了。上面这张图形容了一个典型的 Spark 运行 DAG 的不同阶段。

       在下面的图中,A、C、E 是从 HDFS 上加载的 RDD,A 通过 groupBy 分组统计转换函数计算后失去的 RDD B,C 通过 map 转换函数计算后失去 RDD D,D 和 E 通过 union 合并转换函数计算后失去 RDD F,B 和 F 通过 join 连贯函数计算后失去最终的合并后果 RDD G。

       所以能够看到 Spark 作业调度执行的外围是 DAG,有了 DAG,整个利用就被切分成哪些阶段,每个阶段的依赖关系也就分明了。之后再依据每个阶段要解决的数据量生成相应的工作汇合(TaskSet),每个工作都调配一个工作过程去解决,Spark 就实现了大数据的分布式计算。

       具体来看的话,负责 Spark 利用 DAG 生成和治理的组件是 DAGScheduler,DAGScheduler 依据程序代码生成 DAG,而后将程序散发到分布式计算集群,按计算阶段的先后关系调度执行。

       大家留神到了么,下面的例子有 4 个转换函数,然而只有 3 个阶段。那么 Spark 划分计算阶段的根据具体是什么呢?显然并不是 RDD 上的每个转换函数都会生成一个计算阶段。

       通过观察一下下面的 DAG 图,对于计算阶段的划分从图上就能看出法则,当 RDD 之间的转换连接线出现多对多穿插连贯的时候,就会产生新的阶段。一个 RDD 代表一个数据集,图中每个 RDD 外面都蕴含多个小块,每个小块代表 RDD 的一个分片。

       一个数据集中的多个数据分片须要进行分区传输,写入到另一个数据集的不同分片中,这种数据分区穿插传输的操作,咱们在 MapReduce 的运行过程中也看到过。

       这就是 shuffle 过程,Spark 也须要通过 shuffle 将数据进行重新组合,雷同 Key 的数据放在一起,进行聚合、关联等操作,因此每次 shuffle 都产生新的计算阶段。这也是为什么计算阶段会有依赖关系,它须要的数据来源于后面一个或多个计算阶段产生的数据,必须期待后面的阶段执行结束能力进行 shuffle,并失去数据。

       所以大家须要记住,计算阶段划分的根据是 shuffle,不是转换函数的类型。

思考

       大家可能会想,为什么同样通过 shuffle,Spark 能够更高效 ?

       从实质上看,Spark 能够算作是一种 MapReduce 计算模型的不同实现。Hadoop MapReduce 简略粗犷地依据 shuffle 将大数据计算分成 Map 和 Reduce 两个阶段,而后就算完事了。而 Spark 更细腻一点,将前一个的 Reduce 和后一个的 Map 连接起来,当作一个阶段继续计算,造成一个更加优雅、高效的计算模型,尽管其本质仍然是 Map 和 Reduce。然而这种多个计算阶段依赖执行的计划能够无效缩小对 HDFS 的拜访,缩小作业的调度执行次数,因而执行速度也更快。

       并且和 Hadoop MapReduce 次要应用磁盘存储 shuffle 过程中的数据不同,Spark 优先应用内存进行数据存储,包含 RDD 数据。除非是内存不够用了,否则是尽可能应用内存,这也是 Spark 性能比 Hadoop 高的另一个起因。

       Spark 反对 Standalone、Yarn、Mesos、Kubernetes 等多种部署计划,几种部署计划原理也都一样,只是不同组件角色命名不同,然而外围性能和运行流程都差不多。

       首先,Spark 应用程序启动在本人的 JVM 过程里,即 Driver 过程,启动后调用 SparkContext 初始化执行配置和输出数据。SparkContext 启动 DAGScheduler 结构执行的 DAG 图,切分成最小的执行单位也就是计算工作。

       而后 Driver 向 Cluster Manager 申请计算资源,用于 DAG 的分布式计算。Cluster Manager 收到申请当前,将 Driver 的主机地址等信息告诉给集群的所有计算节点 Worker。

       Worker 收到信息当前,依据 Driver 的主机地址,跟 Driver 通信并注册,而后依据本人的闲暇资源向 Driver 通报本人能够领用的工作数。Driver 依据 DAG 图开始向注册的 Worker 分配任务。

       Worker 收到工作后,启动 Executor 过程开始执行工作。Executor 先查看本人是否有 Driver 的执行代码,如果没有,从 Driver 下载执行代码,通过 Java 反射加载后开始执行。

       

Spark 性能调优与故障解决

       对于 Spark 的性能调优,就有很多能够值得探讨的中央。咱们个别能疾速想到的是惯例的性能调优,包含最优的资源配置,RDD 优化,并行度调节等等,除此之外,还有算子调优,Shuffle 调优,JVM 调优。而对于故障解决,咱们个别探讨的是解决 Spark 数据歪斜 的问题,咱们个别会通过聚合原数据,过滤导致歪斜的 key,晋升 shuffle 操作过程中的 reduce 并行度等形式。因为本篇文章次要介绍架构设计和原理思维,基于篇幅限度,具体步骤就不展现详细描述。正好最近收集了一本 Spark 性能调优与故障解决 的 pdf,外面对于详解的步骤均做了具体的阐明。

Spark 生态

       最初,咱们来看看 Spark 的生态!

       跟咱们之前介绍的 Hadoop 一样,Spark 也有他本人的生态体系。以 Spark 为根底,有反对 SQL 语句的 Spark SQL,有反对流计算的 Spark Streaming,有反对机器学习的 MLlib,还有反对图计算的 GraphX。利用这些产品,Spark 技术栈撑持起大数据分析、大数据机器学习等各种大数据利用场景。

       为了不便大家理解,上面对这些组件进行一一介绍:

       Spark SQL:用来操作结构化数据的外围组件,通过 Spark SQL 能够间接查问 Hive、HBase 等多种内部数据源中的数据。Spark SQL 的重要特点是可能对立解决关系表和 RDD 在解决结构化数据时,开发人员毋庸编写 MapReduce 程序,间接应用 SQL 命令就能实现更加简单的数据查问操作。

       Spark Streaming:Spark 提供的流式计算框架,反对高吞吐量、可容错解决的实时流式数据处理,其外围原理是将流数据分解成一系列短小的批处理作业,每个短小的批处理作业都能够应用 Spark Core 进行疾速解决。Spark Streaming 反对多种数据源,如 Kafka 以及 TCP 套接字等。

       MLlib:Spark 提供的对于机器学习性能的算法程序库,包含分类、回归、聚类、协同过滤算法等,还提供了模型评估、数据导入等额定的性能,开发人员只需理解肯定的机器学习算法常识就能进行机器学习方面的开发,升高了学习老本。

       GraphX: Spark 提供的分布式图解决框架,领有图计算和图开掘算法的 API 接口以及丰盛的性能和运算符,极大中央便了对分布式图的解决需要,能在海量数据上运行简单的图算法。

       Spark 生态系统各个组件关系密切,并且能够互相调用,这样设计具备以下显著劣势。

(1)Spark 生态系统蕴含的所有程序库和高级组件都能够从 Spark 外围引擎的改良中获益。

(2)不须要运行多套独立的软件系统,可能大大减少运行整个零碎的资源代价。

(3)可能无缝整合各个系统,构建不同解决模型的利用。

总结

       Spark 有三个次要个性:RDD 的编程模型更简略,DAG 切分的多阶段计算过程更疾速,应用内存存储两头计算结果更高效。这三个个性使得 Spark 绝对 Hadoop MapReduce 能够有更快的执行速度,以及更简略的编程实现。

       另外,从 Spark 的生态咱们能够看出,Spark 框架对大数据的反对从内存计算、实时处理到交互式查问,进而倒退到图计算和机器学习模块。Spark 生态系统宽泛的技术面,一方面挑战占据大数据市场份额最大的 Hadoop,另一方面又随时筹备迎接后起之秀 Flink、Kafka 等计算框架的挑战,从而使 Spark 在大数据畛域更好地倒退!

正文完
 0