在Hive中插入含JSON数据的表时,如何忽略vertex failed错误?
解决Hive插入时忽略损坏数据的方案
我之前处理Hive JSON表的时候也踩过这个坑,损坏的JSON记录经常搞崩整个插入任务,试了几个参数之后终于能让任务跑下去了,分享给你:
1. 针对JSON格式的专属容错设置
如果你的表用的是Hive自带的JsonSerDe,可以直接在表级别开启忽略畸形JSON的配置:
- 要是还没创建表,建表时就加上SerDe属性:
CREATE TABLE your_target_table ( column1 STRING, column2 INT, column3 ARRAY<STRING> ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.JsonSerDe' WITH SERDEPROPERTIES ( "ignore.malformed.json" = "true" ) STORED AS TEXTFILE; - 已经创建好的表,用ALTER语句修改:
ALTER TABLE your_target_table SET SERDEPROPERTIES ("ignore.malformed.json" = "true");
这个参数会让SerDe直接跳过那些不符合JSON格式的行,不会因为单条坏数据导致整个任务失败。
2. 全局跳过损坏记录
不管是什么格式的表,都可以设置Hive的全局参数来跳过损坏的记录,在执行插入语句前先运行:
SET hive.exec.skip.corrupt.records=true;
这个参数会让Hive在读取数据时,自动跳过那些无法解析的损坏记录,适用于所有输入格式的表。
3. 允许部分任务失败
有时候即使跳过了坏记录,个别Map/Reduce任务还是可能因为其他原因失败,这时候可以设置允许一定比例的任务失败:
-- 允许最多10%的Map任务失败 SET mapreduce.map.failures.maxpercent=10; -- 允许最多10%的Reduce任务失败 SET mapreduce.reduce.failures.maxpercent=10;
只要失败的任务占比不超过你设定的数值,整个作业就会继续执行,不会直接报错终止。
小提示
这些参数可以组合使用,比如先开启JSON专属的容错,再加上全局跳过损坏记录,最后设置任务失败比例,基本能覆盖大部分场景。不过要注意,跳过坏数据只是临时解决方案,最好事后排查一下损坏数据的原因(比如JSON格式错误、编码问题、字段类型不匹配等),从源头解决问题会更稳妥。
内容的提问来源于stack exchange,提问作者Santhosh Chakka
相关产品推荐
相关产品推荐

