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