具有 15 个表连接的 Hive 查询预计将生成 10 亿条记录,在 3 个数据节点上,每个 16GB RAM 这是正确的方法吗?

Hive query having 15 tables join is expected to generate 1 Billion records, on 3 datanodes, 16GB RAM each Is this the right way to do?

我叫维塔尔

Amazon 上的 Hortonworks HDP 2.4 集群是 3 个数据节点,在不同的实例上管理。 7 个实例,每个实例 16GB RAM。 总计 1TB 硬盘 Space 3个数据节点 Hadoop 版本 2.7

我已将数据从 Postgres 提取到 Hadoop 分布式环境中。 Data为15Tables,其中4tables有1500万条记录,其余为Master。 我将它们拉入 HDFS,压缩为 ORC 和 SnappyCodec。使用架构创建了 Hive 外部 Tables。

现在我正在触发一个查询,它连接所有 15 个 table 并选择我在最终平面 table 中需要的列。预计记录超过15亿。

我优化了 Hive、Yarn、MapReduce Engine 即。并行执行、向量化、优化连接、小型 Table 条件、堆大小等

查询在 Cluster/Hive/Tez 上 运行 自 20 小时以来,它已达到 90%,最后一个减速器是 运行。很久以前就达到了 90%,就像 18 小时后它一直停留在 90%。

我的做法正确吗?

据我所知,您已经有效地将原始形式的表从 RDBM 复制到 Hadoop 中,以便在一个或多个新表中创建扁平化视图。您正在使用 Hive 来执行此操作。所有这些听起来都不错。

为什么要花这么长时间,有多种可能,但我想到了几种。

首先,YARN 将分配映射器和缩减器将用于 运行 查询的并行部分的容器(通常每个 CPU 核心一个)。这应该允许您利用所有可用的资源。

我使用 Cloudera,但我假设 Hortonworks 也有类似的工具,可以让您查看正在使用的容器数量、Hive 创建的映射器和缩减器数量,等等。您应该会看到大部分或所有可用的 CPU 都在不断使用。作业应该以某种合理的速度完成(也许每分钟,或每 15 分钟)。根据查询的不同,Hive 通常能够将其分解为不同的 "stages",这些 "stages" 与其他查询不同地执行,然后在最后重新组合。

如果是这种情况,一切可能都很好,但您的集群可能资源不足。但在您针对该问题投入更多 AWS 实例之前,请考虑查询本身。

首先,Hive 有几个对优化性能必不可少的工具,最重要的是分区。创建表时,您应该找到一些方法将生成的数据集划分为大致相等的子集。一种常见的方法是使用日期,例如年+月+日(可能是 20160417),或者如果您希望有很多历史数据,可能只是年+月。这也将允许您显着优化可以受日期限制的查询。我似乎记得 Hive(或者可能是 YARN)会将分区分配给不同的容器,所以如果您没有看到所有工作人员都在工作,那么这可能是一个原因。在 CREATE TABLE 语句中使用 PARTITIONED BY 子句。

选择日期之类的原因可能是您的数据随时间(日期)的分布相对均匀。我们在早期实施中选择 customer_id 作为分区键,但随着我们的成长,我们的客户也在成长。数百个小客户会在几分钟内完成,然后数百个中型客户会在一个小时内完成,然后我们几个最大的客户需要 10 个小时或更长时间才能完成。我们会在第一个小时内看到集群的完全利用,然后只有几个容器在为最后几个客户使用。不好。

这种现象被称为"data skew",因此您要谨慎选择分区以避免倾斜。有一些涉及 SKEW BYCLUSTER BY 的选项可以帮助处理您可以考虑的大小均匀或更小的数据文件。

请注意,原始导入数据也应进行分区,因为分区就像 RDBMS 中的索引一样,因此对性能很重要。在这种情况下,选择使用较大查询加入的键的分区。有多个分区是可能的并且很常见,因此基于日期的顶级分区,在连接键上有一个子分区可能会有所帮助......也许......取决于你的数据。

我们还发现优化查询本身非常重要。 Hive 有一些提示机制可以将它定向到 运行 不同的查询。虽然与 RDBMS 相比相当初级,但 EXPLAIN 对于理解 Hive 将如何分解查询以及何时需要扫描完整数据集非常有帮助。解释输出很难阅读,所以请熟悉 Hive 文档:-)。

最后,如果您不能让 Hive 以合理的方式做事(如果它的优化器仍然导致阶段不平衡),您可以创建中间表并使用额外的 Hive 查询 运行s 来创建一个在构建最终数据集之前部分转换数据集。这看起来很昂贵,因为您要添加额外的写入和读取新表,但在您描述的情况下,它总体上可能要快得多。此外,有时使用中间表来测试或采样数据很有用。

编写 Hive 不像编写常规软件那样 — 在大多数情况下,您可以很快完成 Hive 查询。在某些情况下,我们需要尝试 10 或 15 次才能快速达到 运行。祝你好运,希望对你有所帮助。