Hive调用MapReduce任务失败

1. Hive简介

Hive(蜂巢)Apache Hadoop生态圈的构成之一,其主要功能是基于Hadoop提供MapReduce的类SQL查询。Hive的语法规则和Mysql中SQL的语法规则极为相似,有Mysql使用经验的同学都能轻松上手。
Hive的执行分为本地模式和集群模式。本地模式执行简单的Hive SQL,不需要启动MapReduce程序,如

-- 本地模式
select col_name1, col_name2, col_name3 from db_name.tb_name where date='2017-09-23' limit 50;

集群模式则需要将Hive SQL转换为MapReduce,并提交到Hadoop集群上进行执行,如

-- 集群模式
select col_name1, count(1) pv, count(distinct uid) uv from db_name.tb_name where date='2017-09-23' group by col_name1

2. 问题1:输入格式不兼容

前不久在公司集群上搭建Hive环境,所需要的JDK、Hadoop、Zookeeper、Mysql等都已经搭建完成。下载解压Hive jar包并修改配置文件之后,启动Hive CLI(Command Line Interface),执行本地模式的SQL毫无问题,但只要调用MapReduce就会报错,下面是报错的情况。

2.1 java.io.IOException(mapreduce.job.inputformat.class is incompatible with map compatability mode.

先说解决方案吧,主要是由于Hadoop或者Hive的配置文件中同时指定了老版本输入格式mapred.input.format.classmapreduce.job.inputformat.class,Hadoop的调用Job的submit的方法时,会首先校验使用了mapreduce1还是mapreduce2的API,如果两个同时存在,是一定会报错的。

比较推荐的解决方式是:修改Job的**setUseNewAPI**方法,根据集群当前使用的API版本,将另外一个版本的配置信息设置为null。 

在Hive中执行

select count(1) from db_name.tb_name where date='2017-09-23'

执行错误信息如下

java.io.IOException: mapreduce.job.inputformat.class is incompatible with map compatability mode.
        at org.apache.hadoop.mapreduce.Job.ensureNotSet(Job.java:1210)
        at org.apache.hadoop.mapreduce.Job.setUseNewAPI(Job.java:1245)
        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1299)
        at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:564)
        at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:559)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
        at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:559)
        at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:550)
        at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:429)
        at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:137)
        at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:160)
        at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:88)
        at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1640)
        at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1399)
        at org.apache.hadoop.hive
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值