本文来自OPPO互联网技术团队,是《剖析Spark数据分区》系列文章的第二篇,将重点分析Spark RDD的数据分区。该系列共分3篇文章,欢迎持续关注。
转载请注名作者,同时欢迎关注OPPO互联网技术团队的公众号:OPPO_tech,一同分享OPPO前沿互联网技术及活动。
Spark
我们以Spark on Yarn为例阐述Spark运行原理。
任务运行步骤
1.客户端提交Application到RM,RM判断集群资源是否满足需求 ;
2.RM在集群中选择一台NodeManager启动Application Master(cluster模式);
3.Driver在AM所在的NodeManager节点启动进程;
4.AM向ResourceManager申请资源,并在每台NodeManager上启动相应的executors;
5.Driver开始进行任务调度,通过Transaction操作形成了RDD血缘关系图,即DAG图,最后通过Action的调用,触发Job并调度执行;
6.DAGScheduler负责Stage级的调度,主要是将DAG切分成若干个Stages,并将每个Stage打包成Taskset交给TaskScheduler调度;
7.TaskScheduler负责Task级的调度,将DAGScheduler给过来的Taskset按照指定的调度策略分发到Executor上执行;
Spark RDD
RDD 弹性分布式数据集,RDD包含5个特征
1.Compute:
RDD在任务计算时是以分区为单位的,通过Compute计算得到每一个分片的数据,不同的RDD子类可以实现自己的compute方法;
2.getPartitions:
计算获取所有分区列表,RDD是一个分区的集合,一个RDD有一个或者多个分区,分区的数量决定了Spark任务的并行度;
3.getDependencies:
获取RDD的依赖,每个RDD都有依赖关系(源RDD的依赖关系为空),这些依赖关系成为lineage;
4.getPreferredLocations:
对其他RDD的依赖列表,Spark在进行任务调度时,会尝试将任务分配到数据所在的机器上,从而避免了机器间的数据传输,RDD获取优先位置的方法为getPreferredLocations,一般只有涉及到从外部存储结构中读取数据时才会有优先位置,比如HadoopRDD, ShuffleRDD;
5.Partitioner:
决定数据分到哪个Partition,对于非key-value类型的RDDÿ