关键词:
Hive执行脚本: Return Code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask
0. 写在前面
- Hadoop:Hadoop2.9.2
- Hive:Hive2.3.7
1. 实验场景
离线数仓之留存会员
1. 留存会员与留存率说明
某段时间的新增会员,经过一段时间后,仍继续使用应用认为是留存会员
这部分会员占当时新增会员的比例为留存率
2. 需求:1日、2日、3日的会员留存数和会员留存率
30 | 31 | 1 | 2 | ---- |
10w新会员 | 3w | 1日会员留存数 | ||
20w | 5w | 2日会员留存数 | ||
30w | 4w | 3日会员留存数 |
10W新会员
:dws_member_add_day(dt=08-01)明细数据
3W
:特点 --> 在1号是新会员,在2日启动了(2日的启动日志)
dws_member_start_day
3. 脚本
- 原始脚本
#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
insert overwrite table dws.dws_member_retention_day
partition(dt=$do_date)
(
select
t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
1
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -1)
and t1.dt=$do_date
union all
select
t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
2
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -2)
and t1.dt=$do_date
union all
select
t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
3
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -3)
and t1.dt=$do_date
);
"
hive -e "$sql"
2. 报错信息
- 报错信息
Return Code XXX 一般是
内部错误
3. 解决方法
查看日志信息
前置芝士
Hive中的日志分为系统日志
和Job 日志
两种
-
系统日志
记录了hive的运行情况,错误状况。 -
Job 日志
记录了Hive 中job的执行的历史过程。 - 系统日志存储位置:
$HIVE_HOME/conf/hive-log4j.properties
文件 - Job日志存储位置:
hive.querylog.location
参数值 -
hive.log
日志文件「该日志文件内容是比较简略的」
hive.log 在缺省情况
下 存储位置是:/tmp/「当前用户名字」/hive.log
-
缺省情况
下该日志文件目录查找方法: 可以在Hive安装目录下的conf/hive-log4j.properties
中查看
hive-log4j.properties
内容如下:
# Define some default values that can be overridden by system properties
hive.root.logger=WARN,DRFA
hive.log.dir=/tmp/$user.name
hive.log.file=hive.log
# Define the root logger to the system property "hadoop.root.logger".
log4j.rootLogger=$hive.root.logger, EventCounter
# Logging Threshold
log4j.threshhold=WARN
#
# Daily Rolling File Appender
#
log4j.appender.DRFA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRFA.File=$hive.log.dir/$hive.log.file
# Rollver at midnight
log4j.appender.DRFA.DatePattern=.yyyy-MM-dd
# 30-day backup
#log4j.appender.DRFA.MaxBackupIndex=30
log4j.appender.DRFA.layout=org.apache.log4j.PatternLayout
# Pattern format: Date LogLevel LoggerName LogMessage
#log4j.appender.DRFA.layout.ConversionPattern=%dISO8601 %p %c: %m%n
# Debugging Pattern format
log4j.appender.DRFA.layout.ConversionPattern=%dISO8601 %-5p %c2 (%F:%M(%L)) - %m%n
#
# console
# Add "console" to rootlogger above if you want to use this
#
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%dyy/MM/dd HH:mm:ss %p %c2: %m%n
#custom logging levels
#log4j.logger.xxx=DEBUG
#
# Event Counter Appender
# Sends counts of logging messages at different severity levels to Hadoop Metrics.
#
log4j.appender.EventCounter=org.apache.hadoop.metrics.jvm.EventCounter
log4j.category.DataNucleus=ERROR,DRFA
log4j.category.Datastore=ERROR,DRFA
log4j.category.Datastore.Schema=ERROR,DRFA
log4j.category.JPOX.Datastore=ERROR,DRFA
log4j.category.JPOX.Plugin=ERROR,DRFA
log4j.category.JPOX.MetaData=ERROR,DRFA
log4j.category.JPOX.Query=ERROR,DRFA
log4j.category.JPOX.General=ERROR,DRFA
log4j.category.JPOX.Enhancer=ERROR,DRFA
在最前面可以看到以下信息:
# 默认
hive.root.logger=WARN,DRFA
hive.log.dir=/tmp/$user.name
hive.log.file=hive.log
如果不是default
情况下,需要到Hive安装目录下的conf目录下查看hive-site.xml
中的hive.querylog.location
参数指定的位置
-
hive.querylog.location
参数的官网说明
- 查看MR的日志「详细」
需要提前开启历史服务器
+ 打开日志聚合
+ SQL运行在集群模式
查看MR日志,发现日志的时间点对不上,需要查看是不是打开了本地模式「local」
- 查看
$HIVE_HOME/conf/hive-site.xml
<!-- 操作小规模数据时,使用本地模式提高效率 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
确认是启用了local模式
直接在脚本中新增 set hive.exec.mode.local.auto = false;
即可
- 重新执行脚本再查看MR日志
此时日志可以查看到,对于此项目场景
,错误解决方法如下:
- 改动SQL
使用中间表
进行过渡
不要直接将最终的查询结果插入目标表,而是先插入到中间表,再从中间表查询全部数据插入到目标表中
- 最终脚本
#!/bin/bash
source /etc/profile
if [ -n "$1" ] ;then
do_date=$1
else
do_date=`date -d "-1 day" +%F`
fi
sql="
drop table if exists tmp.tmp_member_retention;
create table tmp.tmp_member_retention as
(
select t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
1
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -1)
and t1.dt=$do_date
union all
select t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
2
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -2)
and t1.dt=$do_date
union all
select t2.device_id,
t2.uid,
t2.app_v,
t2.os_type,
t2.language,
t2.channel,
t2.area,
t2.brand,
t2.dt add_date,
3
from dws.dws_member_start_day t1 join dws.dws_member_add_day
t2 on t1.device_id=t2.device_id
where t2.dt=date_add($do_date, -3)
and t1.dt=$do_date
);
insert overwrite table dws.dws_member_retention_day
partition(dt=$do_date)
select * from tmp.tmp_member_retention;
"
hive -e "$sql"
问题解决
4. 一个有趣的发现
查找资料过程中发现 StackOverFlow 有关于这样的回答
I recently faced the same issue/error in my cluster. The JOB would always get to some 80%+ reduction and fail with the same error, with nothing to go on in the execution logs either. Upon multiple iterations and research I found that among the plethora of files getting loaded some were non-compliant with the structure provided for the base table(table being used to insert data into partitioned table). Point to be noted here is whenever I executed a select query for a particular value in the partitioning column or created a static partition it worked fine as in that case error records were being skipped.
- 翻译如下
我最近在集群中遇到了同样的问题/错误。 JOB 总是会减少 80% 以上,并因同样的错误而失败,执行日志中也没有任何内容。经过多次迭代和研究,我发现在加载的大量文件中,有些文件不符合为基表提供的结构(用于将数据插入分区表的表)。 这里要注意的一点是,每当我对分区列中的特定值执行选择查询或创建静态分区时,它都可以正常工作,因为在这种情况下会跳过错误记录。
其中有一句:
在加载的大量文件中,有些文件不符合为基表提供的结构(用于将数据插入分区表的表)
这句话值得我们关注
5. 参考
https://stackoverflow.com/questions/11185528/what-is-hive-return-code-2-from-org-apache-hadoop-hive-ql-exec-mapredtask
https://www.bilibili.com/video/BV1TB4y117vj?p=40&spm_id_from=pageDriver&vd_source=2b8af863001fac2c89aab4db5ba5b9db
apacheatlas执行导入hive元数据脚本import-hive.sh报错(代码片段)
...询数据库问题2.4修改hive-site.xml一、问题一1问题ApacheAtlas执行导入hive元数据脚本import-hive.sh报错bashimport-hive.shCausedby:com.ctc.wstx.exc.WstxParsingExcept 查看详情
执行hive通用脚本python实现(代码片段)
...9;ymd'动态日期默认昨天,可通过传参来修改创建可执行脚本touchhive_e.pychmod777hive_ 查看详情
hive脚本中切勿使用/**/注释
...*/,然后就引发了问题脚本上传到hue,加入调度,调度正常执行不报错,但是应该有的数据却为空!!!奇了怪了....(反复执行了好多遍,都没有数据,脚本都没有问题呀 一段一段copy执行的时候都正常的)再仔细看看,原因问... 查看详情
hue中oozie执行hive脚本(代码片段)
Oozie执行hive,传入参数1. 新建一个workflow 2. 拖入一个hive2 3.hive脚本如下CREATETABLEIFNOTEXISTSspider_tmp.org_invest_fund_$date(`id`int,`info_id`int,`company`string,`company_url`string,`legal_person`string,`reg_capital`string,`establish_date`string,`investor`string,`upd... 查看详情
将hive的hql执行结果保存到变量中
这里分别针对shell脚本和python脚本举例: shell脚本如下:注意:在hive语句左右两边使用的是ESC键下面的点号,不是单引号。#!/usr/bin/envbashtest1=`hive-S-e"selectmax(period_value)fromdw_dm.dm_guba_loginlog_activity_statwheredim=‘all‘andperiod=‘day 查看详情
hive执行脚本:returncode2fromorg.apache.hadoop.hive.ql.exec.mapredtask
Hive执行脚本:ReturnCode2fromorg.apache.hadoop.hive.ql.exec.MapRedTask0.写在前面1.实验场景1.留存会员与留存率说明2.需求:1日、2日、3日的会员留存数和会员留存率3.脚本2.报错信息3.解决... 查看详情
从配置单元执行 R 脚本
】从配置单元执行R脚本【英文标题】:excuteRscriptfromhive【发布时间】:2012-12-0209:28:09【问题描述】:有谁知道谁将数据从hive读取到R然后返回到Hive?我可以像这样使用Python轻松做到这一点:forlineinsys.stdin:Somecode...sys.stdout.write(Out... 查看详情
hive使用(代码片段)
...制:该机制的核心点是:hive可以用一次性命令的方式来执行给定的hql语句hive-e"insertintotablet_destselect*fromt_src;"然后,进一步,可以将上述命令写入shell脚本中,以便于脚本化运行hive任务,并控制、调度众多hive 查看详情
在 Crontab 上安排 hive 查询
...谁能帮我在Crontab中安排一个作业,该作业将在特定时间执行一个简单的Hive查询并在文本/日志文件中为我提供输出。我创建了一个批处理脚本来执行选择查询,但是在Crontab中执行它时出现错误(“未找到Hive命令”)。然而,相... 查看详情
hadoop双节点&hive搭建自动化脚本(代码片段)
...ode2=10.0.7.2#安装hadoop多节点时候,需要先在hadoop2上执行,然后在在hadoop1上执行HADOOP_FILE='hadoop-2.7.7.tar.gz'HADOOP_DIR='/usr/local'HIVE_FILE='apache-hive-2.3.9-bin.tar.gz'HIVE_DIR='/usr/local'MYSQLip=10.0.7... 查看详情
hive-f参数传递
命令行模式,或者说目录模式,可以使用hive执行命令。选项说明: -e:执行短命令 -f: 执行文件(适合脚本封装) -S:安静模式,不显示MR的运行过程 -hivevar:可以用来传参数 例子1:hive-e查询 命令:&nbs... 查看详情
打包或自动执行 Hive 查询
】打包或自动执行Hive查询【英文标题】:PackageorautomatingexecutionofHivequeries【发布时间】:2018-06-0620:19:33【问题描述】:在Oracle或其他数据库中,我们有一个PL/SQL包的概念,我们可以在其中打包多个查询/过程并在UNIX脚本中调用它... 查看详情
通过 pig 脚本删除 hive 表分区
...让分析师可以使用旧的配置单元数据,直到新的数据加载执行完成。我在hql脚本中通过将每日数据加载到按load_year、load_mont 查看详情
shell脚本循环跑多天的hive脚本
...43;"%Y-%m-%d"`hive-e"select*from table;"echo"$date执行完毕"start_date=`date-d"+1day$date"+"%Y-%m-%d"`done; 查看详情
PIG 脚本、Hive 查询和相应 MapReduce 代码的包装代码
...些,然后通过PIG和HIVE对输出进行操作。我想按顺序一次执行所有这些步骤。我应该如何将这些东西包装到一个脚本中,即Ma 查看详情
hive3.1.2的hql执行过程(代码片段)
Hive3.1.2的HQL执行过程前言上一篇讲解了Hive3.1.2的Beeline执行过程:lizhiyong.blog.csdn.net/article/details/126634843总结概括如下:Main方法初始化Beeline对象→吊起唯一的方法→读取配置的load方法→启动历史的setupHistory方法→平滑退出... 查看详情
迁移hive,不同集群。
...据临时目录hdfsdfs-mkdir/tmp/hive-exportstep3:生成数据导出脚本执行如下命令生成数据导出脚本 查看详情
导入hdfs数据至hbase
...技术ATime:2017.9.14Targets:对于用户活跃情况的数据数据格式执行脚本,Java的Hive脚本。Hive的MavenJar包,与Orc包造成冲突,版本不同,导致类不同,一些方法找不到,参考。原因是hive-exec和orc-mapreduce的hive-storage-api版本不同,导致Vector... 查看详情