未在 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 中优化分桶的主要内容,如果未能解决你的问题,请参考以下文章