首页 > 解决方案 > 删除 Hive 表和 msck 修复失败,表存储在谷歌云存储桶中

问题描述

我正在使用下面的 SQL 语句在 Google Cloud Bucket 中创建配置单元表。

CREATE TABLE schema_name.table_name (column1 decimal(10,0), column2 int, column3 date) 
   PARTITIONED BY(column7 date) STORED AS ORC
   LOCATION 'gs://crazybucketstring/' 
   TBLPROPERTIES('ORC.COMPRESS'='SNAPPY');

然后我使用命令将数据加载到该表中distcp,现在当我尝试删除表时它会失败并显示以下错误消息,即使我尝试删除空表它也会失败。

hive>>DROP TABLE schema_name.table_name; 

**Error:** Error while processing statement: 
FAILED: Execution Error, return code 1 from 
org.apache.hadoop.hive.ql.exec.DDLTask.MetaException
(message:java.lang.IllegalArgumentException: `hadoopPath must not be null`)
(state=08S01,code=1)

我还使用命令从 Google Cloud Storage 存储桶中删除了文件,gsutil rm -r gs://但仍然无法删除表并给出相同的错误

同样在运行msck repair table时出现以下错误。

FAILED: 
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask (state=08S01,code=1) 

任何想法可能有什么问题?

标签: hadoopgoogle-cloud-platformhivegoogle-cloud-storage

解决方案


该问题与存储桶位置有关。我将尝试逐步解释如何重新创建它以及如何解决它。同样的问题也导致无法运行msck repair命令。

如何重新创建它:

  1. 首先,我创建了一个表(T1),其位置指向此处给出的存储桶:
    LOCATION 'gs://crazybucketstring/'

  2. 然后我在子文件夹中创建了另一个表(T2)内部存储桶,位置如下所示
    LOCATION gs://crazybucketstring/schemname/tableaname/

  3. 现在,当我尝试删除第一个表(T1)时,它会抛出错误,因为整个存储桶都表现得像表一样,它不能删除存储桶,它只能删除文件。

  4. 当我尝试删除表(T2)时,我可以删除它,并且存储桶子目录中的文件也被删除,因为它是托管表。T1表还是很头疼的。

为了不顾一切地删除表 T1,我使用gsutil rm -r命令清空了存储桶并尝试了msck repair table tablename奇怪的msck repair命令失败,并显示以下错误消息

>>  msck repair table tablename
Error: Error while processing statement: FAILED: 
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask (state=08S01,code=1)

像往常一样, DROP 命令仍然不起作用。

解决方案:

最终我得到了这个有效的想法。

  1. 我更改了表 T1 并将其位置设置为存储桶内的子目录,而不是裸存储桶。
    ALTER TABLE TABLENAME SET LOCATION gs://crazybucketstring/schemname/tableaname/
  2. 现在我做'msck repair',它不会抛出任何错误。
  3. 我发出了 DROP Table 命令并且它起作用了。

这个问题与表位置有关,在同一个存储桶中创建多个表时,我们应该小心处理。最佳实践是在存储桶中使用不同的子目录来创建不同的表,并避免仅使用存储桶路径作为表位置,特别是如果您必须在同一个存储桶中创建多个表。谢谢您,如有大数据问题,请随时与联系。


推荐阅读