首页 > 解决方案 > 如何将分区添加到在 Amazon EMR 中运行的 Presto 中的分区表?

问题描述

我在 EMR 5.19.0 中运行 Presto 0.212,因为 AWS Athena 不支持 Presto 支持的用户定义函数。我正在使用配置为使用胶水模式的 EMR。我有预先存在的 Parquet 文件,这些文件已经在 S3 中以正确的分区格式存在。

最近的 Presto 版本似乎删除了创建和查看分区的功能。这就提出了一个问题:如何添加单独的分区?我可以在 AWS 中使用 Athena 控制台并运行MSCK REPAIR mytable;并正确创建分区,然后我可以使用 Presto CLI 或 HUE 成功查询。但是,我如何在 Presto 中做到这一点?

如果我presto-cli在 EMR 主节点上尝试这个:

use hive.default;
INSERT INTO "mytable$partitions" VALUES (2018, 9, 20)

我收到一条错误消息

java.sql.SQLException: Query failed (#20181113_172115_00004_yywie): com.facebook.presto.connector.system.SystemTableHandle cannot be cast to com.facebook.presto.hive.HiveTableHandle

(请注意,我使用defaultGlue 中的数据库来存储模式。这就是“默认”的来源。)

在 Presto 中执行此操作的旧方法最近都已被删除(alter table mytable add partition (p1=value, p2=value, p3=value)或者INSERT INTO TABLE mytable PARTITION (p1=value, p2=value, p3=value),例如),尽管在它出现的测试中仍然可以找到。他们不工作。如果我尝试在 HUE 或 Presto CLI 中执行此类查询,则会出现错误。

但是,在 Presto CLI 中,我可以查看存在的分区,在 EMR 主节点上输入以下查询:

use hive.default;
select * from "mytable$partitions";

最初,查询结果是空的,因为当然不存在分区。如果我在 Athena 中手动运行 MSCK REPAIR 来创建分区,那么该查询将显示所有已创建的分区。

如果我尝试在 EMR 主节点上使用 HIVE CLI,它就不起作用。

use default;
ALTER TABLE mytable
    ADD PARTITION (p1=2018, p2=9, p3=20)
    location 's3://bucketname/rootfolder/p1=2018/p2=9/p3=20/';

FAILED: SemanticException [Error 10001]: Table not found mytable

那么...如何使用 Presto-CLI,或使用 HUE,甚至使用 Hive CLI,将分区添加到存储在 S3 中的分区表中?既然 Presto 已经去掉了这样做的能力,那它应该怎么做呢?试图遵循前面的例子,比如这个是行不通的。

虽然“MSCK REPAIR”有效,但这样做的成本很高,并且会导致完整的 S3 扫描。我更愿意单独添加分区,而不是扫描整个 S3 存储桶来查找现有分区,尤其是在将一个新分区添加到已经存在的大表时。

我还在Using the AWS Glue Data Catalog as the Metastore for Hive页面上注意到了这句话:

我们建议通过 Amazon EMR 使用应用程序创建表,而不是直接使用 AWS Glue 创建表。通过 AWS Glue 创建表可能会导致必填字段缺失并导致查询异常。

在 EMR 中必须有一种方法可以做到这一点。它是什么?

标签: hiveamazon-emrparquetprestohadoop-partitioning

解决方案


事实证明,EMR 中的 Hive 和 Presto 需要单独配置才能使用 Glue 目录。因此,需要修改我的 AWS CLI 脚本以包含每个能够执行此操作的配置。配置最终看起来像这样:

--configurations '[
                    {
                      "Classification": "presto-connector-hive",
                      "Properties": { "hive.metastore.glue.datacatalog.enabled": "true" },
                      "Configurations":[]
                    },
                    {
                      "Classification": "hive-site",
                      "Properties": { "hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" }
                    }
                  ]'

看起来当前的 Presto 版本无法直接创建或查看分区,但 Hive 可以。我的问题是 Hive 未配置为查看 Glue 目录。一旦我解决了这个问题,Hive 就能够使用如下语句创建分区

ALTER TABLE mytable ADD IF NOT EXISTS
    PARTITION (p1=2018, p2=9, p3=18)
    PARTITION (p1=2018, p2=9, p3=19)
    PARTITION (p1=2018, p2=9, p3=20);

推荐阅读