背景:
在数仓任务中,经常要解决小文件的问题。有时间为了解决小文件问题,我们把spark.sql.shuffle.partitions这个参数调整的很小,但是随着时间的推移,数据量越来越大,当初设置的参数就不合适了,那有没有一个可以自我伸缩的参数呢?
我们的spark-sql版本:
[hadoop@666 ~]$ spark-sql --version
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.2.1
/_/
Using Scala version 2.11.8, Java HotSpot(TM) 64-Bit Server VM, 1.8.0_191
Branch
Compiled by user root on 2018-02-01T02:21:58Z
Revision
Url
Type --help for more information.
参数:
set spark.sql.shuffle.partitions=800;
set spark.sql.adaptive.enabled=true;
注:执行过程中有shuffle才能生效,否则按照原数据文件数输出;
set spark.sql.shuffle.partitions=800;这个参数如果没有自定义,那默认会是200
实例1:
spark-sql> set spark.sql.shuffle.partitions=800;
spark.sql.shuffle.partitions 800
Time taken: 0.638 seconds, Fetched 1 row(s)
spark-sql> set spark.sql.adaptive.enabled=true;
spark.sql.adaptive.enabled true
Time taken: 0.012 seconds, Fetched 1 row(s)
利用distribute by rand()*100
制造了一个shuffle过程
spark-sql> create table test.test_app_open_20211029_2 as
> select
> *
> from ods_center.ods_app_open_mid
> where dt='20211028'
> and (apptypeid like '100%' or apptypeid like '300%')
> distribute by rand()*100;
21/10/29 16:55:39 WARN HiveMetaStore: Location: hdfs://HDFS/usr/hive/warehouse/test.db/test_app_open_20211029_2 specified for non-external table:test_app_open_20211029_2
Time taken: 253.592 seconds
我们来看一下文件数:
spark-sql> dfs -du -h /usr/hive/warehouse/test.db/test_app_open_20211029_2;
261.7 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00000-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
261.4 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00001-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
261.2 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00002-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
261.5 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00003-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
....
261.2 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00796-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
262.0 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00797-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
261.7 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00798-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
261.5 M /usr/hive/warehouse/test.db/test_app_open_20211029_2/part-00799-7ba065ef-f9c6-4e6b-abbc-e5f807738ffd-c000
从上面数据可以看出来,我们文件数为800个,每个文件的数据大小基本上很均匀
实例2: 我们调整一下字段,看看文件数会不会少一点
spark-sql> create table test.test_app_open_20211029 as
> select
> uid
> ,repairimei
> ,dateline
> ,ip
> ,imei
> ,deviceid
> ,accid
> ,muid
> ,apptypeid
> ,appcqid
> ,appqid
> ,appver
> ,appverint
> ,os
> ,osversion
> ,device
> ,devicebrand
> ,province
> ,city
> ,country
> ,pixel
> ,network
> ,istourist
> ,obatchid
> ,isyueyu
> ,openway
> ,wakeway
> from ods_center.ods_app_open_mid
> where dt='20211028'
> and (apptypeid like '100%' or apptypeid like '300%')
> distribute by rand()*100;
21/10/29 16:08:38 WARN HiveMetaStore: Location: hdfs://HDFS/usr/hive/warehouse/test.db/test_app_open_20211029 specified for non-external table:test_app_open_20211029
Time taken: 129.723 seconds
我们来看一下文件数:
spark-sql> dfs -du -h /usr/hive/warehouse/test.db/test_app_open_20211029;
82.1 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00000-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
82.0 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00001-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
82.2 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00002-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
81.9 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00003-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
...
82.0 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00396-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
82.1 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00397-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
81.9 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00398-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
82.0 M /usr/hive/warehouse/test.db/test_app_open_20211029/part-00399-9a2d409e-39fb-48ce-8aac-ee51e01ad156-c000
从上面数据可以看出来,我们文件数为400个,比全量数据少了400个文件,证明我们参数是有效的
实例3: 我只取一个字段,文件数会不会变成1个?
利用group by制造了一个shuffle
spark-sql> create table test.test_app_open_20211029_1 as
> select
> apptypeid
> from ods_center.ods_app_open_mid
> where dt='20211028'
> and (apptypeid like '100%' or apptypeid like '300%')
> group by apptypeid;
21/10/29 16:12:13 WARN HiveMetaStore: Location: hdfs://HDFS/usr/hive/warehouse/test.db/test_app_open_20211029_1 specified for non-external table:test_app_open_20211029_1
Time taken: 130.504 seconds
我们来看一下文件数:
spark-sql> dfs -du -h /usr/hive/warehouse/test.db/test_app_open_20211029_1;
581 /usr/hive/warehouse/test.db/test_app_open_20211029_1/part-00000-ab62dcfc-8ae8-4602-9f48-6e4fb987867e-c000
我们文件数变为1个了,spark.sql.adaptive.enabled这个参数还是有用的,动态的伸缩,调整分区数和文件个数