Hive 压缩数据,按数据聚类,按数据排序

Posted

技术标签:

【中文标题】Hive 压缩数据,按数据聚类,按数据排序【英文标题】:Hive compressed data, cluster by data and order by data performance 【发布时间】:2017-11-20 06:08:53 【问题描述】:

我有几个关于 Hive 性能的问题。

我在网上某处读到压缩数据(尤其是 ORC,特别是 Snappy)会在读取数据方面带来更好的性能。 此外,如果我使用 order by 将数据加载到表中,则会导致 1 个大文件,这可能会降低读取可用性。 因此,实现与 order by 相同效果的另一种方法是使用 cluster by,它会创建多个小文件。

我对压缩数据进行了实验,按数据进行聚类并按数据排序以查看它们的性能。 目前,我有 5 个数据节点和 1 个名称节点。 加载到每个表中的数据文件约为 19GB+(200 万+条记录)

我使用以下查询创建了我的 orc snappy 压缩表:

CREATE EXTERNAL TABLE orc_t (....)
STORED AS ORC
LOCATION '...'
TBLPROPERTIES(orc.compress="SNAPPY")

当我看到每张桌子的表现时,我非常迷茫和困惑。 我运行的查询是:

SELECT * FROM orc_t WHERE date_format(st_time, 'yyyy-MM-dd') = '2017-05-20'
压缩数据耗时 2m 45sec 按数据分组耗时 43 秒 按数据排序 43 秒

似乎压缩数据花费的时间最长,并且按数据聚类似乎并没有显着优于按数据排序的性能。

会不会是我的 5 个数据节点有足够的读取能力,以至于解压实际上会降低性能? 还是我的样本数据不够大? 我错过了什么吗?

请问有哪位高手能指教一下吗?

【问题讨论】:

您将数字与什么进行比较?顺便说一下,用 Zlib 压缩试试 ORC 嗨 cricket_007,很高兴再次见到你!我正在做一个示例查询,它将我的 st_time(时间戳)与指定的日期(以 yyyy-MM-dd 格式)进行比较。 我还想问一下为什么按数据聚类(多文件数据)比按数据排序(单个大文件数据)没有显着的性能?是因为我的数据节点提高了它的性能吗? 您的查询没有cluster byorder by。如果您的硬件有上限,那么是的,这会带来性能损失。 嗨 cricket_007,让我重新表述我的问题:为什么当我执行示例时,多个小数据文件(大小约为 256MB)与单个大数据文件(大小约为 19GB+)相比没有显着的性能query (SELECT * FROM t WHERE date_format(st_time, 'yyyy-MM-dd') = '2017-05-20'; 多个小数据文件不应该比单个大数据文件有一些性能优势吗? 【参考方案1】:

当我执行示例查询 (SELECT * FROM t WHERE date_format(st_time, 'yyyy- MM-dd') = '2017-05-20';

您仍在扫描所有数据以查找数据中的单个值。因此必须全部解压。您还选择了所有列,因此使用 ORC 没有明显的好处。

多个小数据文件不应该比单个大数据文件有一些性能优势吗?

应该,但如果不是这种情况,则初始输入文件很可能能够适当地分块为 mapreduce 输入拆分,并且磁盘 IO 不是阻塞因素。

Snappy 或 Zlib 压缩只是节省空间,而不是优化速度。

如果您想提高速度,请根据您将经常使用的查询模式对数据进行分区

【讨论】:

以上是关于Hive 压缩数据,按数据聚类,按数据排序的主要内容,如果未能解决你的问题,请参考以下文章

按中心和半径对圆的数据进行聚类

SQL- 基础知识梳理 - 索引

如何在python中按条件应用聚类

教程 | 如何为时间序列数据优化K-均值聚类速度?

按周对多个特征进行聚类

聚类算法数据分析