一种基于ODPS SQL的全局字典索引分布式计算思路

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 本文提供一种能充分利用分布式计算资源来计算全局字典索引的方法,以解决在大数据量下使用上诉方式导致所有数据被分发到单个reducer进行单机排序带来的性能瓶颈。

在一些业务场景中,我们需要将字符串映射为一个整形数字,并确保全局唯一,比如在BitMap字典索引计算场景。常用的方法是将数据集根据需要映射的字符串做全局order by排序,将排序号作为字符串的整形映射。该方式能达到目标,但如果一次要计算的数据量太大(十亿级别或更大),会跑耗时较久甚至跑不出来。



本文提供一种能充分利用分布式计算资源来计算全局字典索引的方法,以解决在大数据量下使用上诉方式导致所有数据被分发到单个reducer进行单机排序带来的性能瓶颈。


order by方式

sort_data数据集中id已经唯一,数据量级9.3亿,直接对数据集全局开窗排序写法如下:

INSERT OVERWRITE TABLE test_data_result
SELECT  id
        ,ROW_NUMBER() OVER (ORDER BY id ASC ) AS rn
FROM    test_data
;

DAG图:

image.png

耗时30分钟,reducer只有一个,这里设置set odps.sql.reducer.instances=256是不起作用的,在这种方式下reducer只能有一个才能保证是全局唯一的。


分布式优化思路

大数据量下计算最忌讳的就是演变为单机计算,好一点的情况是跑很久,数据量再大可能直接跑不出来。如何利用计算资源水平扩展的优势来解决?思路是先做分桶进行分布式局部排序、再基于桶大小得到全局索引。类似于操作系统指令寻址的基址寻址,我们需要对每个id做绝对地址映射,利用一个基址加上相对地址得到绝对地址。

代码参考如下:


--第一步
WITH hash_bucket AS 
(
SELECT  id
            ,ROW_NUMBER() OVER (PARTITION BY bucket_no ORDER BY id ASC ) AS bucket_rel_index
            ,COUNT(1) OVER (PARTITION BY bucket_no ) AS bucket_size
            ,bucket_no
FROM    (
SELECT  id
                        ,ABS(HASH(id)) % 100000 AS bucket_no
FROM    test_data
            ) 
)
--第二步
,bucket_base AS 
(
SELECT  bucket_no
            ,SUM(bucket_size) OVER (ORDER BY bucket_no ASC ) - bucket_size AS bucket_base
FROM    (
SELECT  DISTINCT bucket_no
                        ,bucket_size
FROM    hash_bucket
            ) 
)
--第三步
INSERT OVERWRITE TABLE sort_data_result_1
SELECT  /*+ MAPJOIN(t2) */
        t1.id
        ,t2.bucket_base + bucket_rel_index AS id_index
FROM    hash_bucket t1
JOIN    bucket_base t2
ON      t1.bucket_no = t2.bucket_no
;

1.第一步先对id做hash分桶,然后计算每个桶的大小,桶数量可以根据需要计算的id数量来评估,这里分100000个桶,然后计算出每个id在桶内的相对位置bucket_rel_index,同时计算出桶大小bucket_size;


2.第二步根据桶大小计算每个桶的基址;


3.第三步将桶基址+id在桶内的相对地址得到全局唯一的绝对地址id_index;

image.png

优化后避免了单机计算,耗时2分钟。

日常优化记录,也许并非最优,如有其他方式欢迎探讨。



来源  |  阿里云开发者公众号

作者  |  云义


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
相关文章
|
11天前
|
SQL JSON 分布式计算
ODPS SQL ——列转行、行转列这回让我玩明白了!
本文详细介绍了在MaxCompute中如何使用TRANS_ARRAY和LATERAL VIEW EXPLODE函数来实现列转行的功能。
|
20天前
|
存储 缓存 负载均衡
【PolarDB-X 技术揭秘】Lizard B+tree:揭秘分布式数据库索引优化的终极奥秘!
【8月更文挑战第25天】PolarDB-X是阿里云的一款分布式数据库产品,其核心组件Lizard B+tree针对分布式环境优化,解决了传统B+tree面临的数据分片与跨节点查询等问题。Lizard B+tree通过一致性哈希实现数据分片,确保分布式一致性;智能分区实现了负载均衡;高效的搜索算法与缓存机制降低了查询延迟;副本机制确保了系统的高可用性。此外,PolarDB-X通过自适应分支因子、缓存优化、异步写入、数据压缩和智能分片等策略进一步提升了Lizard B+tree的性能,使其能够在分布式环境下提供高性能的索引服务。这些优化不仅提高了查询速度,还确保了系统的稳定性和可靠性。
48 5
|
25天前
|
SQL 存储 分布式计算
我在淘宝写SQL|ODPS SQL 优化总结
本文结合作者多年的数仓开发经验,结合ODPS平台分享数据仓库中的SQL优化经验。
|
26天前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之未保存的ODPS SQL语句该如何找回
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6天前
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
11 0
|
14天前
|
C# UED 定位技术
WPF控件大全:初学者必读,掌握控件使用技巧,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,控件是实现用户界面交互的关键元素。WPF提供了丰富的控件库,包括基础控件(如`Button`、`TextBox`)、布局控件(如`StackPanel`、`Grid`)、数据绑定控件(如`ListBox`、`DataGrid`)等。本文将介绍这些控件的基本分类及使用技巧,并通过示例代码展示如何在项目中应用。合理选择控件并利用布局控件和数据绑定功能,可以提升用户体验和程序性能。
29 0
|
14天前
|
监控 Java 开发者
揭秘Struts 2性能监控:选对工具与方法,让你的应用跑得更快,赢在起跑线上!
【8月更文挑战第31天】在企业级应用开发中,性能监控对系统的稳定运行至关重要。针对流行的Java EE框架Struts 2,本文探讨了性能监控的工具与方法,包括商用的JProfiler、免费的VisualVM以及Struts 2自带的性能监控插件。通过示例代码展示了如何在实际项目中实施这些监控手段,帮助开发者发现和解决性能瓶颈,确保应用在高并发、高负载环境下稳定运行。选择合适的监控工具需综合考虑项目需求、成本、易用性和可扩展性等因素。
22 0
|
14天前
|
SQL 存储 数据库
|
14天前
|
存储 SQL 数据库
|
14天前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
81 0