gpt4 book ai didi

hadoop - 强制缩小阶段或第二张贴图减少 hive 中的工作

转载 作者:行者123 更新时间:2023-12-02 20:08:31 24 4
gpt4 key购买 nike

我正在运行以下形式的配置单元查询:

INSERT OVERWRITE LOCAL DIRECTORY ...
SELECT /*+ MAPJOIN(...) */ * FROM ...

由于 MAPJOIN,结果不需要reduce阶段。 map 阶段使用大约5000个映射器,最终大约需要 50分钟来完成工作。事实证明,大部分时间都花在将那5000个文件复制到本地目录上。

为了优化这一点,我用 SELECT * ...替换了 SELECT DISTINCT * ...(我事先知道我的结果已经是不同的了,所以这实际上并没有改变我的结果),以便强制执行第二次map简化工作。第一个map化简作业与以前相同,有5000个mappers和0 reducer。第二个map reduce作业现在具有5000个mappers和3个reducer。进行此更改后,现在仅要复制3个文件,而不是5000个文件,而查询现在总共只需要大约 20分钟

由于我实际上并不需要 DISTINCT,所以我想知道是否可以在不使用 DISTINCT的情况下以较少的混淆方式优化查询?

最佳答案

如何用另一个SELECT以及可能无用的WHERE子句来包装查询,以确保它启动工作。

INSERT OVERWRITE LOCAL DIRECTORY ...
SELECT *
FROM (
SELECT /*+ MAPJOIN(...) */ *
FROM ..
) x
WHERE 1 = 1

明天有机会时,我将运行它,如果不起作用,请删除答案的这一部分。如果您能在我之前得到它,那就太好了。

另一种选择是利用 virtual columns作为文件名和行号来强制执行不同的结果。这使查询变得复杂,并引入了两个无意义的列,但具有的优点是您不再需要事先知道结果将是不同的。如果您不能遵守无用的列,请将其包装在另一个SELECT中以将其删除。
INSERT OVERWRITE LOCAL DIRECTORY ...
SELECT {{enumerate every column except the virutal columns}}
FROM (
SELECT DISTINCT /*+ MAPJOIN(...) */ *, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE
FROM ..
) x

两种解决方案都比您想出的要更笨拙,但是具有的优势是您不仅限于结果不同的查询。

如果您不仅限于Hive,我们还有另一个选择。您可以摆脱 LOCAL并将结果写入HDFS,即使使用5000个映射器,该结果也应该很快。然后使用 hadoop fs -getmerge /result/dir/on/hdfs/将结果拉入本地文件系统。不幸的是,这超出了Hive的范围,但是对于您的用例而言,可以设置两步的Oozie工作流程是可以接受的。

关于hadoop - 强制缩小阶段或第二张贴图减少 hive 中的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com