Spark简介

淺唱寂寞╮ 提交于 2019-11-30 06:16:10

Spark简介

1、spark是什么

一个快速、通用的集群计算平台。

2、spark特点

快速:

1、spark首先是基于mapreduce来优化的一个集群计算平台,他扩充了mapreduce的计算模型。

2、spark是基于内存计算的,那么基于内存的意思是什么呢?像我们平时计算数据很少会直接得到结果,都要经过几次的运算才可以得到一个准确的,精准的数值,那么每次计算都会产生一个中间的计算结果,我们还需要使用这个计算结果来继续运算,所以他会被暂时的保存。

但是保存地点无非就是存于硬盘或内存,存在硬盘中难免的就会进行多次额外的写入写出操作,而spark就是采用将中间结果存储在内存中来进行,这样会大大的减少运行的时间,增加计算效率,像处理相同的数据mapreduce的时间可能在几分钟到几小时,而spark会在几秒到几分钟之内完成。

通用:

spark的设计容纳了许多其他分布式处理系统的功能,比如批处理(hadoop)、交互查询(hive)、流处理(storm)等等,这样整合后会大大降低集群的维护成本。

开放:

在上次介绍scala的时候我们就讲过,scala的大火跟spark的兴起是息息相关的,因为scala是spark的底层代码,但是spark并不是只可以使用scala,它还提供了java、python等语言的API以及丰富的内置库。而且spark和hadoop、kafka等大数据工具的关系整合的很好。

3、spark和hadoop的比较

上面已经讲了许多spark的优点,并且也说到他可以和hadoop整合,那么二者的却别到底有哪些呢?

学习过一段时间的hadoop我们都会知道,hadoop是一个离线处理的大数据工具,他对处理的实时性要求不高,而spark适用于对时效性要求很高的场景,并且spark基于内存还可以适用于机器学习的场景。

但是并不代表spark就一定比hadoop优秀,因为我们学习大数据首先要知道我们学习的是一个生态系统,而不仅仅局限于某个工具,这个系统是由hadoop、spark、hive等等各种组件组成的一个大的生态圈,每个组件 都有自己的功能,比如spark虽然实时性好,但是无法持久化数据,还需要借助hadoop的HDFS来实现,这个生态系统是会随着时间的推进而越来越大,越来越丰富的。

Spark组件介绍

1、spark core

spark的基本功能实现都在这里,包括任务调度、内存管理、容错机制等等,向我们平时使用的RDDs(弹性分布式数据集)就整合在spark core中,它提供了许多的API来创建和操作RDDs,但是Spark整个的框架中还有许多的其他组件,spark core还负责为其他的组件提供底层的服务和支持。

2、Spark SQL

spark用来处理结构化数据的一个库,就像我们最熟悉的mysql数据库一样,在hadoop的集群中它的存在又类似于Hive提供的HQL,一般负责企业中的报表统计。

3、Spark Streaming

是spark框架中的实时数据流处理组件,类似于Storm,并且Spark Streaming也提供了许多API用来操作实时流数据,一般用来从一些消息队列(例如Kafka)中接收数据,并作出实时统计。

4、Mlib(Machine learning lib)

用来实现机器学习的包,mlib是可以实现基于集群来进行分类、聚合、回归、模型评估、数据导入的,相比python只能在单机处理数据来说,mlib基于集群会处理的数据更多,不像单击操作那么有限。

5、Graphx

处理图的库,可以对图进行并行计算,也提供了各种图的操作和常用的算法(例如 PangRank)。

6、Cluster Managers

spark自带的一个集群管理器,功能类似于Hadoop中的hadoop yarn,就是负责进行资源调度处理等等。

### 注意:
Spark SQL、Spark Streaming、Graphx这些用来操作的API都是继承自RDDs。

Spark的紧密集成性

1、Spark一旦底层实现优化,那么所有基于底层实现的功能组件都会得到相应的优化。

2、spark的紧密集成还节省了各个组件一起使用的部署问题,缩短了测试时间。

3、我们只要在Spark中增加了新的组件,那么其他组件也可以使用该新组建的功能。

RDDs

常用的RDD算子介绍:更新一篇博客放链接

1、介绍

RDDs(Resilient distributed datasets)是一个弹性分布式数据集,他会并行分布在整个集群中,例如:

 val lines=sc.textFile("hdfs:\\h01:9000\scala\README.md")

我们就是将加载的集群中的一个文件放到lines这个RDD中,当文件很小时体现不出并行的好处,而当文件很大时,这个RDD会将文件分成多个部分,在不同的集群节点上处理,但是这个处理时使用的RDD变量是我们看不到的,但是处理完成后,这里lines还是可以代表并行计算之前的整个大文件,不管切分成多少部分,我们都可以通过lines这个RDD去完成后面的与之有关的所有操作。例如我在加载文件之后想统计行数,或许这个文件大到分给了几十台机器处理,但是我们还是只要输入

lines.count()

就可以直接得到这个大文件处理的结果。

而RDD在代码中就是Spark分发数据和计算数据的一个基础抽象类,它的概念是抽象存在的,同时他也代表了一个不可改变的分布式集合对象,这个不可改变是不可改变什么呢?

在我们加载完数据文件之后,这个lines就只能代表这个加载的文件了,这个加载的文件是不可以进行增删改的,如果他出现了变化,那么我们得到的就不是之前创建的RDD了,而是一个新的RDD对象。

并且我们要知道在Spark中的所有计算都是通过RDD来创建、转换、操作完成的,而且一个RDD内部是由多个partitions分片组成,每一个分片包含了一部分的数据,而运行时会每一个分片都会去往不同的节点执行,同理借用上面的例子:

 lines.count()

上面我们说到他会得到整个大文件的处理结果,但是这个获得过程就是通过我们每一个分片的数据不在不同节点上执行这个操作,将得到的结果汇总,最后才通过lines这个RDD展示出来,它是有内部的运算过程在里面的,具体怎么写,我们看下面这个例子:

val RDD=sc.parallelize(Array(1,2,2,4),4)

这里我们就是将Array中的数据分成了4个组传给了sparkcontext的parallelize方法(这些具体的方法,后面或者我新写一个博客具体介绍),然后我们利用

RDD.foreach(println)

执行遍历输出就会得到Array中的四个数字,但是出现的顺序是随机的,因为我们不能保证是哪个分片先被执行完毕。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!