Hive执行insert into语句后未成功写入数据的问题排查求助
问题原因
- 事务配置未开启:Hive默认关闭事务支持,
INSERT INTO ... VALUES这种行级DML操作依赖事务功能,未开启时执行插入会出现后台提交失败但前端无报错的情况,数据无法真正写入表中。 - HDFS目录权限不足:你当前登录beeline的用户没有Hive仓库对应目录
/user/$username/warehouse/test02的写入权限,插入过程中数据写操作被拦截,无报错返回但实际写入失败。 - 执行引擎异常:默认MapReduce引擎资源不足、作业假成功,或者临时表到正式表的移动逻辑异常,也会导致数据丢失。
- 建表配置异常:未指定表的存储格式、序列化规则,导致写入的数据无法被正常识别读取,查询时返回空。
解决方案
- 先开启事务配置,临时生效可以直接在beeline中执行以下语句:
SET hive.support.concurrency = true; SET hive.enforce.bucketing = true; SET hive.exec.dynamic.partition.mode = nonstrict; SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; SET hive.compactor.initiator.on = true; SET hive.compactor.worker.threads = 1;
如果需要永久生效,把上述配置添加到hive-site.xml文件中,重启Hive Metastore和HiveServer2服务即可。
- 验证并修改HDFS目录权限,执行以下命令开放目录读写权限:
hdfs dfs -chmod -R 775 /user/$username/warehouse/test02
- 更换更稳定的执行引擎,推荐使用Tez或者Spark替代默认的MapReduce引擎,临时配置命令:
SET hive.execution.engine = tez;
- 优先使用Hive适配的批量写入方式,避免频繁使用行级插入:
-- 测试用批量插入写法,不需要依赖事务也可以正常写入 insert into test02 select 1 id, 'user1' name union all select 2 id, 'user2' name;
配置修改完成后重新执行插入语句即可正常写入数据。
内容的提问来源于stack exchange,提问作者BEBROID
相关产品推荐
相关产品推荐

