1.解决return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask 错误
在启动hive后,使用select查询语句进行查询时,爆出如下错误:
INFO : Number of reduce tasks determined at compile time: 1
INFO : In order to change the average load for a reducer (in bytes):
INFO : set hive.exec.reducers.bytes.per.reducer=
INFO : In order to limit the maximum number of reducers:
INFO : set hive.exec.reducers.max=
INFO : In order to set a constant number of reducers:
INFO : set mapreduce.job.reduces=
INFO : number of splits:1
INFO : Submitting tokens for job: job_1500138723273_0001
INFO : The url to track the job: http://hadoop01:8088/proxy/application_1500138723273_0001/
INFO : Starting Job = job_1500138723273_0001, Tracking URL = http://hadoop01:8088/proxy/application_1500138723273_0001/
INFO : Kill Command = /home/hadoop/soft/hadoop-2.6.4/bin/hadoop job -kill job_1500138723273_0001
INFO : Hadoop job information for Stage-1: number of mappers: 0; number of reducers: 0
INFO : 2017-07-19 22:57:22,349 Stage-1 map = 0%, reduce = 0%
ERROR : Ended Job = job_1500138723273_0001 with errors
Error: Error while processing statement: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask (state=08S01,code=2)
在查看日志信息以后,发现错误的原因在于namenode处于safemode状态,然后进入namenode所在节点通过使用hdfs dfsadmin -safemode leave命令退出安全模式,就可以解决问题。
如果上述操作不能解决,请检查各个节点的时间是否同步!!!
这个问题只是HIVE单方面的问题,而用Hadoop Job日志查看,却是YarnException: Unauthorized request to start container的问题。
未经授权的请求,也就是各个节点的时间未同步的问题。
第一种同步方式:通过网络进行时钟同步
通过网络连接外网进行时钟同步,必须保证虚拟机连上外网
ntpdate us.pool.ntp.org;
阿里云时钟同步服务器
ntpdate ntp4.aliyun.com
三台机器定时任务
crontab -e
*/1 * * * * /usr/sbin/ntpdate us.pool.ntp.org;
或者直接与阿里云服务器进行时钟同步
crontab -e
*/1 * * * * /usr/sbin/ntpdate ntp4.aliyun.com;
第二种时钟同步方式:通过某一台机器进行同步
第三种方式:(简单粗暴)
在每一个节点机器上,同时设置时间:格式为date --set “07/07/06 10:19" (月/日/年时:分:秒)
2.解决return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapredLocalTask错误
通过查看日志可以看出报错的类MapredLocalTask可以看出跟本地任务有关,所以我们可以通过以下几个参数对相关行为进行设置
hive.exec.mode.local.auto=false
hive.exec.mode.local.auto.input.files.max=4
hive.exec.mode.local.auto.inputbytes.max=134217728
其中第一个为不启用本地模式,第二个参数表示文件数小于4时使用本地模式,第三个参数表示文件大小小于128m时采用本地模式。
默认为不启用本地模式;在启用的情况下,满足第二、三个条件中的任意一个都会使用本地模式。
任务是在root用户下通过crontab调用的,进入shell后先启动hiveserver,所以默认工作目录其实是/root;为了能正常读写hdfs上的文件,hiveserver在启动时切换到了hdfs用户,一旦遇到上述两种满足启用本地模式的情况,hdfs用户试图向当前工作目录/root拉取数据,必然没有权限从而导致以上错误。
解决:先创建一个目录,把用户、用户组授权给hdfs,进入shell后,先切换工作目录,然后再启动hiveserver即可。如hdfs的home目录/home/hdfs
然后在任务shell的公共配置文件conf/kettle.conf中增加一行切换目录脚本即可解决以上问题
cd /home/hdfs