1.Spark基本工作原理
1.分布式
一个集群有多个节点,对于数据的存储和计算,都是通过多个节点并行来处理的,比如从hdfs读取90万条数据,在节点1、节点2、节点3分别在内存中存储30万条
首先我们在本地编写了spark程序之后,在某台机器的客户端提交这个spark程序,这个程序会被提交到集群上运行,在集群上首先会去Hadoop上读取数据,读取下来的数据会分布式存储在多个节点上。
2.主要基于内存(少数情况基于磁盘)
在3台节点的读取数据进行处理,处理后的数据可能会移到其他节点的内存中
3.迭代式计算
spark与MapReduce最大的不同在于迭代式计算模型,MapReduce计算分为两个阶段map和reduce,两个阶段完了就结束了。所以我们在一个job里能做的处理很有限,只能在map和reduce里处理。
spark计算可以分为N个阶段,因为它的计算是迭代式的。我们在处理完一个阶段后,可以接着处理N个阶段,所以spark相较于MapReduce计算模型,可以提供能强大的功能。
所有计算操作,都是针对多个节点上的数据进行并行操作的。
最后计算的结果可以存储到hdfs或者直接返回客户端等。
2.RDD以及其特点
1、RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集。
2、RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作。(分布式数据集)
3、RDD通常通过Hadoop上的文件,即HDFS文件或者Hive表,来进行创建;有时也可以通过应用程序中的集合来创建。
4、RDD最重要的特性就是,提供了容错性,可以自动从节点失败中恢复过来。即如果某个节点上的RDD partition,因为节点故障,导致数据丢了,那么RDD会自动通过自己的数据来源重新计算该partition。这一切对使用者是透明的。
5、RDD的数据默认情况下存放在内存中的,但是在内存资源不足时,Spark会自动将RDD数据写入磁盘。(弹性)
3.什么是Spark开发
1、核心开发:离线批处理 / 延迟性的交互式数据处理
核心开发过程:
首先定义一个初始的RDD,即定义第一个RDD是从哪里读取数据,可以是HDFS,linux本地文件、list集合等等。
第二,定义RDD的计算操作,这个在spark里称为算子,比如map、groupbykey等,比MapReduce提供的map和reduce强大很多。
第三,其实就是循环往复的过程,第一个计算完了以后数据可能会到新的一批节点上,也就变成了新的RDD,然后再次反复,针对新的RDD进行定义操作。
最后,就是获得最终的数据进行保存起来。
2、SQL查询:底层都是RDD和计算操作
3、实时计算:底层都是RDD和计算操作
实际上这三种开发都是基于RDD