hive insert overwrite hdfs(hive输出结果导出到hdfs) 错误

近日将原来MR 处理到etl 部分转移到Hive Serde 处理导出到HDFS的时候,Hive导出过程出错caused by: java.io.IOException: Cannot get DistCp constructor: org.apache.hadoop.tools.DistCp.<init>()

  • hadoop 2.7.2 hive 1.2.1
  • 报错的问题是无法初始化 DistCp class 看了下这部分的代码 Hadoop
    《hive insert overwrite hdfs(hive输出结果导出到hdfs) 错误》 src-pic
    而Hive
    中实现接口HadoopShims 中runDistCp的方法时采用的是反射
    Class clazzDistCp = Class.forName("org.apache.hadoop.tools.DistCp");Constructor c = clazzDistCp.getConstructor();
    无参构造,而hadoop2.7.2中DistCp类的无参构造方法是 default 不是public,反射无法获取。
  • 解决办法 可以找一个hadoop 2.6X的包hadoop-distcp-2.6.5.jar 放到hive/lib 目录下。或者修改 hadoop 对应到包 修改其无参构造方法声明为public,替换掉hadoop目录下到jar包
    原文作者:kris37
    原文地址: https://www.jianshu.com/p/1ad6acc2e723
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞