cab205e9e4
### What changes were proposed in this pull request? For partial hash aggregation (code-gen path), we have two level of hash map for aggregation. First level is from `RowBasedHashMapGenerator`, which is computation faster compared to the second level from `UnsafeFixedWidthAggregationMap`. The introducing of two level hash map can help improve CPU performance of query as the first level hash map normally fits in hardware cache and has cheaper hash function for key lookup. For final hash aggregation, we can also support two level of hash map, to improve query performance further. The original two level of hash map code works for final aggregation mostly out of box. The major change here is to support testing fall back of final aggregation (see change related to `bitMaxCapacity` and `checkFallbackForGeneratedHashMap`). Example: An aggregation query: ``` spark.sql( """ |SELECT key, avg(value) |FROM agg1 |GROUP BY key """.stripMargin) ``` The generated code for final aggregation is [here](https://gist.github.com/c21/20c10cc8e2c7e561aafbe9b8da055242). An aggregation query with testing fallback: ``` withSQLConf("spark.sql.TungstenAggregate.testFallbackStartsAt" -> "2, 3") { spark.sql( """ |SELECT key, avg(value) |FROM agg1 |GROUP BY key """.stripMargin) } ``` The generated code for final aggregation is [here](https://gist.github.com/c21/dabf176cbc18a5e2138bc0a29e81c878). Note the no more counter condition for first level fast map. ### Why are the changes needed? Improve the CPU performance of hash aggregation query in general. For `AggregateBenchmark."Aggregate w multiple keys"`, seeing query performance improved by 10%. `codegen = T` means whole stage code-gen is enabled. `hashmap = T` means two level maps is enabled for partial aggregation. `finalhashmap = T` means two level maps is enabled for final aggregation. ``` Running benchmark: Aggregate w multiple keys Running case: codegen = F Stopped after 2 iterations, 8284 ms Running case: codegen = T hashmap = F Stopped after 2 iterations, 5424 ms Running case: codegen = T hashmap = T finalhashmap = F Stopped after 2 iterations, 4753 ms Running case: codegen = T hashmap = T finalhashmap = T Stopped after 2 iterations, 4508 ms Java HotSpot(TM) 64-Bit Server VM 1.8.0_181-b13 on Mac OS X 10.15.7 Intel(R) Core(TM) i9-9980HK CPU 2.40GHz Aggregate w multiple keys: Best Time(ms) Avg Time(ms) Stdev(ms) Rate(M/s) Per Row(ns) Relative ------------------------------------------------------------------------------------------------------------------------ codegen = F 3881 4142 370 5.4 185.1 1.0X codegen = T hashmap = F 2701 2712 16 7.8 128.8 1.4X codegen = T hashmap = T finalhashmap = F 2363 2377 19 8.9 112.7 1.6X codegen = T hashmap = T finalhashmap = T 2252 2254 3 9.3 107.4 1.7X ``` ### Does this PR introduce _any_ user-facing change? No. ### How was this patch tested? Existing unit test in `HashAggregationQuerySuite` and `HashAggregationQueryWithControlledFallbackSuite` already cover the test. Closes #32242 from c21/agg. Authored-by: Cheng Su <chengsu@fb.com> Signed-off-by: Wenchen Fan <wenchen@databricks.com> |
||
---|---|---|
.. | ||
benchmarks | ||
src | ||
pom.xml |