第一节 影响分布式集群运算效率的原因

1.1、引言

Spark,一种基于内存的分布式运算框架,其内部进行任务划分,实现了高效的DAG执行引擎,可以通过基于内存来高效地处理数据流。就一般而言,Spark用于实现作业调度的job执行流程如图所示:
Spark用于实现ETL调度job执行流程

1.2、影响分布式集群运算效率的原因

影响集群资源的高效利用及集群本身的高可用的隐性基因,可概括为以下四点:

1.2.1、集群设置;

相较于Spark任务submit时的一些参数指定,作为资源调度框架的yarn及底层支撑或作为接口对接的hive与hadoop生态,它们的一些硬性指标的设置影响着任务提交后的资源申请模式及运行模式。

1.2.2、缺乏资源;

每个ETL调度任务装载容器前,先要向yarn申请一定的资源,对于一些时间跨度较长及涉及的数据量过大的任务,影响其运行效率的第一要素便可能是缺乏资源。

1.2.3、数据倾斜;

当调度任务所能拥有的资源能够满足其在较为资源冗余的状况下实施运算,长时间的运算过程中可能是涉及了数据倾斜的现象;数据倾斜可以说是分布式运算中不可避免的一种现象,这种现象带来的后果就是任务执行时长会随着倾斜度的增加而变长,甚至会有Fail的风险(任务重跑);不管是任务执行延时还是任务重跑,这都在一定程度上增加了集群的运营压力,所幸的是,只要编写过程稍加注意,还是能避免很大一部分的数据倾斜事件,剩余的部分也能通过一些固定的手法进行更正解决。

1.2.4、小文件过多;

基于SparkSQL开发的ETL调度任务落地生成的小文件主要来源是分区表动态分区和shuffle的partition指定,对于一些时间拉链表,因为年月的积累数据体量过大,故需要进行分区、分桶;分区表在插入数据的时候落地生成的小文件数目是不可控的,而一般的任务数据落地是受spark.sql.shuffle.partitions指定,有时因为效率的需要,我们不得不将这个参数的数字进行上调,与之同期换来的效率相伴的,还有生成大量小文件现象。

1.3、结语

后续的更新中,我们将对这些问题进行分析,并给出相应的解决办法。

发布了31 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Jack_Roy/article/details/97643094