我正在用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文件的开头设置了路径
我的假设是,您
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
的输出更改以下对路径的所有引用。)现在,您可以在脚本的开头添加此内容
…或在脚本中使用
hdfs
的绝对路径…或者,如果希望避免在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'
的命令相关问题 更多 >
编程相关推荐