spark基本工作原理
1、分布式 2、主要基于内存(少数情况基于磁盘) 3、迭代式计算

布式:
我们在本地编写了 spark 程序,然后你必须在某台能够连接 spark 的机器上提交该 spark程序。此时他会去Hadoop集群或者其他类型的数据库读取数据,数据会存储在spark分布式集群上。
基于内存:
spark主要是基于内存的,数据存储在每个节点的内存上(放得下的话),加快数据的运算
迭代式计算:
MapReduce ,分为两个阶段, map 和 reduce ,两 个阶段完了,就结束了。所以我们在一个 能做的处理很有限,只能在 map 和 reduce 处理。
Spark ,计算模型,可以分为 n 个阶段,因为它是内存迭代式的。我们在处理完一个阶段以后,可以继续往下处理很多个阶段,而不只是两个阶段。所以, Spark 相较于 MapReduce 来说,计算模型可以提供更强大的功能。
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数据写入磁盘。(弹性)
可分区
一个 RDD ,在逻辑上,抽象地代表了一个HDFS 文件。但是,它实际上是被分区的。分为多个分区。多个分区散落在Spark 集群中,不同的节点上。比如说, RDD 有 90 万数据。分为 9 个partition , 9 个分区。
容错性
现在,节点 9 出了些故障,导致partition9 的数据丢失了。那么此时 Spark 会脆弱到直接报错,直接挂掉吗?不可能!!
RDD 是有很强的容错性的,当它发现自己的数据丢失了以后,会自动从自己来源的数据进行重计算,重新获取自己这份数据,这一切对用户,都是完全透明的
弹性
RDD 的每个 partition ,在 spark 节点上存储时,默认都是放在内存中的。但是如果说内存放不下这么多数据 时,比如每个节点最多放 5 万数据,结果你每个 partition 是 10 万数据。那么就会把 partition 中的部分数 据写入磁盘上,进行保存。
而上述这一切,对于用户来说,都是完全透明的。也就是说,你不用去管 RDD 的数据存储在哪里,内存,还是 磁盘。只要关注,你针对 RDD 来进行计算,和处理,等等操作即可。
每一批节点上的每一批数据,实际上就是一个 RDD !!!一个 RDD 是分布式的,所以数据都散落在一批节点上了,每个节点都存储了 RDD 的部分partition 。
Spark 的核心编程
第一,定义初始的 RDD
就是说,你要定义第一个 RDD 是从哪里,读取数据, hdfs 、 linux 本地文件、程序中的集合。
第二,定义对 RDD 的计算操作
这个在 spark 里称之为算子, map 、 reduce 、 flatMap 、 groupByKey ,比 mapreduce 提供的 map和 reduce 强大的太多太多了。
第三,循环往复
第一个计算完了以后,数据可能就会到了新的一批节点上,也就是变成一个新的 RDD 。然后再次反复,针对新的 RDD 定义计算操作。。。。




