Spark SQL 分桶表在字节跳动的优化

本文探讨了Spark SQL在字节跳动的应用,重点介绍了分桶的限制,如小文件问题、不兼容性,以及字节跳动的优化措施,包括Spark与Hive分桶对齐和One to Manage Bucket Join策略,以提升Join效率并减少额外操作。
摘要由CSDN通过智能技术生成

本文来自 SPARK + AI SUMMIT 2020 北美会议,分享者来自字节跳动的郭俊。Bucket 在 Hive 和 Spark SQL 中普遍使用,用于消除 Join 或者 group-by-aggregate 场景下的 Shuffle 操作。本文主要介绍字节跳动在 Bucket 方面的优化。

本文主要从以下四个方面介绍:

  • Spark SQL 在字节跳动的应用

  • 什么是分桶

  • Spark 分桶的限制

  • 字节跳动在分桶方面的优化

下面是 Spark SQL 在字节跳动的应用。

  • 2016年主要是小规模的测试阶段

  • 2017年用于处理 Ad-hoc 工作负载

  • 2018年在生产环境下处理少量的 ETL 管道工作;

  • 2019年在生产环境下全面部署;

  • 2020年成为 DW 领域的主要计算引擎。

什么是分桶

上面例子展示了创建分桶表的方法。主要关键字是 clustered by (xxx) sorted by (xxx) into N buckets

如果我们往分桶表里面插入数据,可以如下使用

INSERT INTO order 
SELECT order_id, user_id, product, amount 
FROM order_staging

可见,这个和正常表的使用并没有什么区别。

如果我们进行一个 ShuffleHashJoin 的时候,首先需要将表的数据按照 on 的条件进行分区,然后才是进行 Join 操作。

但是如果参与 Join 的表已经实现分桶了&#x

Spark 分桶 join 是一种在 Spark 中使用的 join 策略,用于提高 join 操作的性能。 在 Spark 中,数据可以被分桶(也称为分桶)存储在磁盘上,每个桶包含某个键的所有数据。分桶具有以下几个优点: 1. 增强读取性能:当我们进行 join 操作时,分桶可以减少需要读取的数据量。只有具有相同桶号的键才能进行 join,因此可以避免不必要的数据传输。 2. 提高处理速度:因为每个桶都只包含一个键的数据,所以分桶 join 可以极大地减少 join 操作需要比较的键的数量。这样可以大大提高 join 的速度。 3. 减少数据倾斜:在分布式环境中,可能会出现某些键的数据量远大于其他键的情况,这种情况被称为数据倾斜。通过使用分桶 join,可以将数据分布得更加均匀,减少数据倾斜的发生。 使用 Spark 分桶 join 需要进行以下几个步骤: 1. 将数据按照 join key 进行分桶存储。可以使用 Spark 的 `bucketBy` 函数指定分桶列和分桶数。例如:`df1.bucketBy(10, "join_column")`。 2. 在进行 join 操作时,需要使用 `bucketedJoin` 函数,指定要进行 join 的两个数据集和 join 列。例如:`df1.bucketedJoin(df2, "join_column")`。 3. 完成 join 后,可以继续对结果数据集进行其他操作,如过滤、聚合等。 总结来说,Spark 分桶 join 是一种通过数据分桶存储来提高 join 操作性能的技术。它可以减少需要读取的数据量、提高处理速度,并且可以降低数据倾斜的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值