GreenPlum 如何处理多个大型连接和同时工作负载?
Posted
技术标签:
【中文标题】GreenPlum 如何处理多个大型连接和同时工作负载?【英文标题】:How does GreenPlum handle multiple large joins and simultaneous workloads? 【发布时间】:2017-11-19 18:15:40 【问题描述】:我们的产品是从我们的数据库中提取的,它们的文件格式可以大到 300GB+。为了实现这一点,我们连接了多个大表(在某些情况下,表的大小接近 1TB)。我们不汇总数据周期,它是纯提取物。 GreenPlum 如何处理这类大型数据集(连接键是 3+ 列键,并且不是每个表都有相同的键来连接,唯一的公共键是第一个键,如果数据将由它分配,那么将有由于数据本身不平衡,因此存在很多偏差)。
【问题讨论】:
【参考方案1】:您应该对这些类型的大型数据提取使用可写外部表,因为它可以利用 gpfdist 并并行写入数据。它会非常快。
https://gpdb.docs.pivotal.io/510/ref_guide/sql_commands/CREATE_EXTERNAL_TABLE.html
此外,您的用例并没有真正表明存在偏差。偏斜将通过像性别代码这样的不良列选择来存储数据,或者在您按一列或几列过滤时处理偏斜,其中只有少数段具有数据。
【讨论】:
【参考方案2】:一般来说,Greenplum 数据库可以很好地处理这种负载。查询在段上并行执行。
您的瓶颈很可能是从数据库中的最终导出——如果您使用 SQL(或 COPY),则一切都必须通过主服务器到客户端。这需要时间,而且速度很慢。
正如 Jon 指出的那样,考虑使用外部表,并在查询出来时写出数据。如果可能,还要避免在查询中进行任何类型的排序操作。这是不必要的,因为数据在外部表文件中未排序。
【讨论】:
我不明白的是假设你有 4 个节点,让我们说为了简单起见,有 2 个大表并且它们分布在不同的键上,两个表数据都拆分到 4 个节点,表大小相似,都是 500GB 如果数据分布不均,您将遭受性能下降的困扰,因为一个或几个段必须完成大部分工作。对于您示例中的连接,需要将一个表中的数据发送到其他段才能进行连接。这通过互连并行发生 - 除非两个表具有相同的分布键,否则连接发生在本地。以上是关于GreenPlum 如何处理多个大型连接和同时工作负载?的主要内容,如果未能解决你的问题,请参考以下文章