【问题标题】:Bucketing not optimized in Hive未在 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。

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

【问题讨论】:

    标签: hadoop hive bigdata


    【解决方案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数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    相关资源
    最近更新 更多