问题导读
1.为什么会出现Spark?
1.1 什么是hadoop?
1.2 什么是MapReduce计算模型?
1.3 Spark比Mapreduce强在哪里?
2.Spark概述?
2.1 Spark是什么?
2.2 一个大一统的技术栈
2.3 重中之重RDD
2.4 RDD的两种操作
3.大数据实时计算架构?
3.1 大数据实时计算原理
3.2 spark streaming
3.3 对比当下比较流行的两种实时计算框架Spark Streaming和Storm
1.为什么会出现Spark?
(1)什么是hadoop? 当前存在的问题: 身处大数据时代,数据量越来越大,数据结构也越来复杂,每天需要处理的数据量已经超过单台PC可以存储和处理的量。 面对的挑战: 大数据带来了两个挑战:如何存储大数据和处理大数据 这个时候,hadoop横空出世来解决这些问题。 解决策略: Hadoop对海量数据提供了有效的存储和计算的能力,填补了处理大数据市场的空白。主要靠三大组件: hdfs:用来解决如何将大量的文件存储在一个集群里。(很多PC组合成一个集群) mapreduce:用来解决如何计算这些数据。 yarn:用来解决集群中资源调度的问题。 其中和spark相关的组件是Mapreduce
(2)什么是MapReduce计算模型? 主要思想: "三个臭皮匠能顶一个诸葛亮" 举例说明: 现在我们要把一副牌的四种花色区分开。 常规情况下:一个人来清点可能需要4分钟。 大数据中Mapreduce的做法是:我们把牌分成四份,分别给四个人,每个人清点自己的那一份,然后四个人都清点完成之后 把各自的相同花色放在一起进行汇总,这样的结果可能总共只会消耗1分钟。 结合到Mapreduce计算模型里面,主要包含两个过程map和reduce。四个人每个人清点自己的牌相当于是map过程; 而reduce过程就是将四个人清点完的牌放到一起。 对应到实际应用: 现在我们有一个数据量特别大、计算逻辑特别复杂的任务需要执行,可能需要一台超级计算机(诸葛亮)来搞定。 现在的问题是我们没有诸葛亮,或者这个诸葛亮很贵,怎么办?(可能把诸葛亮请来了都不一定能搞定) 用Mapreduce的思想,
我们多找几个普通的PC(臭皮匠),构建一个集群,用集群的能力来搞定这个任务,而且更牛逼的是,我们还能线性的往里面添加臭皮匠,
来增加集群的能力从而适应数据量更大、计算逻辑更复杂的任务。
(3)Spark比Mapreduce强在哪里? 速度上: MR分布式计算框架比较会偷懒,干一会活,就休息一会。因为MR的中间结果是放在hdfs中,数据流是hdfs->本地磁盘->hdfs, 涉及到很多的IO操作,这也是为啥慢的原因;而Spark则不偷懒,不停的工作,随叫随到,从不犹豫,因为spark的中间结果一般 是存放在内存中进行计算,所以快. 效率上: MR接收到任务以后,不管3721,会把每个job转化成map和reduce进行计算,map任务完了之后才能进行reduce。 Spark干活很讲究方法,喜欢动脑子。它底层会根据DAG把一个job划分成多个stage,每个stage又包含多个task,并行去执行,所以既快又有效率。 易用性上:
MR的抽象层次低,需要使用手工代码来完成程序编写,使用上难以上手;而Spark采用RDD计算模型,简单容易上手。
举个例子:我们要计算单词计数,使用MR可能需要写很多代码实现,而spark使用RDD计算模型,
[mw_shl_code=java,true] JavaRDD<String> input=sc.textFile(“word.txt”);
input.flatmap((word)->word.split(" "))
.mapToPair(splitword->(splitword,1))
.reduceByKey((v1,v2)->v1+v2) [/mw_shl_code] 就这短短几行代码,实现了单词计数,如果写MR程序的话可能要写一大段一大段吧。 应用场景: MR的时延很高,更多的适合离线批处理,对于交互式处理和实时处理支持不够;而Spark技术栈中我们可以用spark core做离线批处理, 用spark streaming做实时计算,spark sql可以直接操作hive里面的数据,可以实现交互式查询。 综上所述,Spark是来弥补Hadoop中的MR计算模型存在的缺陷。目前比较主流的大数据架构是将hadoop和spark结合起来使用。 使用spark的基于内存的计算模型,使用hadoop的hdfs分布式文件系统和yarn资源调度管理,实现双赢。
2.Spark概述 (1)Spark是什么? Spark是一个用来实现快速而通用的集群计算的平台 Spark是专为大规模数据处理而设计的快速通用的计算引擎 Spark是分布式计算框架 牛就牛在内存这块
(2)一个大一统的技术栈 Spark项目包含多个紧密集成的组件。因为Spark的核心引擎有着速度快和通用的特点,所以支持各种应用不同应用场景。 针对离线批处理场景,我们可以使用Spark core来实现; 针对交互式查询,我们可以使用Spark sql来实现; 针对流式计算,我们可以使用Spark streaming来实现; 针对机器学习应用,我们可以使用Spark mllib来实现; 针对类似社交网络的朋友关系图这样的图式应用,我们可以使用Spark graphX来实现。 总的来说,Spark就是一个大一统的技术栈,来解决各种场景下的大数据应用。
(3)重中之重RDD RDD是Spark提供的核心抽象,全名叫做弹性分布式数据集(Resillient Distributed DataSet)。 很抽象,很难懂,但是是核心。
根据RDD这个名字,可以分解为三点:
数据集:RDD在抽象上说就是一种元素集合,单从逻辑上的表现来说,它就是一个数据集合,
咱们就把它简单的理解成为java里面的list或者数据库里面的一张表。一个RDD就是一个hdfs文件。
分布式:因为RDD是分区的,每个分区分布在集群中不同的节点上,从而让RDD中的数据可以并行的操作。
弹性:RDD默认情况下是存放在内存中,但是在内存中资源不足时,spark会自动将RDD数据写入磁盘进行保存。对于用户来说,
我不用去管RDD的数据存储在哪里,内存还是磁盘,这是spark底层去做的。我们只需要针对RDD来进行计算和处理就行了。
RDD自动进行内存和磁盘之间权衡和切换的机制,是RDD的弹性的特点所在。
RDD还有一个特性就是提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition因为节点故障,
导致数据丢失了,不用担心,RDD会自动通过自己的数据来源重新计算该分区。当然,这是Spark底层自己做的,对用户透明
(4)RDD的两种操作
RDD支持两种操作:转化操作(transformation)和行动操作(action) 转化操作是针对已有的RDD创建一个新的RDD的操作。例如,map就是一种transformation操作,
它用于将已有RDD的每个元素传入一个自定义的函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。
常用transformation介绍
行动操作是对RDD进行最后的操作,比如遍历、保存到文件、数据库等,向驱动器程序返回结果或把结果写入外部系统,会触发实际的计算
常用action介绍
3.大数据实时计算架构
(1)大数据实时计算原理
主要包含三大块:实时数据的生产源头->消息中间件->实时计算程序APP
针对公司里面的数据源头,主要包括各类日志(平台日志、终端日志和微信日志等)还有实时采集的GPS点;
消息中间件:一般实时产生的数据都会发送到消息中间件里面去,比较常用的就是kafka,公司里面用的也是这个。
其核心就是作为实时大数据的一种缓冲,否则大数据系统直接处理实时数据,恐怕撑不住,会挂。
实时处理程序:我们编写的大数据实时处理程序,通常会去kafka拉取数据。实时的拉取到了数据之后,我们编写的分布式程序就会实时的处理数据。
每个结点处理一部分数据,这样多个节点并行的处理数据,就可以增强我们大数据实时计算的能力。
在整个过程中, 其实咱们要做的就是开发大数据实时处理应用程序。 通常情况下,我们不会去自己手动去开发基础的分布式实时计算平台,而是使用现成的、优秀的、开源的框架,比如:Spark Streaming或者Storm。 它们底层就是分布式实时计算平台,其进程可以部署在多个节点,从而进行大数据的分布式实时处理。而我们自己编写的大数据实时计算程序,就是运行在这些平台之上。
(2)Spark streaming [1]Spark Streaming是啥? Spark Streaming是Spark的一种高级组件,主要应用于实时处理数据。 Spark Streaming使用“微批次”的架构,把流式计算当做一系列连续的小规模批处理来对待。 [2]Spark Streaming基本的工作原理 Spark Streaming内部实时接收输入数据流,然后将数据根据时间间隔拆分成多个batch,这里的时间间隔根据不用的应用场景设置。 比如每次收集1秒的数据封装为一个batch,每个batch转化成一个RDD,然后将每个batch交给Spark的计算引擎进行处理,最后会生产出一个结果数据流推向外部系统。
[3]DStream(画个图) Spark Streaming的编程抽象是DStream。它底层还是RDD,只不过对RDD进行了一层封装,代表了一个持续不断的数据流。 首先,spark streaming一定是有一个实时接收数据的源头。将接收到的数据按照时间划分成一个一个的batch,这里可以设置。如果我设置为1s, 则每个batch代表某一秒的数据,这个batch会转化为一个RDD。 我们都知道,RDD是分布式的,所以这一秒的数据会散落在各个节点的分区中。 然后,根据程序中编写函数执行算子操作。对DStream1执行的map操作,实质是对DStream1中的每个batch的RDD执行map操作。
(3)对比当下比较流行的两种实时计算框架Spark Streaming和Storm
Spark Streaming与Storm都可以用于进行实时流计算,但是他们两者的区别是非常大的。
Storm的优势在于:
[1]Spark Streaming和Storm的计算模型完全不一样。Spark Streaming是基于RDD的,因此需要将一小段时间内的,
比如1秒内的数据,收集起来,作为一个RDD,然后再针对这个batch的数据进行处理。而Storm却可以做到每来一条数据,
都可以立即进行处理和计算。因此,Spark Streaming只能称作准实时的流计算框架,而Storm是真正意义上的实时计算框架;
[2]Storm支持在流式计算程序运行过程中,可以动态地调整并行度,从而动态提高并发处理能力。而Spark Streaming是无法动态调整并行度的;
Spark Streaming的优势在于:
[1]由于Spark Streaming是基于batch进行处理的,在同等资源的情况下,因此相较于Storm基于单条数据进行处理,具有数倍甚至数十倍的吞吐量;
[2]Spark Streaming由于身处于Spark生态圈内,因此可以和Spark Core、Spark SQL、Spark MLlib、Spark GraphX进行无缝整合。流式处理完的数据,
可以立即进行各种map、reduce转换操作,可以立即使用sql进行查询,甚至可以立即使用machine learning或者图计算算法进行处理。
这种一站式的大数据处理功能和优势,是Storm无法匹敌的。
综合上述来看,通常在对实时性要求特别高,而且实时数据量不稳定,比如在白天有高峰期的情况下,可以选择使用Storm。
但是如果是对实时性要求一般,允许1秒的准实时处理,而且不要求动态调整并行度的话,选择Spark Streaming是更好的选择。
|