spark部分:spark的四种运行模式,Spark 比 MapReduce 快的原因,spark执行程序流程,spark算子种类,spark持久化算子,cache 和 persist,调节参数的方式

Spark 有 4 中运行模式:

1. local 模式,适用于测试

2. standalone,并非是单节点,而是使用 spark 自带的资源调度框架

3. yarn,最流行的方式,使用 yarn 集群调度资源

4. mesos,国外使用的多

Spark 比 MapReduce 快的原因

1. Spark 基于内存迭代,而 MapReduce 基于磁盘迭代

MapReduce 的设计:中间结果保存到文件,可以提高可靠性,减少内存占用,但是牺 牲了性能。

Spark 的设计:数据在内存中进行交换,要快一些,但是内存这个东西,可靠性比不过 MapReduce。

2. DAG 计算模型在迭代计算上还是比 MR 的更有效率。 在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是 一个有向无环图(DAG)

spark部分:spark的四种运行模式,Spark 比 MapReduce 快的原因,spark执行程序流程,spark算子种类,spark持久化算子,cache 和 persist,调节参数的方式

DAG 计算模型在 Spark 任务调度中详解! Spark 计算比 MapReduce 快的根本原因在于 DAG 计算模型。

一般而言,DAG 相比 MapReduce 在大多数情况下可以减少 shuffle 次数。Spark 的 DAGScheduler 相当于一个改进 版的 MapReduce,如果计算不涉及与其他节点进行数据交换,Spark 可以在内存中一次性 完成这些操作,也就是中间结果无须落盘,减少了磁盘 IO 的操作。但是,如果计算过程中 涉及数据交换,Spark 也是会把 shuffle 的数据写磁盘的!

有一个误区,Spark 是基于内存的 计算,所以快,这不是主要原因,要对数据做计算,必然得加载到内存,Hadoop 也是如 此,只不过 Spark 支持将需要反复用到的数据给 Cache 到内存中,减少数据加载耗时,所 以 Spark 跑机器学习算法比较在行(需要对数据进行反复迭代)。

Spark 基于磁盘的计算也 是比 Hadoop 快。刚刚提到了 Spark 的 DAGScheduler 是个改进版的 MapReduce,所以 Spark 天生适合做批处理的任务。Hadoop 的 MapReduce 虽然不如 spark 性能好,但是 HDFS 仍然 是业界的大数据存储标准。

3. Spark 是粗粒度的资源调度,而 MR 是细粒度的资源调度。

粗粒度资源申请:当提交application时,application会将所有的资源申请完毕,如果申请不到资源,等待,如果申请到资源,执行application,那么task执行时就不需要自己去申请资源,task执行快,当最后一批task执行完毕,这批资源才会被释放。优点是执行快,缺点是不能使集群资源充分利用。

细粒度资源申请:当提交application时,task执行,task自己申请资源,自己释放资源,task执行完毕之后,这批资源立即被释放,task执行慢,application执行就慢。优点:集群资源充分利用,缺点:执行较慢。

spark执行应用程序的流程:

1. 加载数据集(获得 RDD)

可以从 HDFS,NoSQL 数据库中加载数据集

2. 使用 transformations

算子对 RDD 进行操作 transformations 算子是一系列懒执行的函数

3. 使用 actions 算子触发执行

transformations 算子对 RDD 的操作会被先记录,当 actions 算子触发后才会真正执行

spark部分算子的种类:

1.transformation类算子

2.action算子

3.持久化算子

spark部分持久化算子:

          a).cache
                默认将数据持久化到内存,cache()=persist()=persist(StorageLevel.MEMORY_ONLY)
            b).persist
                可以手动指定数据持久化级别。
                MEMORY_ONLY
                MEMORY_ONLY_SER
                MEMORY_AND_DISK
                MEMORY_AND_DISK_SER
                "_2"代表有副本数,尽量避免使用"DISK_ONLY"级别。
            c).checkpoint
                将数据可以持久化到磁盘,指定的checkpoint目录中,切断checkpointRDD之前的依赖关系,使之后的RDD依赖于                    checkpoint目录中的数据。需要设置checkpoint路径。
                RDD lineage 非常长,每一个RDD之间逻辑复杂,计算耗时。对一个RDD进行checkpoint之前最好先cache下。      

cache 和 persist 的注意事项

1. cache 和 persist 是懒执行算子,需要有一个 action 类的算子触发执行

2. cache 和 persist 算子的返回执行必须赋值给一个变量,在接下来的 job 中直接使用这 个变量,那么就是使用了持久化的数据了,如果 application 中只有一个 job,没有必要 使用 RDD 持久化

3. cache 和 persist 算子后不能立即紧跟 action 类算子,比如 count 算子,但是在下一行 可以有 action 类算子

error : cache().count() right : rdd = rdd.cache() rdd.count()

4. cache() = persist(StorageLevel.MEMORY_ONLY)

shuffle调优中调节参数的集中方式:

配置这些参数有两种方式

1. 在程序中硬编码 例如 sparkConf.set("spark.shuffle.file.buffer","64k")

2. 提交 application 时在命令行指定 例如 spark-submit --conf spark.shuffle.file.buffer=64k --conf 配置信息=配置值 ...

3. 修改 SPARK_HOME/conf/spark-default.conf 配置文件

推荐使用第 2 种方式

spark部分:spark的四种运行模式,Spark 比 MapReduce 快的原因,spark执行程序流程,spark算子种类,spark持久化算子,cache 和 persist,调节参数的方式