未在 Hive 中优化分桶

Posted

技术标签:

【中文标题】未在 Hive 中优化分桶【英文标题】:Bucketing not optimized in Hive 【发布时间】:2016-10-09 11:18:39 【问题描述】:

我已经根据列 flightnum(10 个桶)对表进行了分桶,数据大小约为 700MB,也强制执行分桶。

当我执行查询时: select count(flightnum) from flight_buck where flightnum=10; 在大约 46 秒内得到响应。映射器总数为 27。

在具有相同数据的非分桶表上执行相同查询时: select count(flightnum) from flight_temp where flightnum=10; 在大约 47 秒内得到响应。使用的映射器总数为 30。

为什么我在相同的时间内得到响应?

【问题讨论】:

【参考方案1】:

Bucketing 有助于加快连接速度,提高使用分区表的简单 SELECT 速度。 尝试按 flightnum 对表进行分区并再次运行选择。

为什么会这样?

让我们像这样创建一个分桶的未分区表:

create table `t1b`( 
  `exchange` string,
  `stock_symbol` string,
  `date` string,
  `stock_price_open` float,
  `stock_price_high` float,
  `stock_price_low` float,
  `stock_price_close` float,
  `stock_volume` int,
  `stock_price_adj_close` float)
clustered by ( `stock_symbol` ) sorted by ( `date` ) into 306 buckets;

让我们用数据填充它... 有多少桶一样多的减速器,因为每个减速器将只处理具有相同键的记录,并将使用您喜欢的排序将数据存储到其文件中,在这种情况下按日期

让我们看看 HDFS...

请注意我们得到了什么.. 306 个文件(桶)...

在它们每个内部都有具有相同聚类键的记录...

但是所有文件都在同一个文件夹中,当使用 hive 进行 SELECT 时,无法了解哪些文件包含我们正在寻找的值,因此没有分区的分桶不会加快选择速度,因为没有关于我们要查找的数据在哪里。

分桶有什么作用?当您加入数据时,可以将整个存储桶加载到 RAM 中,我们可以在 MAP 中进行快速加入,而不是在 REDUCE 中进行慢速加入。

【讨论】:

感谢您的回复。 但是如果我们使用带有分区的分桶,它将如何加快响应速度?加速只能通过分区来完成,我猜。 桶可以提高加入速度。直觉是每个桶的大小都很小,并且所有记录都具有相同的键。当组合器在映射阶段运行时,它可以完全加载到 ram 中。这提高了连接速度。你知道:当你加入表时,你正在寻找具有相同键的记录。分区和存储桶有助于 map reducer 作业的不同阶段。 Combiner 是一个小reducer,只能处理本地数据,可以join数据。

以上是关于未在 Hive 中优化分桶的主要内容,如果未能解决你的问题,请参考以下文章

Hive(10):Hive分桶表

Hive与优化方法

Hive与优化方法

Hive与优化方法

Hive 中推荐的优化技术都有哪些?

Hive入门函数提升