Spark-sql Adaptive Execution动态调整分区数量,调整输出文件数

背景:
在数仓任务中,经常要解决小文件的问题。有时间为了解决小文件问题,我们把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这个参数还是有用的,动态的伸缩,调整分区数和文件个数

你可能感兴趣的:(hive,spark,hive,数据仓库)