乐趣区

关于etl:ETL工程师必看超实用的任务优化与断点执行方案

前言

随着大数据时代的疾速倒退,企业每天须要存储、计算、剖析数以万亿的数据,同时还要确保剖析的数据具备及时性、准确性和完整性。面对如此宏大的数据体系,ETL 工程师(数据分析师)如何能高效、精确地进行计算并供业务方应用,就成了一个难题。

作为一家数据智能公司,个推在大数据计算畛域积淀了丰盛的教训。本篇文章将对大数据离线计算过程中呈现的工作迟缓和工作中断这两大痛点问题提出解决思路,冀望读者可能有所播种。

一、工作迟缓

“工作执行迟缓”通常是指工作的执行工夫超过 10 个小时,且不能满足数据应用方对数据及时性的要求。比方业务方需早上就可能查看 T - 1 的数据,然而因为工作延时,业务方只能等到下午或者黄昏能力查问、浏览 T - 1 的数据,从而无奈及时发现经营问题、进行高效决策。因而,对迟缓工作进行优化成了 ETL 工程师必不可少的一项工作。

在长期的大数据实际中,咱们发现,迟缓工作往往具备肯定的共性。只有咱们能找到问题所在,并隔靴搔痒,就能将工作执行工夫大大缩短。个推将工作执行迟缓的常见问题演绎为以下四点:逻辑冗余,数据歪斜、大表复用,慢执行器。接下来会对每个痛点进行具体论述。

1、逻辑冗余

“逻辑冗余”往往是因为 ETL 工程师进行数据处理和计算时更关注处理结果是否满足预期,而未深刻思考是否存在更高效的解决形式,导致本来可通过简略逻辑进行解决的工作,在理论中却应用了简单逻辑来执行。

缩小“逻辑冗余”更多地依赖开发者教训的积攒和逻辑思维以及代码能力的晋升。这里分享一些高级函数,心愿可能帮忙开发者进一步晋升数据处理效率。

Grouping sets

分组统计函数。这个函数能够实现在一段 SQL 中输入不同维度的统计数据,避免出现执行多段 SQL 的状况,具体写法如下:

Lateral view explode()

一行转多行函数。这个函数只能解决 array 格局数据,须要配合 split() 函数应用,具体写法如下:

还有其余一些函数、函数名及性能如下,具体用法须要读者自行查问(可登录 hive 官网查问函数大全):

  • find_in_set():查找特定字符串在指定字符串中的地位
  • get_json_object():从 json 串中抽取指定数据
  • regexp_extract():抽取合乎正则表白的指定字符
  • regexp_replace():替换合乎正则替换指定字符
  • reverse():字符串反转

2、数据歪斜

“数据歪斜”是指在 MR 计算的过程中某些 Map job 须要解决的数据量太大、耗时太长,从而导致整个过程长时间无奈完结,工作解决进度长时间卡在 99% 的景象。

针对数据歪斜的状况,开发者们可通过代码层面进行批改,具体操作如下:

  • 应用 group by 形式替换 count(distinct id) 形式进行去重统计
  • 进行大小表关联时应用 mapjoin 操作或子查问操作,来替换 join 操作
  • group by 呈现歪斜须要将分组字段值随机切分成随机值 + 原始值
  • join 操作避免出现笛卡尔积,即关联字段不要呈现大量反复

在之前的文章中,个推具体解读了 Hive 数据歪斜的起因及解决方案,感兴趣的同学可点击理解:深入浅出 Hive 数据歪斜

3、大表复用

“大表复用”,是指对上亿甚至几十亿的大表数据进行反复遍历之后失去相似的后果。防止大表复用就要求 ETL 工程师进行系统化的思考,可能通过低频的遍历将几十亿的大表数据瘦身到可重复使用的两头小表,且同时反对后续的计算。

因而,工程师须要在工程开发之初就将整体的工程构造思考进去,并且保持“大表仅应用一次”的准则,以晋升整个工程的执行效率。

这里介绍一个实战中的例子,供读者参考:


geqi_win_tmp 表中数据:5000 万

4、慢执行器

“慢执行器”是指数据体量过于宏大时,Hive 的底层计算逻辑曾经无奈疾速遍历繁多分区中的所有数据。

因为在等同资源的状况下,Spark 进行数据遍历的效率远高于 MapReduce;且 Spark 工作对资源的抢占水平远大于 MapReduce 工作,可在短时间内占用大量资源高效实现工作,之后疾速开释资源,以进步整个集群工作的执行效率。

因而,针对该状况,开发者可思考应用 pyspark 等更为高效的计算引擎进行数据的疾速遍历。同时,开发者也须要无意识地增强思维训练,养成良好的开发习惯,在面对海量数据时摸索更快、更准、更体系化的计算和解决形式。

二、工作中断

因为各种各样的起因,线上工作常常会呈现被 kill 掉而后从新执行的状况。工作从新执行会重大节约集群资源,同时使得数据计算结果提早从而影响到业务方的数据利用。如何防止这种景象的产生呢?个推是这样解决该问题的。

个推的定时工作是基于 Azkaban 调度零碎开发的,个推的数据分析师次要应用 shell、HSQL、MySQL、Pypark 四种代码进行数据处理,将原始日志荡涤、计算,而后生成公共层、报表层数据,最终供业务方应用。

因而个推须要设定四种代码执行器以反对脚本中对不同类型代码的解决。这里次要对其中的三个核心内容进行介绍:代码块输出、执行函数以及循环器。

1、代码块输出

个别状况下,脚本中的 shell、HSQL、MySQL、pypark 代码会依照程序间接执行,不能选择性执行。在实践中,咱们将代码块以字符串的形式赋值给 shell 中的变量,并在字符串的结尾标记是何种类型的代码,代码执行到具体步骤时只有赋值操作,不会解析执行,具体如下:

✦ 执行 HSQL 代码块

✦ 执行 shell 代码块

✦ 执行 mysql 代码块

✦ 执行 pyspark 代码块

如此,就实现了将不同的代码放入对应的 step_n 中。在后续的执行器中这些代码可能间接执行,开发者只须要关怀逻辑解决即可。

2、执行函数

执行函数是对 shell 中变量 step_n 当中的字符串进行代码解析并执行。不同类型的代码块解析形式不同,因而须要定义不同的执行函数。函数个别独自放在整个工程的配置文件中,通过 source 的形式调用,具体函数定义如下:

Hive、MySQL 以及 shell 的执行函数比较简单,通过 hive-e 或者 eval 的形式就能够间接执行。pyspark 须要配置相应的队列、门路、参数等,还须要在工程中增 spark.py 文件能力执行,此处不做赘述。

3、循环器

循环器是断点执行性能的核心内容,是步骤的控制器。循环器通过判断 shell 变量名确定须要执行哪一步,通过判断变量中字符串内容确定应用何种函数解析代码并执行。

下图是参考案例,代码如下:

开发者须要在脚本的开始定义好整个代码的完结步骤,以确保循环器失常运行;同时,可将开始步骤当作脚本参数传入,这样就很好地实现了工作的断点执行性能。

总结

ETL 工程中的工作迟缓和工作中断问题是每个大数据工程师都须要面对和解决的。本文基于个推大数据实际,针对工作迟缓和工作中断问题提出了相应解决思路和计划,心愿可能帮忙读者在工作优化以及 ETL 工程开发方面扩宽思路,进步工作执行效率,同时升高工作保护的人力老本和机器老本。

退出移动版