报错背景
hive创建数据库时添加中文备注信息报错。
命令:CREATE DATABASE IF NOT EXISTS hive_ods_db COMMENT 'Hive ODS层数据库';
报错现象
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Exception thrown flushing changes to datastore)
报错原因
MySQL的存储注释信息的列的字符集有问题,需要修改。
报错解决
在MySQL终端执行如下命令:
-- 修改数据库编码
set character_set_database =latin1;
-- 切换到hive数据库
use hive-metadata;
-- 修改字段注释字符集
alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
-- 修改表注释字符集
alter table TABLE_PARAMS modify column PARAM_VALUE varchar(4000) character set utf8;
-- 修改分区注释字符集
alter table PARTITION_KEYS modify column PKEY_COMMENT varchar(4000) character set utf8;
-- 修改数据库注释字符集
alter table DBS modify column `DESC` varchar(4000) character set utf8;
其他问题:
- 当 HIVE 中的元数据与 HDFS 上实际的数据不一致时,一些正常的 HIVE SQL 操作可能会执行失败。
- HIVE 中的元数据与 HDFS 上实际的数据不一致的原因有很多,常见的有:
- 使用了 HIVE 外表,由于外表的特性,在HIVE 中删除外表或外表的某些分区时, HDFS上对应的目录和文件仍会存在,此时就会造成不一致;(我们这里就是这种情况)
- HIVE 的元数据和底层HDFS的数据是从其他集群同步过来的,但同步过程中有问题,比如时间没对齐状态不一致;(跨集群同步处理不善,会有这种情况)
- HIVE中的元数据或HDFS上的数据有损坏和丢失。(集群运维管理不规范,会造成这种现象)
- 可以通过 msck repair table xxx 来修复 hive表的元数据: MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
msck repair table xx;
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
show partitions xx;