【深入MaxCompute】人力家:借助Information Schema合理治理费用

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 人力家是由阿里钉钉和人力窝共同投资成立,帮助客户进入人力资源数字化,依靠产品技术创新驱动战略的互联网公司。本文将为大家带来MaxCompute与人力家客户案例深度解读。
+关注继续查看

作者:石玉阳 人力家 高级数据研发工程师

业务简介

人力家是由阿里钉钉和人力窝共同投资成立,帮助客户进入人力资源数字化,依靠产品技术创新驱动战略的互联网公司。公司主要提供包括人事管理、薪酬管理、社保管理、增值服务在内的人力资源SaaS服务,加速对人力资源领域赋能,实现人力资源新工作方式。目前已服务电子商务、零售服务等领域的多行业客户。

人力家是一家典型的创业公司,目前处于一个竞争激烈的市场环境中,公司具有多产品性质,每个产品的数据具有独立性,同时为了配合内部CRM数据需求,更好地把数据整合,对于数仓团队来说是一个不小的挑战,对于数仓团队要求的是稳,准,及时响应。需要数仓团队既要满足内部的数据需求,也需要在计算的成本上实现优化。

业务痛点

MaxCompute作为一款优秀的大数据产品,其不仅可以高性价比分析处理海量数据,同时MaxCompute支持开发接口和生态,为数据、应用迁移、二次开发提供灵活性。QuickBI可以直连MaxCompute产出报表数据供公司内部分析、统计、决策。因为公司开通的MaxCompute是按量付费规格,所以计算任务和QuickBI 报表每次不同的查询都会耗费计算资源导致MaxCompute计算费用增加,在过去的一段时间,MaxCompute每个月的成本波动较大,不符合期望值,且不能有效、及时的发现一些高成本sql和多频访问报表数据集。

具体原因分析

分析 MaxCompute 账单发现费用波动是因为大计算任务和QuickBI报表数据集的自定义sql,主要为以下五点。

1、单SQL查询费用较高

MaxCompute计算和部分QuickBI报表按照时间维度来进行查询数据,但是有些时间查询跨度较大,或者基表数据量大从而形成一条大查询sql。

2、分区不合理

部分MaxCompute计算逻辑和报表数据集设置不合理,有些查询是直接查询近3年分区的数据, 造成计算成本费用增加。

3、报表访问频率高,筛选项不同

部分QuickBI报表的数据集成本其实很低,但是每天访问的次数确实很大,由于重复执行造成MaxCompute计算作业量增加,从而导致计算费用增加。

4、兼容报表增加维表数据

部分报表数据集为了兼容数据产出,需要增加部分维表数据来进行关联,但有些维表数据集其实很大,最后也会形成一条大查询sql。

5、运行时间较长

MaxCompute部分计算sql和QuickBI报表数据集计算时间较长,影响整体业务运行时间和报表数据产出。

基于Information Schema分析项目作业

MaxCompute元数据服务Information Schema提供了项目元数据及使用历史数据等信息。在ANSI SQL-92的Information Schema基础上,添加了面向MaxCompute服务特有的字段及视图。

租户级别Information Schema是原项目级别Information Schema的升级版,是在每个阿里云账号下创建名为SYSTEM_CATALOG的项目,并内置Information Schema,通过访问该内置Schema提供的只读视图,查询当前用户所有项目的元数据信息以及使用历史信息。元数据视图列表如下

image.png

对于以上部分视图元数据信息,我们更关心的是Information_Schema.TASKS_HISTORY表中每日任务计算的时间、成本和次数。

分析SQL脚本

这里我们使用的是租户级别的 Information Schema,相比于项目级别的 Information Schema,租户级别的只需要创建一个计算节点就可以计算所有 project 的任务,而项目级别的 Information Schema 每个 project 都需要一个计算节点,这里更推荐租户级别的 Information Schema。

set odps.namespace.schema=true;
set odps.sql.decimal.odps2=true;

create table if not exists ads_project_cost_pay_di
(
    env_type  string comment '环境类型'
    ,cost_type string comment '消费类型'
    ,inst_id string comment  '唯一id,作业id'
    ,owner_name string comment  '作业所属人'
    ,task_type string  comment  '作业类型  SQL:SQL作业 CUPID:Spark或Mars作业 SQLCost:SQL预估作业 SQLRT:查询加速SQL作业 LOT:MapReduce作业 PS:PAI的Parameter Server AlgoTask:机器学习作业'
    ,input_records string comment  '作业输入的records数目'
    ,output_records string comment '作业输出的records数目'
    ,input_bytes string comment '实际扫描的数据量,与Logview相同。'
    ,output_bytes string comment '输出字节数。'
    ,status string comment '数据采集瞬间的运行状态(非实时状态)。包含以下状态:Terminated:作业已执行结束。Failed:作业失败。 Cancelled:作业被取消。'
    ,cost_pay DECIMAL(18,5) comment '费用 单位元'
    ,complexity string  comment  '任务复杂度'
    ,settings string comment '上层调度或用户传入的信息,以JSON格式存储。包含字段:USERAGENT、BIZID、SKYNET_ID和SKYNET_NODENAME。'
    ,sql_script string comment 'sql 代码'
    ,start_time string comment '开始时间'
    ,end_time string comment '结束时间'
        ,data_collection string comment  'quickbi数据集'
)
comment 'odps 费用 明细'
partitioned by (ds string comment '分区')
;

insert overwrite table ads_project_cost_pay_di partition(ds=${bizdate})
select  case when task_catalog = 'renlijia_ng' then '生产' 
             when task_catalog = 'renlijia_ng_dev' then '测试'
             else  task_catalog
         end as   env_type
        ,if(regexp_count(settings,'quickbi')>0,'quickbi',task_catalog)cost_type
        ,inst_id
        ,owner_name
        ,task_type
        ,input_records
        ,output_records
        ,input_bytes
        ,output_bytes
        ,status
        ,nvl(case   when task_type = 'SQL' then cast(input_bytes/1024/1024/1024 * complexity * 0.3 as DECIMAL(18,5) )
                    when task_type = 'SQLRT' then cast(input_bytes/1024/1024/1024 * complexity * 0.3 as DECIMAL(18,5) )
                    when task_type = 'CUPID' and status='Terminated'then cast(cost_cpu/100/3600 * 0.66 as DECIMAL(18,5) ) 
                    else 0 
        end,0) cost_pay
        ,complexity 
        ,settings
        ,operation_text sql_script
        ,start_time
        ,end_time
        ,regexp_extract(operation_text,'(?<=quickbi=).*?(?==quickbi)',0)data_collection
from  SYSTEM_CATALOG.INFORMATION_SCHEMA.TASKS_HISTORY where ds=${bizdate};

注:sql成本计算公式(官方示例):

case   
when task_type = 'SQL' then cast(input_bytes/1024/1024/1024 * complexity * 0.3 as DECIMAL(18,5) )
when task_type = 'SQLRT' then cast(input_bytes/1024/1024/1024 * complexity * 0.3 as DECIMAL(18,5) )
when task_type = 'CUPID' and status='Terminated'then cast(cost_cpu/100/3600 * 0.66 as DECIMAL(18,5) ) 
else 0 
end;
治理前后MaxCompute整体成本对比

image.png

报表产出明细数据

因为公司是按量付费的MaxCompute,所有我们主要关心的是成本问题和报表的访问情况。对此我们主要从环境、数据集、用户等维度进行分析。

QuickBI数据集(查ads_project_cost_pay_di表)

image.png

QuickBI报表Demo

image.png

QuickBI数据集字段是从sql-script中正则匹配出来,且QuickBI数据集需要单独增加一个字段用来抽取数据集名。

1、手动在QuickBI数据集增加如下字段:

‘quickbi=xxx数据集=quickbi’ as 数据集自定义字段

2、利用MaxCompute函数regexp_extract按照如下方式正则匹配:

regexp_extract(operation_text,'(?<=quickbi=).*?(?==quickbi)',0)

分析改进项:

1、替换分区不合理数据表或数据集。

2、维表数据在上层加工,下层减少依赖项,做到最好只查一张表。

3、高频访问数据集优化存储大小和QuickBI 报表仪表盘数量。

4、减少报表产出时间。

综上:借助MaxCompute 租户级别Information Schema,拉取每日历史作业信息,公司成功把每日MaxCompute成本降低到合理波动区间。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
8月前
|
机器学习/深度学习 SQL 分布式计算
阿里云ACP大数据考试内容是什么?考试费用是多少?
作为目前市场占比最大的云计算厂商,阿里云旗下的认证在业界内部相当受欢迎的,并且具有很大的含金量,很多人通过学习阿里云的证书知识,提升自己的专业能力,并且在通过考试后拿到相关证书,以此获得进入阿里云以及其合作企业的机会。
|
9月前
|
机器学习/深度学习 分布式计算 运维
阿里云ACP大数据认证考什么内容?考试费用是多少?
而对于想从事大数据行业的人来说,不仅要掌握相关的技能,最好要拥有相关的职业证书,现代社会人们在不断地内卷,自己没有证书就会落人一步,而大数据行业的从业人员,考取阿里云的证书是相当有用的。
|
12月前
|
SQL 分布式计算 MaxCompute
maxcompute如何找到是哪条sql费用高
maxcompute如何找到是哪条sql费用高
maxcompute如何找到是哪条sql费用高
|
机器学习/深度学习 分布式计算 DataWorks
MaxCompute账号费用及任务耗时TOPN统计
很多数据开发者在使用MaxCompute开发过程中需要统计每个账号所属任务的费用使用情况以及每个任务耗时来做任务的合理性规划和调整。但是在使用MaxCompute的时候通常情况下大多数用户通过DataWorks标准模式下使用MaxCompute,这样在MaxCompute提供的元数据视图信息中将记录所有的生产作业执行账号为同一个主账号,只有小部分的开发作业执行账号为个人RAM子账号。那么如何去做到各个账户的费用分摊和任务时间成本的统计 是大部分MaxCompute使用者关注的问题。本文主要介绍如何通过MaxCompute元数据统计账号费用及任务耗时,同时定时通过钉钉推送到客户群。
5107 0
MaxCompute账号费用及任务耗时TOPN统计
|
SQL 存储 分布式计算
MaxCompute Information Schema功能详解
阿里云的技术专家为大家带来MaxCompute新功能Information Schema的详细介绍。内容包括Information Schema的简介,安装,使用场景,以及对此新功能的使用建议。
1714 1
MaxCompute Information Schema功能详解
|
存储 SQL 弹性计算
MaxCompute规格详解--合理的选择让您花更低的成本获得更高的业务价值
本文由阿里巴巴技术专家海清带来以“MaxCompute规格详解”为主题的演讲。首先概述了在使用MaxCompute时,通常选择的两种服务模式,按量计费和包年包月,以及在MaxCompute计费过程中所产生的各项费用。
865 0
MaxCompute规格详解--合理的选择让您花更低的成本获得更高的业务价值
|
分布式计算 MaxCompute API
利用InformationSchema与阿里云交易和账单管理API实现MaxCompute费用对账分摊统计
利用MaxCompute InformationSchema和阿里云交易和账单管理API 实现MaxCompute费用对账分摊统计一、需求场景分析非常多的用户选择MaxCompute按量付费模式构建自己的数据平台,利用MaxCompute按量付费模型极大地减少不必要的费用支持,仅为实际运行的作业付费。
3074 0
|
SQL
MaxCompute 费用暴涨之新增SQL分区裁剪失败
现象:因业务需求新增了SQL任务,这SQL扫描的表为分区表,且SQL条件里表只指定了一个分区,按指定的分区来看数据量并不大,但是SQL的费用非常高。费用比预想的结果相差几倍甚至10倍以上。 若只知道总体费用暴涨,但是没明确是什么任务暴涨,可以可以参考查看账单详情-使用记录文档,找出费用异常的记录。
3536 0
|
存储 SQL 分布式计算
MaxCompute 费用暴涨之存储压缩率降低导致SQL输入量变大
现象:同样的SQL,每天处理的数据行数差不多,但是费用突然暴涨甚至会翻数倍。 分析: 我们先明确MaxCompute SQL后付费的计费公式:一条SQL执行的费用=扫描输入量 ️ SQL复杂度 ️ 0.3(¥/GB)。
3565 0
热门文章
最新文章
相关产品
云原生大数据计算服务 MaxCompute
推荐文章
更多