前言
随着大数据时代的疾速倒退,企业每天须要存储、计算、剖析数以万亿的数据,同时还要确保剖析的数据具备及时性、准确性和完整性。面对如此宏大的数据体系,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工程开发方面扩宽思路,进步工作执行效率,同时升高工作保护的人力老本和机器老本。