@@ -17,7 +17,6 @@ use std::sync::Arc;
1717use std:: time:: Duration ;
1818use std:: time:: Instant ;
1919
20- use databend_base:: uniq_id:: GlobalUniq ;
2120use databend_common_base:: base:: ProgressValues ;
2221use databend_common_exception:: ErrorCode ;
2322use databend_common_exception:: Result ;
@@ -31,7 +30,6 @@ use databend_common_storages_parquet::ReadSettings;
3130use log:: debug;
3231use log:: info;
3332use parking_lot:: Mutex ;
34- use parquet:: file:: metadata:: RowGroupMetaData ;
3533
3634use crate :: pipelines:: memory_settings:: MemorySettingsExt ;
3735use crate :: pipelines:: processors:: transforms:: aggregator:: NewSpilledPayload ;
@@ -43,27 +41,33 @@ use crate::sessions::TableContextSpillProgress;
4341use crate :: spillers:: Layout ;
4442use crate :: spillers:: SpillAdapter ;
4543use crate :: spillers:: SpillTarget ;
44+ use crate :: spillers:: SpilledDataFile ;
4645use crate :: spillers:: SpillsBufferPool ;
4746use crate :: spillers:: SpillsDataWriter ;
4847
4948const BYTES_PER_MIB : usize = 1024 * 1024 ;
5049
5150struct PayloadWriter {
52- path : String ,
5351 writer : SpillsDataWriter ,
5452}
5553
5654impl PayloadWriter {
57- fn try_create ( prefix : & str , writer_pool_bytes : usize ) -> Result < Self > {
55+ fn try_create (
56+ prefix : & str ,
57+ writer_pool_bytes : usize ,
58+ max_row_groups_per_file : usize ,
59+ ) -> Result < Self > {
5860 let data_operator = DataOperator :: instance ( ) ;
5961 let operator = data_operator. spill_operator ( ) ;
6062 let buffer_pool = SpillsBufferPool :: instance ( ) ;
61- let file_path = format ! ( "{}/{}" , prefix, GlobalUniq :: unique( ) ) ;
62- let spills_data_writer =
63- buffer_pool. writer ( operator, file_path. clone ( ) , writer_pool_bytes) ?;
63+ let spills_data_writer = buffer_pool. writer (
64+ operator,
65+ prefix. to_string ( ) ,
66+ writer_pool_bytes,
67+ max_row_groups_per_file,
68+ ) ?;
6469
6570 Ok ( PayloadWriter {
66- path : file_path,
6771 writer : spills_data_writer,
6872 } )
6973 }
@@ -77,9 +81,8 @@ impl PayloadWriter {
7781 self . writer . flush ( )
7882 }
7983
80- fn close ( self ) -> Result < ( String , usize , Vec < RowGroupMetaData > ) > {
81- let ( bytes_written, row_groups) = self . writer . close ( ) ?;
82- Ok ( ( self . path , bytes_written, row_groups) )
84+ fn close ( self ) -> Result < Vec < SpilledDataFile > > {
85+ self . writer . close ( )
8386 }
8487}
8588
@@ -114,6 +117,7 @@ struct AggregatePayloadWriters {
114117 spill_prefix : String ,
115118 partition_count : usize ,
116119 writer_pool_bytes : usize ,
120+ max_row_groups_per_file : usize ,
117121 writers : Vec < Option < PayloadWriter > > ,
118122 write_stats : WriteStats ,
119123 ctx : Arc < QueryContext > ,
@@ -124,12 +128,14 @@ impl AggregatePayloadWriters {
124128 prefix : & str ,
125129 partition_count : usize ,
126130 writer_pool_bytes : usize ,
131+ max_row_groups_per_file : usize ,
127132 ctx : Arc < QueryContext > ,
128133 ) -> Self {
129134 AggregatePayloadWriters {
130135 spill_prefix : prefix. to_string ( ) ,
131136 partition_count,
132137 writer_pool_bytes,
138+ max_row_groups_per_file,
133139 writers : Self :: empty_writers ( partition_count) ,
134140 write_stats : WriteStats :: default ( ) ,
135141 ctx,
@@ -147,6 +153,7 @@ impl AggregatePayloadWriters {
147153 self . writers [ bucket] = Some ( PayloadWriter :: try_create (
148154 & self . spill_prefix ,
149155 self . writer_pool_bytes ,
156+ self . max_row_groups_per_file ,
150157 ) ?) ;
151158 }
152159
@@ -187,40 +194,46 @@ impl AggregatePayloadWriters {
187194 continue ;
188195 } ;
189196
190- let ( path, written_size, row_groups) = writer. close ( ) ?;
191-
192- if written_size != 0 {
193- info ! (
194- "Write aggregate spill finished: (bucket: {}, location: {}, bytes: {}, rows: {}, batch_count: {})" ,
195- partition_id,
197+ for file in writer. close ( ) ? {
198+ let SpilledDataFile {
196199 path,
197- written_size,
198- row_groups. iter( ) . map( |rg| rg. num_rows( ) ) . sum:: <i64 >( ) ,
199- row_groups. len( )
200- ) ;
201- }
200+ bytes_written,
201+ row_groups,
202+ } = file;
203+
204+ if bytes_written != 0 {
205+ info ! (
206+ "Write aggregate spill finished: (bucket: {}, location: {}, bytes: {}, rows: {}, batch_count: {})" ,
207+ partition_id,
208+ path,
209+ bytes_written,
210+ row_groups. iter( ) . map( |rg| rg. num_rows( ) ) . sum:: <i64 >( ) ,
211+ row_groups. len( )
212+ ) ;
213+ }
202214
203- self . ctx . add_spill_file (
204- Location :: Remote ( path. clone ( ) ) ,
205- Layout :: Aggregate ,
206- written_size ,
207- ) ;
215+ self . ctx . add_spill_file (
216+ Location :: Remote ( path. clone ( ) ) ,
217+ Layout :: Aggregate ,
218+ bytes_written ,
219+ ) ;
208220
209- if row_groups. is_empty ( ) {
210- continue ;
211- }
221+ if row_groups. is_empty ( ) {
222+ continue ;
223+ }
212224
213- if written_size > 0 {
214- self . write_stats . add_bytes ( written_size ) ;
215- }
225+ if bytes_written > 0 {
226+ self . write_stats . add_bytes ( bytes_written ) ;
227+ }
216228
217- for row_group in row_groups {
218- self . write_stats . add_rows ( row_group. num_rows ( ) as usize ) ;
219- spilled_payloads. push ( NewSpilledPayload {
220- bucket : partition_id as isize ,
221- location : path. clone ( ) ,
222- row_group,
223- } ) ;
229+ for row_group in row_groups {
230+ self . write_stats . add_rows ( row_group. num_rows ( ) as usize ) ;
231+ spilled_payloads. push ( NewSpilledPayload {
232+ bucket : partition_id as isize ,
233+ location : path. clone ( ) ,
234+ row_group,
235+ } ) ;
236+ }
224237 }
225238 }
226239
@@ -353,9 +366,17 @@ impl<P: PartitionStream> NewAggregateSpiller<P> {
353366 . get_settings ( )
354367 . get_spill_writer_memory_pool_size_mb ( ) ?
355368 . saturating_mul ( BYTES_PER_MIB ) ;
369+ let max_row_groups_per_file = ctx
370+ . get_settings ( )
371+ . get_max_parquet_spill_row_groups_per_file ( ) ?;
356372
357- let payload_writers =
358- AggregatePayloadWriters :: create ( & spill_prefix, partition_count, writer_pool_bytes, ctx) ;
373+ let payload_writers = AggregatePayloadWriters :: create (
374+ & spill_prefix,
375+ partition_count,
376+ writer_pool_bytes,
377+ max_row_groups_per_file,
378+ ctx,
379+ ) ;
359380
360381 Ok ( Self {
361382 memory_settings,
0 commit comments