使用 Presto + Hive 删除分区的最佳方法
Best way to Drop Partitions using Presto + Hive
我们有一个 Amazon EMR 集群 (v5.19.0),我们在其中使用 Presto (v0.212) 而不是 Hive (v2.3.2) 来处理数据。当题目是数据读写的时候,它就是个怪物,什么都做的相当快。
另一方面,我对数据排除选项感到非常沮丧。互联网上有很多关于数据访问和写入的帖子,但几乎没有关于数据删除的基本用例。以下是我尝试使用的一些方法:
Presto delete statement,似乎随机失败。它适用于小表,但它开始为其他表引发随机异常(其中大多数与正在删除的丢失文件有关)。我们计划尽快更新 EMR 版本以查看此问题是否会停止,但暂时不可靠(或者我们配置有误);
Hive 删除分区语句。这个出奇的慢。对于更大的表(超过 4000 个分区),删除引用 empty/deleted 文件夹的分区需要几分钟时间。我真的不明白这个命令怎么会这么慢;
Amazon S3/HDFS RMDIR 命令。其实我们用的就是这个,不到一秒就可以删除分区
当我们使用 Presto 查询访问数据时,最后一种方法似乎工作正常。但是,我们注意到分区仍然存在于 Hive Metastore 上,这使得 Hive 在尝试执行任何查询并增加其上的分区数量时引发异常。由于 Hive 删除分区的速度非常慢,我们不知道如何保持 Metastore 干净并有一个快速的过程。
在 Hive 文档中有一个关于 MSCK REPAIR TABLE command 的部分,其中包含一个用于删除丢失分区的选项。遗憾的是,当我尝试使用 "DROP PARTITIONS" 参数在我的终端上 运行 它时,它显示错误消息 "FAILED: ParseException line 1:34 missing EOF at 'drop' near 'TABLENAME'"。所以我认为我的 Hive 版本不兼容或者存在错误。
那么,您知道使用像我这样的配置在真实系统上删除分区的好方法吗?请告诉我如何删除大数据管道上的数据,看看我是否能找到解决我的问题的灵感。如果您知道仅从 Hive 中删除分区引用或列出数据已删除的所有分区的方法,也请告诉我。谢谢!
尝试使用 ALTER TABLE table_name RECOVER PARTITIONS;
而不是 MSCK REPAIR TABLE
命令。它应该在 AWS 上运行良好。
正如您观察到的,如果您在 S3 或 HDFS 上删除分区数据(文件和目录),分区仍然需要从 Hive 元存储中注销。
将存储状态与 Metastore 状态同步的 Hive 方式是 MSCK REPAIR TABLE
。
将存储状态与 Metastore 状态同步的 Presto 方式是 system.sync_partition_metadata
Presto Hive connector procedure。
在此处包括有关我如何解决此问题的更多详细信息。请注意,如果可能,请避免使用此解决方案并使用数据处理工具中的删除功能。
- 首先,尽可能使用Hive
ALTER TABLE table_name DROP PARTITION(...
语句;
- 如果速度太慢,请使用分区键字段使用
aws s3 rm
或 hadoop fs -rm
; 等命令删除分区文件夹
- 最后,在 Hive 上,将您的 table 转换为外部 table 只是为了更快地清理它的元数据,因为在上一步中您已经删除了它的数据:
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='TRUE');
ALTER TABLE tablename DROP PARTITION(...
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');
如果您使用更新的 Presto,还请查看此答案的 以查看删除分区的好方法。
我们有一个 Amazon EMR 集群 (v5.19.0),我们在其中使用 Presto (v0.212) 而不是 Hive (v2.3.2) 来处理数据。当题目是数据读写的时候,它就是个怪物,什么都做的相当快。
另一方面,我对数据排除选项感到非常沮丧。互联网上有很多关于数据访问和写入的帖子,但几乎没有关于数据删除的基本用例。以下是我尝试使用的一些方法:
Presto delete statement,似乎随机失败。它适用于小表,但它开始为其他表引发随机异常(其中大多数与正在删除的丢失文件有关)。我们计划尽快更新 EMR 版本以查看此问题是否会停止,但暂时不可靠(或者我们配置有误);
Hive 删除分区语句。这个出奇的慢。对于更大的表(超过 4000 个分区),删除引用 empty/deleted 文件夹的分区需要几分钟时间。我真的不明白这个命令怎么会这么慢;
Amazon S3/HDFS RMDIR 命令。其实我们用的就是这个,不到一秒就可以删除分区
当我们使用 Presto 查询访问数据时,最后一种方法似乎工作正常。但是,我们注意到分区仍然存在于 Hive Metastore 上,这使得 Hive 在尝试执行任何查询并增加其上的分区数量时引发异常。由于 Hive 删除分区的速度非常慢,我们不知道如何保持 Metastore 干净并有一个快速的过程。
在 Hive 文档中有一个关于 MSCK REPAIR TABLE command 的部分,其中包含一个用于删除丢失分区的选项。遗憾的是,当我尝试使用 "DROP PARTITIONS" 参数在我的终端上 运行 它时,它显示错误消息 "FAILED: ParseException line 1:34 missing EOF at 'drop' near 'TABLENAME'"。所以我认为我的 Hive 版本不兼容或者存在错误。
那么,您知道使用像我这样的配置在真实系统上删除分区的好方法吗?请告诉我如何删除大数据管道上的数据,看看我是否能找到解决我的问题的灵感。如果您知道仅从 Hive 中删除分区引用或列出数据已删除的所有分区的方法,也请告诉我。谢谢!
尝试使用 ALTER TABLE table_name RECOVER PARTITIONS;
而不是 MSCK REPAIR TABLE
命令。它应该在 AWS 上运行良好。
正如您观察到的,如果您在 S3 或 HDFS 上删除分区数据(文件和目录),分区仍然需要从 Hive 元存储中注销。
将存储状态与 Metastore 状态同步的 Hive 方式是 MSCK REPAIR TABLE
。
将存储状态与 Metastore 状态同步的 Presto 方式是 system.sync_partition_metadata
Presto Hive connector procedure。
在此处包括有关我如何解决此问题的更多详细信息。请注意,如果可能,请避免使用此解决方案并使用数据处理工具中的删除功能。
- 首先,尽可能使用Hive
ALTER TABLE table_name DROP PARTITION(...
语句; - 如果速度太慢,请使用分区键字段使用
aws s3 rm
或hadoop fs -rm
; 等命令删除分区文件夹
- 最后,在 Hive 上,将您的 table 转换为外部 table 只是为了更快地清理它的元数据,因为在上一步中您已经删除了它的数据:
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='TRUE');
ALTER TABLE tablename DROP PARTITION(...
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');
如果您使用更新的 Presto,还请查看此答案的