Trafodion是一款建立于hadoop/hbase之上的SQL引擎,借助于HBase的预分区的概念,Trafodion可以在建表的时候定义表根据主键(全部或部分字段)使用Hash方式进行预分区,语法为”SALT USING N PARTITIONS [ON (…)]”
使用预分区的好处不言而喻,一方面可以使数据加载到集群时均匀分散在不同的RegionServer上,另一方面当数据均匀分散在不同节点后可以很好的避免查询时的热点效应,这非常有利于大数据量的OLAP查询性能的提升,即可以使用多ESP并发扫描分布在不同节点上的数据。
分区的字段可以是在主键的所有字段,也可以是主键的一部分,不带”[ON (…)]”时则表示默认以主键的所有字段进行Hash分区。
选择合适的分区字段,对数据是否均匀打散起着至关重要的作用,如果数据不能按照分区字段均匀分布,那么数据加载、查询等性能均会受限于性能较慢的那些节点,从而拖慢了整体的性能。
对于数据分布是否均匀的问题,我们可以使用hash2partfunc来检查数据是否分布均匀,如果是用Load从Hive表向Trafodion导入数据,可以使用此方法在数据未导入Trafodion之前就可以创建的Trafodion表是否合适。
事例如下,
select hash2partfunc(FLAG, DATATIME for 3), count(*) from hive.hive.TEST group by 1 order by 2;
(EXPR) (EXPR)
---------- --------------------
2 19009975
0 19014216
1 19021797
通过以上事例可以发现,hash2partfunc的用法大致如下,
hash2partfunc(partition_key1, partition_key2,... for partition_number)
如果数据已经在Trafodion表中,如果我们发现表上的数据加载或查询等性能不好的时候,也可以使用此函数分析是否有数据倾斜,如果有,可以选择合适的分区字段重新建表,并把老表的数据Load到新表中。