performance - Hive 联合所有效率和最佳实践

标签 performance hadoop hive hiveql union-all

我有一个 hive 效率问题。我有 2 个大量查询需要过滤、与映射表连接和联合。两个表的所有连接都是相同的。在将连接应用到组合表之前将它们合并,或者将连接分别应用到每个大规模查询然后合并结果会更有效吗?这有什么不同吗?

我尝试了第二种方式,查询运行了 24 小时后才终止它。我觉得我已尽我所能来优化它,除了可能会重新排列 union 语句。一方面,我觉得这应该无关紧要,因为映射表连接的数量或行是相同的,而且由于所有内容都是颚化的,因此应该花费大致相同的时间。另一方面,也许通过先做联合,它应该保证在运行连接之前为两个大查询提供完整的系统资源。话又说回来,这可能意味着一次只有 2 个作业在运行,因此系统没有得到充分利用或其他原因。

我对 hive 及其多线程的工作原理知之甚少。有人有什么想法吗?

最佳答案

没有这样的最佳实践。两种方法都适用。 UNION ALL 中的子查询作为并行作业运行。因此 join before union 将作为具有较小数据集的并行任务工作,tez 可以优化执行并且公共(public)连接表将在每个表的单个映射器阶段只读取一次。 您也可以避免对某些子查询进行连接,例如,如果它们的键不适用于连接。

根据您的设置(例如,每个 reducer 的字节数),加入联合更大的数据集也可以在非常高的并行度下工作,优化器也可以重写查询计划。所以我建议你检查这两种方法,测量速度,学习计划并检查你是否可以改变一些东西。改变、测量、学习计划……重复

更多建议: 在加入之前尝试限制数据集。如果您的联接乘以行,那么分析和聚合在更大的数据集上可能会运行得更慢,如果您可以在联合之前应用分析/聚合,则第一种方法可能更可取。

关于performance - Hive 联合所有效率和最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392599/

相关文章:

performance - 如何在 Atom N270 处理器中禁用预取器

sql-server - NOT IN 与 <> ALL 之间的主要区别是什么?

c++ - 使用 ID 和数组( vector )的性能

c# - 为什么 64 位比 32 位更快?

hadoop - hiveconf参数,可以设置一个值吗?

java - 为什么我们为包含jar的文件夹设置hadoop_classpath才能运行?

sql - 如何获得 Hive 中字符串使用的最大大小?

hadoop - 无法以非 sudo 用户身份写入 HDFS

python - 如何通过 Python 访问 Hive?

Hive SQL 提取两个非字母数字字符之间不同长度的字符串