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

2024-10-05 12:25:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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

Tags: masterhadoophomeosscripthdfssystemtmp
2条回答

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

我的假设是,您hdfs所在的位置被添加到像.profile这样的文件中的PATH中,该文件不会通过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'的命令

相关问题 更多 >

    热门问题