**
1、Spark简介
**
1)、Spark的历史:2012年发布初始版本0.6版本,已经有6年的历史了。
2)、Spark的创始人:美国加州大学的伯克利分校的AMP实验室。
3)、Spark比MR快的原因:
①Spark是粗粒度的资源调度,资源复用。
②Spark支持基于内存迭代,MR不支持。
③Spark支持DAG有向无环图 task pipleline。
④Spark可以根据不同场景选择不同shuffle,spark shuffle 比MR性能高(sortShuffle)
5)、spark的运行模式:local、standalone、yarn、mesos。
6)、开发Spark的语言:scala、java、python、R。(Scala和Java兼容性和效率都是一样的)
2、RDD(弹性分布式数据集)(重点)
1)、RDD五大特性:(重点)
1. RDD是由一系列的Paratition组成的。(partition个数=split切片数 约等于 block数;Spark没有读文件的方法,依赖MR读文件的方法)
2. RDD提供的每一个算子实际上是作用在每一个Paratition上的。
3. RDD实际上是有一系列的依赖关系的,依赖于其他的RDD。(计算的容错性;体现了RDD的弹性;父RDD不一定知道子RDD是谁,子RDD一定知道父RDD是谁)
4. 可选:分区器作用在内部计算逻辑的返回值是kv格式的RDD上。
5. 可选:RDD会提供一系列的最佳计算位置。(计算找数据)
2)、算子
1. taransformation类算子
map(一对一)、flatMap(一对多)、filter(一对N(0、1))、join、leftouterJoin、rightouterJoin、fullouterJoin、sortBy、sortByKey、gorupBy、groupByKey、reduceBy、reduceByKey、sample、union、mappatition、mappatitionwithindex、zip、zipWithIndex。
2. action类算子
count、collect(将task的计算结果拉回到Driver端)、foreach(不会回收所有task计算结果,原理:将用户传入的参数推送到各个节点上去执行,只能去计算节点找结果)、saveAsTextFile(path)、reduce、foreachPatition、take、first。
(查看计算结果的方式:WEBUI、去各个节点的Worker工作目录查看)
3. 控制类算子
cache(相当于MEMOORY_ONLY)、
persist(MEMORY_ONLY、DISK_ONLY、MEMORY_AND_DISK)
控制类算子注意点:
1)、控制类算子后不能紧跟action类算子
2)、缓存单元是partition
3)、懒执行、需要action类算子触发执行。(如果application中只有一个job,没必要使用控制类算子)
3、Spark在集群中大概运行流程
1. Driver分发task到节点运行(计算找数据)。
2. task执行结果拉回到Driver(有可能发生OOM)。
Driver的作用:
1)、分发任务到计算节点运行。
2)、监控task(thread)的运行情况。
3)、如果task失败,会重新发送(有限制)。
4)、可以拉回结果到Driver进程。
结论:Driver进程会和集群频繁通信。
4、提交Application的方式
1、Client
提交方式:spark-submit --deploy-mode client --class jarPath args
特点:Driver进程在客户端节点启动
适用场景:测试环境
大概运行流程:
1)、在Client本地启动Driver进程。
2)、Driver会向Master为当前Application申请资源。
3)、Master接收到请求后,会在资源充足的节点上启动Executor进程。
4)、Driver分发task到Executor执行。
2、Cluster
提交方式:spark-submit --depl