Hive分区数过多导致删除表失败
问题现象
Hive创建的二级分区表有两万多个分区,导致用户在执行truncate table ${TableName},drop table ${TableName}时失败。
原因分析
删除文件操作是单线程串行执行的,Hive分区数过多导致在元数据数据库会保存大量元数据信息,在执行删表语句时删除元数据就要用很长时间,最终在超时时间内删除不完,就会导致操作失败。
超时时间可通过登录FusionInsight Manager,选择“集群 > 服务 > Hive > 配置 >全部配置 > MetaStore(角色) > 服务初始化”查看,“hive.metastore.client.socket.timeout”对应的值即为超时时间时长,在“描述”列可查看默认值。
处理步骤
- 如果是内部表可以先通过alter table ${TableName} set TBLPROPERTIES('EXTERNAL'='true')来将内部表转成外部表,这样Hive删除的时候只删除元数据省去了删除HDFS数据的时间。
- 如果要用相同的表名可以先将表结构用show create table ${TableName}来导出表结构,再用ALTER TABLE ${TableName} RENAME TO ${new_table_name};来将表重命名。这样就可以新建一个和原来一样表。
- 执行hdfs dfs -rm -r -f ${hdfs_path}在HDFS上删除表数据。
- 在Hive中用alter table ${Table_Name} drop partition (${PartitionName}<’XXXX’, ${PartitionName}>’XXXX’);删除分区(具体删除条件可灵活处理),减少文件数。
- 删除分区少于一千个后,直接用drop table ${TableName}删掉表即可。
建议与总结
Hive分区虽然可以提高查询效率,但要避免分区不合理导致出现大量小文件的问题,要提前规划好分区策略。