实战:Hive的CTAS(Create Table As Select)操作中因元数据异常(MetaException)导致的插入失败

164 阅读3分钟

Hive的CTAS(Create Table As Select)操作中因元数据异常(MetaException)导致的插入失败

在Hive的CTAS(Create Table As Select)操作中,遇到元数据异常(MetaException)导致的插入失败。CTAS操作是在一个查询结果基础上创建一个新表,并将查询结果插入新表中。

报错

2024-06-04 01:48:17 [pool-4-thread-2] [ERROR] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:Insert of object "org.apache.hadoop.hive.metastore.model.MTable@622d43d0" using statement "INSERT INTO `TBLS` (`TBL_ID`,`CREATE_TIME`,`DB_ID`,`LAST_ACCESS_TIME`,`OWNER`,`OWNER_TYPE`,`RETENTION`,`IS_REWRITE_ENABLED`,`SD_ID`,`TBL_NAME`,`TBL_TYPE`,`VIEW_EXPANDED_TEXT`,`VIEW_ORIGINAL_TEXT`,`WRITE_ID`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)" failed : Lock wait timeout exceeded; try restarting transaction)

old sql

create table test_db.fct0_fee_list_d_tmp stored as textfile location '/tmp/hive_to_antdb/fct0_fee_list_d_tmp' as select   replace(replace(bkkp_sn,'\','\\'),'"','')  bkkp_sn,  replace(replace(mdtrt_id,'\','\\'),'"','')  mdtrt_id,  replace(replace(fee_ocur_time,'\','\\'),'"','')  fee_ocur_time,  replace(replace(setl_id,'\','\\'),'"','')  setl_id,  replace(replace(rx_drord_no,'\','\\'),'"','')  rx_drord_no,  replace(replace(fixmedins_code,'\','\\'),'"','')  fixmedins_code,  replace(replace(fixmedins_name,'\','\\'),'"','')  fixmedins_name,  replace(replace(psn_no,'\','\\'),'"','')  psn_no,  replace(replace(psn_insu_rlts_id,'\','\\'),'"','')  psn_insu_rlts_id,  replace(replace(insu_admdvs,'\','\\'),'"','')  insu_admdvs,  replace(replace(pay_loc,'\','\\'),'"','')  pay_loc,  replace(replace(med_type,'\','\\'),'"','')  med_type,  replace(replace(cnt,'\','\\'),'"','')  cnt,  replace(replace(pric,'\','\\'),'"','')  pric,  replace(replace(det_item_fee_sumamt,'\','\\'),'"','')  det_item_fee_sumamt,  replace(replace(pric_uplmt_amt,'\','\\'),'"','')  pric_uplmt_amt,  replace(replace(selfpay_prop,'\','\\'),'"','')  selfpay_prop,  replace(replace(fulamt_ownpay_amt,'\','\\'),'"','')  fulamt_ownpay_amt,  replace(replace(overlmt_selfpay,'\','\\'),'"','')  overlmt_selfpay,  replace(replace(preselfpay_amt,'\','\\'),'"','')  preselfpay_amt,  replace(replace(inscp_amt,'\','\\'),'"','')  inscp_amt,  replace(replace(cvlserv_bedfee_amt,'\','\\'),'"','')  cvlserv_bedfee_amt,  replace(replace(medins_disc_amt,'\','\\'),'"','')  medins_disc_amt,  replace(replace(chrgitm_lv,'\','\\'),'"','')  chrgitm_lv,  replace(replace(hilist_code,'\','\\'),'"','')  hilist_code,  replace(replace(hilist_name,'\','\\'),'"','')  hilist_name,  replace(replace(list_type,'\','\\'),'"','')  list_type,  replace(replace(med_list_codg,'\','\\'),'"','')  med_list_codg,  replace(replace(medins_list_codg,'\','\\'),'"','')  medins_list_codg,  replace(replace(medins_list_name,'\','\\'),'"','')  medins_list_name,  replace(replace(med_chrgitm_type,'\','\\'),'"','')  med_chrgitm_type,  replace(replace(prodname,'\','\\'),'"','')  prodname,  
#......
replace(replace(min_prepunt,'\','\\'),'"','')  min_prepunt,  replace(replace(list_type_s,'\','\\'),'"','')  list_type_s,  replace(replace(list_type_s_desc,'\','\\'),'"','')  list_type_s_desc,  replace(replace(cnt_pcs,'\','\\'),'"','')  cnt_pcs  from prd_btyb_ads_neu.fct0_fee_list_d

new sql

truncate table test_db.fct0_fee_list_d_tmp; insert into test_db.fct0_fee_list_d_tmp   select   replace(replace(bkkp_sn,'\\','\\\\'),'"','')  bkkp_sn,  replace(replace(mdtrt_id,'\\','\\\\'),'"','')  mdtrt_id,  replace(replace(fee_ocur_time,'\\','\\\\'),'"','')  fee_ocur_time,  replace(replace(setl_id,'\\','\\\\'),'"','')  setl_id,  replace(replace(rx_drord_no,'\\','\\\\'),'"','')  rx_drord_no,  replace(replace(fixmedins_code,'\\','\\\\'),'"','')  fixmedins_code,  replace(replace(fixmedins_name,'\\','\\\\'),'"','')  fixmedins_name,  replace(replace(psn_no,'\\','\\\\'),'"','')  psn_no,  replace(replace(psn_insu_rlts_id,'\\','\\\\'),'"','')  psn_insu_rlts_id,  replace(replace(insu_admdvs,'\\','\\\\'),'"','')  insu_admdvs,  replace(replace(pay_loc,'\\','\\\\'),'"','')  pay_loc,  replace(replace(med_type,'\\','\\\\'),'"','')  med_type,  replace(replace(cnt,'\\','\\\\'),'"','')  cnt,  replace(replace(pric,'\\','\\\\'),'"','')  pric,  replace(replace(det_item_fee_sumamt,'\\','\\\\'),'"','')  det_item_fee_sumamt,  replace(replace(pric_uplmt_amt,'\\','\\\\'),'"','')  pric_uplmt_amt,  replace(replace(selfpay_prop,'\\','\\\\'),'"','')  selfpay_prop,  replace(replace(fulamt_ownpay_amt,'\\','\\\\'),'"','')  fulamt_ownpay_amt,  replace(replace(overlmt_selfpay,'\\','\\\\'),'"','')  overlmt_selfpay,  replace(replace(preselfpay_amt,'\\','\\\\'),'"','')  preselfpay_amt,  replace(replace(inscp_amt,'\\','\\\\'),'"','')  inscp_amt,  replace(replace(cvlserv_bedfee_amt,'\\','\\\\'),'"','')  cvlserv_bedfee_amt, #...... 
replace(replace(cnt_pcs,'\\','\\\\'),'"','')  cnt_pcs  from prd_btyb_ads_neu.fct0_fee_list_d; 

原因分析

1.fct0_fee_list_d 这个表是orc格式数据类型需要强匹配,而且来源是每天自己改,不清楚他改什么了 2.fct0_fee_list_d_tmp 这个表是textfile格式,用create table 。。。as需要保证数据类型强一致性,可以先见一个fct0_fee_list_d_tmp表,再用insert 插进去试一下,这个明天可以试一下

其他常见原因及处理方法

  1. 元数据服务(Metastore)不可用

    • 原因:Hive的Metastore服务未启动或不稳定。
    • 解决方法:确保Hive Metastore服务正常运行。可以通过检查Metastore的日志文件来诊断问题。
  2. 表名或数据库名冲突

    • 原因:新建的表名或数据库名已存在。
    • 解决方法:检查并确保新表名和数据库名是唯一的,避免与已有表名或数据库名冲突。
  3. 权限问题

    • 原因:当前用户缺少在目标数据库或表上的读写权限。
    • 解决方法:为当前用户分配适当的权限,确保其拥有创建表的权限。
  4. 硬件资源不足

    • 原因:集群的硬件资源(如内存、磁盘空间)不足,导致操作无法完成。
    • 解决方法:检查硬件资源使用情况,必要时增加资源或优化数据处理逻辑。
  5. MetaStore 表损坏

    • 原因:MetaStore 的表损坏
    • 解决方法:尝试修复 MetaStore 表。- 具体步骤可以参考 Hive 的官方文档,或尝试重新建表:
    REPAIR TABLE your_table;