问题
spark是并行处理的大数据框架。所以,很多时候程序的运行速度,失败原因都和并行度有关。那什么是并行度?并行度怎么设置?
并行度的概念
资源并行度与数据并行度
我理解的有两类并行度,一种时资源的并行度,由节点数(executor)和cpu数(core)决定的。另一种并行度就是task的数据,也就是partition大小。task又分为map时的task和reduce(shuffle)时的task.task的数目和很多因素有关,资源的总core数,spark.default.parallelism参数,spark.sql.shuffle.partitions参数,读取数据源的类型,shuffle方法的第二个参数,repartition的数目等等。
这两种并行度的关系
如果task的数量多,能用的资源也多,那么并行度自然就好。如果task的数据少,资源很多,有一定的浪费,但是也还好。如果task数目很多,但是资源少,那么会执行完一批,再执行下一批。所以官方给出的建议是,这个task数目要是core总数的2-3倍为佳。如果core有多少task就有多少,那么有些比较快的task执行完了,一些资源就会处于等待的状态。
关于数据并行度
初始化RDD时
数据化RDD时,所形成的task数据是和HD