crontab定时运行MR不行,手动shell可以执行成功问题排查过程

本文详细记录了在crontab中定时运行MR任务遇到的问题及排查过程,包括手动执行shell脚本成功,但在crontab中执行失败。通过检查shell脚本格式、定时任务调度、环境变量对比,最终发现是HADOOP_CLASSPATH环境变量未正确设置,导致找不到相关类。解决方法是在脚本中添加环境变量设置并导出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置了定时任务,但MR任务没有执行。

第一步:手动执行shell脚本, 如果有问题,检查相关设置,如source /etc/profile, 绝对路径之类 这里不是重点, 手动可以执行成功
第二步: 检查shell脚本文件格式, 设置测试输出,确保crontab任务调度没有问题, 测试hymtest.sh

#!/bin/bash
DATE=$(date +%Y%m%d:%H:%M:%S)
echo $DATE + "every minute test">>/bigdata/shell/hymoutput.txt
echo 导入每天指数涨跌排行数据 {存到:hbase:"jmdata:topIndex"}>>/bigdata/shell/hymoutput.txt
hadoop jar /bigdata/cdh/jmdata-jdata-mrs-index.jar org.jumao.jdata.mrs.index.TopIndexMR
echo "end topIndex MR">>/bigdata/shell/hymoutput.txt

第三步:
定时任务调度室成功的,检查定时任务相关输出
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
15 2,15 * * * root sh /bigdata/shell/2-35indexmrs.sh
20 2,15 * * * root sh /bigdata/shell/2-40impexpmrs.sh
20 0,8 * * * root sh /bigdata/shell/0,8-20futuresmrs1.sh
25 0,8 * * * root sh /bigdata/shell/0,8-25futuresmrs2.sh
45 7,10,15 * * * root sh /bigdata/shell/1,7,10-45pricemrs.sh
40 */2 * * * root sh /bigdata/shell/2homemrs1.sh
42 */2 * * * root sh /bigdata/shell/2homemrs2.sh
48 */2 * * * root sh /bigdata/shell/2homemrs3.sh
10 */2 * * * root sh /bigdata/shell/2topmrs.sh
50 */1 * * * root sh /bigdata/shell/dailytaskmrs.sh
11 1,7,9,10,12,15,17,19 * * * root sh /bigdata/shell/englishhome.sh
5 8-16,18,20 * * * root sh /bigdata/shell/englishtocom.sh
16 1,7,12,15 * * * root sh /bigdata/shell/englishprice.sh
30 1,7,12,15 * * * root sh /bigdata/shell/englishcategory.sh
2 6 * * * root sh /bigdata/shell/englishtaskmrs.sh
50 2,15 * * * root sh /bigdata/shell/jmbitaskmr.sh
00 3 1 * * /bin/sh /bigdata/shell/logclear.sh
*/1 * * * * root /etc/profile;/bin/sh /bigdata/shell/hymtest.sh >>/bigdata/shell/hymout.txt 2>&1


结果可以看到如下异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil
at org.jumao.jdata.mrs.index.TopIndexMR.main(TopIndexMR.java:99)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more


第四步:
对比手动shell的环境变量 env和 crontab运行时的环境变量,输出到文件
在hymtest.sh中加入

#!/bin/bash
source /etc/profile
env>>/bigdata/shell/hymout.txt
DATE=$(date +%Y%m%d:%H:%M:%S)
echo $DATE + "every minute test">>/bigdata/shell/hymoutput.txt
echo 导入每天指数涨跌排行数据 {存到:hbase:"jmdata:topIndex"}>>/bigdata/shell/hymoutput.txt
/opt/cloudera/parcels/CDH/lib/hadoop/bin/hadoop jar /bigdata/cdh/jmdata-jdata-mrs-index.jar org.jumao.jdata.mrs.index.TopIndexMR
echo "end topIndex MR">>/bigdata/shell/hymoutput.txt

手动env
HOSTNAME=nn1
TERM=xterm
SHELL=/bin/bash
HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
HISTSIZE=1000
SSH_CLIENT=172.18.203.112 49374 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
HBASE_HOME=/opt/cloudera/parcels/CDH/lib/hbase
HADOOP_COMMON_LIB_NATIVE_DIR=/opt/cloudera/parcels/CDH/lib/hadoop/lib/native
MAIL=/var/spool/mail/root
PATH=/usr/java/jdk1.8.0_131/bin:/opt/cloudera/parcels/CDH/lib/hadoop/bin:/opt/cloudera/parcels/CDH/lib/hbase/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/bigdata/shell
JAVA_HOME=/usr/java/jdk1.8.0_131
HADOOP_CLASSPATH=:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive/lib/*:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive-hcatalog/share/hcatalog/*
EDITOR=vi
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
QTLIB=/usr/lib64/qt-3.3/lib
CVS_RSH=ssh
CLASSPATH=.:/usr/java/jdk1.8.0_131/lib/dt.jar:/usr/java/jdk1.8.0_131/lib/tools.jar
SSH_CONNECTION=172.18.203.112 49374 172.18.203.111 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
HIVE_CONF_DIR=/etc/hive/conf
_=/bin/env
OLDPWD=/root


对比发现关键的没有以下环境变量设置,导致找不到相关的class
HADOOP_CLASSPATH=:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive/lib/*:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive-hcatalog/share/hcatalog/*


第五步,修正,执行成功,在执行MR前导出环境变量,指定MR依赖的包,当然这些依赖的包也可以直接copy到集群每台hadoop的lib下,最初部署MR任务做法就是如此。
#!/bin/bash
source /etc/profile
export HADOOP_CLASSPATH=:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive/lib/*:/opt/cloudera/parcels/CDH-5.10.1-1.cdh5.10.1.p0.10/lib/hive-hcatalog/share/hcatalog/*

env>>/bigdata/shell/hymout.txt
DATE=$(date +%Y%m%d:%H:%M:%S)
echo $DATE + "every minute test">>/bigdata/shell/hymoutput.txt
echo 导入每天指数涨跌排行数据 {存到:hbase:"jmdata:topIndex"}>>/bigdata/shell/hymoutput.txt
/opt/cloudera/parcels/CDH/lib/hadoop/bin/hadoop jar /bigdata/cdh/jmdata-jdata-mrs-index.jar org.jumao.jdata.mrs.index.TopIndexMR
echo "end topIndex MR">>/bigdata/shell/hymoutput.txt
SQL 错误 [1] [08S01]: org.apache.hive.service.cli.HiveSQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask. Permission denied: user=anonymous, access=EXECUTE, inode="/tmp":root:supergroup:drwx------ at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.check(FSPermissionChecker.java:350) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkTraverse(FSPermissionChecker.java:311) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:238) at org.apache.hadoop.hdfs.server.namenode.FSPermissionChecker.checkPermission(FSPermissionChecker.java:189) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1753) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkPermission(FSDirectory.java:1737) at org.apache.hadoop.hdfs.server.namenode.FSDirectory.checkOwner(FSDirectory.java:1682) at org.apache.hadoop.hdfs.server.namenode.FSDirAttrOp.setPermission(FSDirAttrOp.java:64) at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.setPermission(FSNamesystem.java:1781) at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.setPermission(NameNodeRpcServer.java:830) at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.setPermission(ClientNamenodeProtocolServerSideTranslatorPB.java:469) at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java) at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:503) at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:989) at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:871) at org.apache.hadoop.ipc.Server$RpcCall.run(Server.java:817) 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:1893) at org.apache.hadoop.ipc.Server$Handler.run(Server.java:2606) at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:380)
06-19
在使用 `crontab` 定时执行包含 `nohup java -jar` 命令的 shell 脚本时,脚本未按预期运行问题通常与环境变量、路径配置或进程管理方式有关。以下是一些常见的原因和解决方案: ### 1. **环境变量问题** `crontab` 执行时使用的环境变量与用户在终端中执行脚本时的环境变量同,可能导致 `java` 命令无法找到。为了解决这个问题,可以在脚本中显式地设置 `JAVA_HOME` 环境变量,并将其添加到 `PATH` 中。 ```bash #!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` 这样可以确保 `crontab` 在执行脚本时能够正确识别 `java` 命令的位置。 ### 2. **路径问题** 在 `crontab` 中执行脚本时,当前工作目录可能与手动执行同,导致脚本无法找到所需的文件或目录。为了避免这个问题,可以在脚本中使用绝对路径来指定 `jar` 文件的位置,而是相对路径。 ```bash nohup java -jar /absolute/path/to/your.jar > /absolute/path/to/output.log 2>&1 & ``` ### 3. **nohup 输出问题** `nohup` 默认会将输出重定向到当前目录下的 `nohup.out` 文件,但如果当前目录可写或没有权限,可能会导致输出失败。为了避免这个问题,可以显式地将输出重定向到一个有写权限的文件中。 ```bash nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` ### 4. **权限问题** 确保脚本本身具有可执行权限,并且 `jar` 文件所在的目录以及输出日志文件的目录都具有适当的读写权限。 ```bash chmod +x /path/to/your_script.sh ``` ### 5. **crontab 配置问题** 确保 `crontab` 的配置正确,并且任务的时间表达式符合预期。可以通过 `crontab -l` 命令查看当前的定时任务列表。 ```bash crontab -l ``` 如果需要调试 `crontab` 的执行情况,可以查看系统日志文件 `/var/log/cron`。 ```bash tail -f /var/log/cron ``` ### 6. **进程守护问题** 如果希望 `jar` 文件在后台持续运行,可以使用 `nohup` 来确保其会因为终端关闭而终止。此外,可以使用 `screen` 或 `tmux` 等工具来进一步管理后台进程。 ```bash nohup java -jar /path/to/your.jar > /path/to/output.log 2>&1 & ``` ### 示例脚本 以下是一个完整的示例脚本,展示了如何在 `crontab` 中正确执行 `nohup java -jar` 命令: ```bash #!/bin/bash export JAVA_HOME=/usr/lib/jvm/java-11-openjdk export PATH=$JAVA_HOME/bin:$PATH cd /absolute/path/to/ nohup java -jar your.jar > output.log 2>&1 & ``` 通过以上方法,可以解决 `crontab` 定时执行包含 `nohup java -jar` 命令的 shell 脚本时出现的问题。如果问题仍然存在,建议检查系统日志以获取更多详细的错误信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值