问题现象:在hive的分区表中删除了分区,命令执行返回成功,但是hdfs上对应的分区目录却没有删除。
执行删除分区的操作,命令返回成功,元数据中也不存在该分区。
代码语言:javascript复制hive> alter table default.logs drop partition (dt="2022",country="guangzhou") ;
OK
Time taken: 0.052 seconds
hive> show partitions default.logs ;
OK
dt=2022/country=beijing
dt=2022/country=wuhan
查看对应的目录,发现分区dt=2022/country=guangzhou并没有删除掉,正常情况下分区目录是会被删除的。
代码语言:javascript复制hadoop fs -ls /usr/hive/warehouse/logs/dt=2022/
Found 3 items
drwxr-xr-x - hadoop supergroup 0 2022-12-06 19:17 /usr/hive/warehouse/logs/dt=2022/country=beijing
drwxr-xr-x - hadoop supergroup 0 2022-12-06 20:02 /usr/hive/warehouse/logs/dt=2022/country=guangzhou
drwxr-xr-x - hadoop supergroup 0 2022-12-06 19:14 /usr/hive/warehouse/logs/dt=2022/country=wuhan
问题原因:要删除的分区目录不在元数据中。因为要删除的分区目录dt=2022/country=guangzhou是其他程序拉取数据生成的,正常情况下,生产数据后是要进行元数据同步(msck repair table 表名 ;),但是该分区目录生成后没有进行分区修复操作来同步元数据。导致元数据中并没有该目录的路径对应的分区,所以删除该分区时候无法删除掉该目录。
解决方案:修复分区同步元数据,再删除该目录。
代码语言:javascript复制hive> msck repair table default.logs ;
OK
Partitions not in metastore: logs:dt=2022/country=guangzhou
Repair: Added partition to metastore logs:dt=2022/country=guangzhou
Time taken: 0.07 seconds, Fetched: 2 row(s)
hive> alter table default.logs drop partition (dt="2022",country="guangzhou") ;
Dropped the partition dt=2022/country=guangzhou
OK
Time taken: 0.078 seconds
此时,对应的分区目录被删除
代码语言:javascript复制[hadoop@172 ~]$ hadoop fs -ls /usr/hive/warehouse/logs/dt=2022/
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2022-12-06 19:17 /usr/hive/warehouse/logs/dt=2022/country=beijing
drwxr-xr-x - hadoop supergroup 0 2022-12-06 19:14 /usr/hive/warehouse/logs/dt=2022/country=wuhan