如何通过trace判断hash分布导致数据倾斜
采用hash划分算法时,分给各个线程的数据量可能不成比例,若从trace里发现某个线程明显过多时,可手动改相应的算法,下例取自Feature #36614,是hybrid hash join出现倾斜
09:12:44 traverse dim: 131074 tuples, match dim: 131074 tuples
09:12:44 traverse tuple: total_size = 5, key_size = 1, tuple_size = 4, other_size = 0, pseudo_size = 0
09:12:44 match tuple: total_size = 1, key_size = 1, tuple_size = 0, other_size = 0, pseudo_size = 0
09:12:44 divide to 3 blocks(using round-robin): 65536, 65536, 2. 数据划分3份,即用3个线程来创建hash表
09:12:44 Hybrid hash join: data will be split into 1 partitions 所有数据可以在一轮完成 (1 partitions )
09:12:44 traverse dim: 131074 tuples, match dim: 65536 tuples
09:12:44 traverse dim: 131074 tuples, match dim: 65536 tuples
09:12:44 traverse dim: 131074 tuples, match dim: 2 tuples
09:12:44 BEGIN hybrid hash join: partition(-1/1): traverse dim: 131074 tuples, match dim: 131074 tuples
09:12:44 ( 2)Sub 0: use 524288+0; buckets: total 131072, use 0, avg 0.00, longest 0; rows: add 0 创建了四个子hash表,其中一个avg=0
09:12:44 ( 2)Sub 1: use 524288+393216; buckets: total 131072, use 1, avg 32768.00, longest 32768; rows: add 32768 另外一个平均冲突链达到了32768
09:12:44 ( 2)Sub 2: use 524288+0; buckets: total 131072, use 0, avg 0.00, longest 0; rows: add 0
09:12:44 ( 2)Sub 3: use 524288+786456; buckets: total 131072, use 3, avg 21846.00, longest 32768; rows: add 65538
09:12:44 ( 0)Match: scanned 2 rows, and produced 10925 rows already. 第一个很快,这条trace后长时间不更新
09:14:50 ( 2)Match: scanned 65536 rows, and produced 1610623661 rows already. 后面由于冲突链太长(avg,longest太大)很慢
09:15:06( 1)Match: scanned 65536 rows, and produced 1610623658 rows already.
在trace卡住阶段还可以用 sudoperf top 命令观察
若某个函数长时间大于5%,甚至大于10%,就说明卡在这里, 这个例子卡在了hash冲突链遍历。
Samples: 611K of event 'cycles', Event count (approx.): 34603644864
Overhead Shared Object Symbol
16.27% gbased [.] DumpableHashTable::IterateNext hash表遍历下一个冲突链
14.24% gbased [.] BlockedRowMemStorage::GetRow
10.87% gbased [.] Filter::Reset
8.06% gbased [.] DumpableHashTableIterator::FindNext
gbase> select count(*) from t1 A left join t1 B on A.i = B.i;
+------------+
| count(*) |
+------------+
| 3221258244 |
+------------+
1 row in set (Elapsed: 00:01:53.15)
换成RR算法后
gbase> set _gbase_hybrid_hash_join=1;
gbase> select count(*) from t1 A left join t1 B on A.i = B.i;
+------------+
| count(*) |
+------------+
| 3221258244 |
+------------+
1 row in set (Elapsed: 00:02:17.59)
热门帖子
- 12025-12-01浏览数:182764
- 22023-05-09浏览数:25062
- 42023-09-25浏览数:18526
- 52020-05-11浏览数:17529