赞
踩
Bucketing是 Spark 和 Hive 中用于优化任务性能的一种技术。在分桶桶(集群列)中确定数据分区并防止数据混洗。根据一个或多个分桶列的值,将数据分配给预定义数量的桶。
分桶有两个主要好处:
何时使用桶列
如何配置存储桶列
如何在 Spark 中创建数据桶
n 是要创建的桶数
df.write.mode(“save_mode”)
.option(“path”, “s3 path/hdfs path”) \
*.bucketBy(n, ‘col1’, ‘col2’…) *
*.sortBy(‘col1’, ’ col2’) *
.saveAsTable(‘table_name’, format=‘parquet’)
df = spark.table(‘table_name’)
CREATE TABLE
`temp`.`dm_log_app_activityinfo_user` (`log_id` STRING, `mid` STRING,
`app_name` STRING, `start_time` STRING, `user_name` STRING, `is_new_visitor`
INT, `user_class` STRING, `user_group` STRING, `user_id` STRING, `user_label`
STRING, `session_id` STRING, `dt` STRING)
USING orc
OPTIONS (
`serialization.format` '1'
)
PARTITIONED BY (dt)
CLUSTERED BY (log_id)
SORTED BY (log_id)
INTO 4000 BUCKETS;
如何在 Spark 上启用分桶?
默认情况下启用分桶。
或者,您可以在 Spark Shell 或属性文件中设置以下属性。
设置 spark.sql.sources.bucketing.enabled=true
Spark 中对表进行分桶的优点
转换列表
以下转换将受益于分桶:
Spark Bucket 的限制
Spark Bucketing 有其自身的局限性,我们在创建分桶表以及将它们连接在一起时需要非常小心。
为了优化连接并在 Spark 中使用分桶,我们需要确保以下几点:
Spark 分桶与 Hive 分桶有何不同?
在 Hive 中,我们需要根据需要创建文件数量的 reducer。
而在 Spark 分桶中,我们没有减速器。因此,它最终会根据任务的数量创建 n 个文件。
将增量大表与存量历史大表(rows≈百亿)的full join去重过程优化,通过历史表分桶方式避免 TB级别表的shuffle过程,相同过程中 图2修改成了历史数据分桶表 避免自身exchange过程,
相同task数测试性能将200分钟压缩至50分钟左右
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。