Cron日志显示sh:1:hdfs:未找到



我正在用python编写一个内务脚本,该脚本将3天前的文件存储到hdfs中,hdfs正常工作,但不适用于cron。

这是我的代码

#storing the files from archive to hdfs within directory - tmp-Archive
if os.system('hdfs dfs -test -e /user/hadoop/tmp-archive') == 0:
print('Archive location exists...using current archive.')
else:
os.system('hdfs dfs -mkdir /user/hadoop/tmp-archive')
print('Archive created -> /user/hadoop/tmp-archive')
archive_file_list = os.listdir('/home/hadoop/PycharmProjects/Housekeeping-Script--master/Archive')
for j in archive_file_list:                             #checks files within archive and stores it in hdfs
archive_file_dir = '/home/hadoop/PycharmProjects/Housekeeping-Script--master/Archive/' + j
os.system('hdfs dfs -put {} /user/hadoop/tmp-archive'.format(archive_file_dir)) 
print('Files added to HDFS in dir : /user/hadoop/tmp-archive')

crontab:

* * * * * python /home/hadoop/PycharmProjects/Housekeeping-Script--master/housekeeper.py > /home/hadoop/PycharmProjects/Housekeeping-Script--master/Logs/`date +%d%m%Y%H%M`-cron.log 2>&1

原因可能是HDFS的路径无法正确获取,请检查您是否在cron文件的开头设置了path。

我的假设是,hdfs位于添加到PATH的位置,该位置位于类似.profile的文件中,该文件不会通过cron运行。

您可以在脚本开始时手动添加它,或者使用到hdfs的绝对路径。您可以运行which hdfs来查找绝对路径。


假设hdfs位于/usr/local/hadoop/hadoop-2.7.0/bin中。在这种情况下,which hdfs将显示/usr/local/hadoop/hadoop-2.7.0/bin/hdfs。(如果您的路径不同,请根据which hdfs的输出将以下所有引用更改为路径。(

现在,您可以在脚本的开头添加这个。。。

import os
os.environ['PATH'] += ':/usr/local/hadoop/hadoop-2.7.0/bin'

或者在脚本中使用hdfs的绝对路径。。。

os.system('/usr/local/hadoop/hadoop-2.7.0/bin/hdfs dfs -mkdir /user/hadoop/tmp-archive')

或者,如果您想避免在python脚本内部对路径进行硬编码,您可以将该路径作为命令行参数或环境变量传入(因此您可以在crontab文件中设置它(,也可以创建一个bash脚本,设置正确的PATH,然后调用您的python脚本,并从cron调用该bash脚本。

不幸的是,仅仅在crontab文件中的脚本调用中准备PATH=$PATH:/usr/local/hadoop/hadoop-2.7.0/bin是不起作用的,因为cron不会在赋值的右侧扩展变量。但另一种解决方法是使用类似sh -c 'PATH=$PATH:/usr/local/hadoop/hadoop-2.7.0/bin python /path/to/my/script.py'的命令。

最新更新