Spark相关知识
spark的四大核心组件
Spark Task 数量设置
参数调优建议:
Spark作业的默认task数量为500~1000个较为合适。
很多同学常犯的一个错误就是不去设置这个参数,那么此时就会导致Spark自己根据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。
通常来说,Spark默认设置的数量是偏少的(比如就几十个task),如果task数量偏少的话,就会导致你前面设置好的Executor的参数都前功尽弃。
试想一下,无论你的Executor进程有多少个,内存和CPU有多大,但是task只有1个或者10个,那么90%的Executor进程可能根本就没有task执行,也就是白白浪费了资源!因此Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。
spark中excuter与task之间的关系
1、每个节点可以起一个或多个Executor。
2、每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。
3、每个Task执行的结果就是生成了目标RDD的一个partiton。
注意: 这里的core是虚拟的core而不是机器的物理CPU核,可以理解为就是Executor的一个工作线程。
而 Task被执行的并发度 = Executor数目 * 每个Executor核数。
** spark 中的三种数据类型:**
RDD,广播变量,累加变量
*** RDD算子相关***
根据RDD 算子处理方式的不同,将算子整体分为 Value 型,双Value 型,Key-Value 型
*** spark 中的map和Mappartitions 的区别***
- Map 算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。 功能的角度
Map 算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。MapPartitions
算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变, 所以可以增加或减少数据 性能的角度
Map算子因为类似于串行操作,所以性能比较低,而是 mapPartitions
算子类似于批处理,所以性能较高。但是mapPartitions
算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。使用 map 操作。
参考资料:
Spark运行流程
参考资料:
http://wenda.chinahadoop.cn/question/4465