0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

超实用的任务优化与断点执行方案

Android编程精选 来源:个推技术实践 作者:渊虹 2021-07-05 16:33 次阅读

前言

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

作为一家数据智能公司,个推在大数据计算领域沉淀了丰富的经验。本篇文章将对大数据离线计算过程中出现的任务缓慢和任务中断这两大痛点问题提出解决思路,期望读者能够有所收获。

一、任务缓慢

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

在长期的大数据实践中,我们发现,缓慢任务往往具有一定的共性。只要我们能找到问题所在,并对症下药,就能将任务执行时间大大缩短。个推将任务执行缓慢的常见问题归纳为以下四点:逻辑冗余,数据倾斜、大表复用,慢执行器。接下来会对每个痛点进行详细阐述。

1、逻辑冗余

“逻辑冗余”往往是因为ETL工程师进行数据处理和计算时更关注处理结果是否满足预期,而未深入考虑是否存在更高效的处理方式,导致原本可通过简单逻辑进行处理的任务,在实际中却使用了复杂逻辑来执行。

减少“逻辑冗余”更多地依赖开发者经验的积累和逻辑思维以及代码能力的提升。这里分享一些高级函数,希望能够帮助开发者进一步提升数据处理效率。

Grouping sets

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

358e8860-d55e-11eb-9e57-12bb97331649.png

Lateral view explode()

一行转多行函数。这个函数只能处理array格式数据,需要配合split()函数使用,具体写法如下:

3677624c-d55e-11eb-9e57-12bb97331649.png

还有其他一些函数、函数名及功能如下,具体用法需要读者自行查询(可登录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操作避免出现笛卡尔积,即关联字段不要出现大量重复

3、大表复用

“大表复用”,是指对上亿甚至几十亿的大表数据进行重复遍历之后得到类似的结果。避免大表复用就要求ETL工程师进行系统化的思考,能够通过低频的遍历将几十亿的大表数据瘦身到可重复使用的中间小表,且同时支持后续的计算。

因此,工程师需要在工程开发之初就将整体的工程结构考虑进去,并且坚持“大表仅使用一次”的原则,以提升整个工程的执行效率。

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

36838676-d55e-11eb-9e57-12bb97331649.png

geqi_win_tmp表中数据:5000万

4、慢执行器

“慢执行器”是指数据体量过于庞大时,Hive的底层计算逻辑已经无法快速遍历单一分区中的所有数据。

由于在同等资源的情况下,Spark进行数据遍历的效率远高于MapReduce;且Spark任务对资源的抢占程度远大于MapReduce任务,可在短时间内占用大量资源高效完成任务,之后快速释放资源,以提高整个集群任务的执行效率。

因此,针对该情况,开发者可考虑使用pyspark等更为高效的计算引擎进行数据的快速遍历。同时,开发者也需要有意识地加强思维训练,养成良好的开发习惯,在面对海量数据时探索更快、更准、更体系化的计算和处理方式。

二、任务中断

因为各种各样的原因,线上任务经常会出现被kill掉然后重新执行的情况。任务重新执行会严重浪费集群资源,同时使得数据计算结果延迟从而影响到业务方的数据应用。如何避免这种现象的发生呢?个推是这样解决该问题的。

个推的定时任务是基于Azkaban调度系统开发的,个推的数据分析师主要使用shell、HSQL、MySQL、Pypark四种代码进行数据处理,将原始日志清洗、计算,然后生成公共层、报表层数据,最终供业务方使用。

因此个推需要设定四种代码执行器以支持脚本中对不同类型代码的处理。这里主要对其中的三个核心内容进行介绍:代码块输入、执行函数以及循环器。

1、代码块输入

一般情况下,脚本中的shell、HSQL、MySQL、pypark代码会按照顺序直接执行,不能选择性执行。在实践中,我们将代码块以字符串的方式赋值给shell中的变量,并在字符串的开头标记是何种类型的代码,代码执行到具体步骤时只有赋值操作,不会解析执行,具体如下:

✦ 执行HSQL代码块

36d0d5a2-d55e-11eb-9e57-12bb97331649.png

✦ 执行shell代码块

36dda980-d55e-11eb-9e57-12bb97331649.png

✦ 执行mysql代码块

36eb8d48-d55e-11eb-9e57-12bb97331649.png

✦ 执行pyspark代码块

36f7b424-d55e-11eb-9e57-12bb97331649.png

如此,就实现了将不同的代码放入对应的step_n中。在后续的执行器中这些代码能够直接执行,开发者只需要关心逻辑处理即可。

2、执行函数

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

3703effa-d55e-11eb-9e57-12bb97331649.png

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

3、循环器

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

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

37159a0c-d55e-11eb-9e57-12bb97331649.png

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

总结

ETL工程中的任务缓慢和任务中断问题是每个大数据工程师都需要面对和解决的。本文基于个推大数据实践,针对任务缓慢和任务中断问题提出了相应解决思路和方案,希望能够帮助读者在任务优化以及ETL工程开发方面扩宽思路,提高任务执行效率,同时降低任务维护的人力成本和机器成本。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4213

    浏览量

    85554
  • SQL
    SQL
    +关注

    关注

    1

    文章

    753

    浏览量

    44018
  • ETL
    ETL
    +关注

    关注

    0

    文章

    20

    浏览量

    9376
  • 函数
    +关注

    关注

    3

    文章

    4276

    浏览量

    62303
  • 大数据
    +关注

    关注

    64

    文章

    8851

    浏览量

    137182

原文标题:ETL工程师必看!超实用的任务优化与断点执行方案

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    广州盈致WMS系统:优化仓储管理的智能化解决方案

    WMS系统 是一种基于信息技术的智能化仓储管理解决方案,通过数字化、自动化和智能化的方式,优化企业的仓储管理流程,提高效率、准确性和可控性。以下是WMS系统优化仓储管理的智能化解决方案
    的头像 发表于 10-21 14:53 107次阅读

    LED灯带断点续传是什么意思

    led幻彩跑马灯带分带断点续传和不带断点续传的。灯带断点续传是指采用双信号线交叉传输的方案,当其中一个信号中断后,另一条备用信号线能绕开故障点,将信号传输到下一个像素点。简单来说就是一
    发表于 07-18 18:20

    任务编译器:断点后进入代码不起作用,为什么?

    我正在使用 Tricore Aurix TC37x 和 Tasking Compiler。 我可以加载我的应用程序(基于 autosar)并运行它。 然而,当我想调试代码时,如果我设置一个断点并尝试
    发表于 07-02 07:49

    ESP32C3任务执行一段时间,会出现任务不运行的问题,为什么?

    ESP32C3任务执行一段时间,会出现任务不运行的问题, 不运行的任务优先级低,并且任务的延时时间为vTaskDelay(100/ por
    发表于 06-05 07:23

    keil 断点 执行次数设置后,出现非法变量的错误

    keil 断点 执行次数设置后,出现非法变量的错误。希望大家帮帮忙。
    发表于 06-02 19:25

    用的cube生成的freertos工程,串口和任务通过邮箱通讯,结果任务反应很慢是怎么回事?

    初学freertos。用的cube生成的freertos工程,单片机型号位stm32f103vbt6。 建了三个人物,一个是串口任务,一个是LED每秒翻转一次,一个是空任务。 串口接收
    发表于 05-08 08:13

    为什么CubeMX设计的FreeRTOS工程只能正常运行3个任务

    用CubeMX4.20设计的FreeRTOS工程有六个任务,出一个任务优先级较低外,另外几个都是较高优先级。发现只有3个任务是正常运行的,还有三个没有运行的迹象。用断点跟踪法在
    发表于 04-19 08:23

    融合架构解决方案

    随着信息技术的发展,企业对数据中心的依赖日益增强,对存储、计算和网络资源的需求也在不断增长。融合架构作为一种新兴的IT基础设施解决方案,正逐渐成为企业数据中心建设的首选。本文将详细介绍融合架构
    的头像 发表于 04-10 14:57 537次阅读

    请问GTM MCS每个通道任务如何执行

    使用GTM MCS多个通道ch 0,ch1,ch3,把三个通道代码拷贝到MCS RAM。 是不是把每个通道MCS_CH_PC寄存器写为自己代码的运行地址,然后再使能通道,每个通道就执行自己任务代码呢? 谢谢!!!
    发表于 02-04 09:27

    MySQL的执行过程 SQL语句性能优化常用策略

    回顾 MySQL 的执行过程,帮助介绍如何进行 sql 优化
    的头像 发表于 12-12 10:26 597次阅读
    MySQL的<b class='flag-5'>执行</b>过程 SQL语句性能<b class='flag-5'>优化</b>常用策略

    大规模神经网络优化参最佳实践与规模律

    从理论分析入手把握大规模神经网络优化的规律,可以指导实践中的参数选择。反过来,实践中的参数选择也可以指导理论分析。本篇文章聚焦于大语言模型,介绍从 GPT 以来大家普遍使用的训练
    的头像 发表于 12-10 21:45 931次阅读

    怎么让python执行完后再执行

    在Python中,可以使用一些技术来确保程序执行完毕后再执行其他任务。下面将详细介绍几种方法。 一、使用阻塞方式执行程序 阻塞方式是最简单的方法之一,它要求程序在
    的头像 发表于 11-29 15:09 3273次阅读

    MySQL性能优化方法

    MySQL 性能优化是一项关键的任务,可以提高数据库的运行速度和效率。以下是一些优化方法,包括具体代码和详细优化方案
    的头像 发表于 11-22 09:59 520次阅读

    介绍几种判断电线电缆断点的检测方法

    当电线电缆的内部出现断线故障时,由于外部绝缘皮的包裹,使断线的确切位置不易确定,测试电线电缆断点 我们需要找出有断点的一根电线,然后就可以找到确切的断点了。
    的头像 发表于 11-20 11:07 3204次阅读
    介绍几种判断电线电缆<b class='flag-5'>断点</b>的检测方法

    接口调用并发执行十个任务总结

    一个接口调用时,接收到一个列表,十个元素,需要并发执行十个任务,每个任务都要返回执行的结果和异常,然后对返回的结果装填到一个切片列表里,统一返回结果。
    的头像 发表于 11-15 10:37 405次阅读