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

Python Cron日志显示sh:1:hdfs:未找到,python,hadoop,scripting,Python,Hadoop,Scripting,我正在用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 c

我正在用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的路径无法正确获取,请检查您是否在cron文件的开头设置了路径。

我的假设是您的
hdfs
位于添加到
路径的位置,该路径位于类似
.profile
的文件中,不会在cron中运行

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


让我们假设,
hdfs
位于
/usr/local/hadoop/hadoop-2.7.0/bin
中。在本例中,
哪个hdfs
将向您显示
/usr/local/hadoop/hadoop-2.7.0/bin/hdfs
。(如果路径不同,请根据
哪个HDF
的输出更改以下对路径的所有引用)

现在,您可以在脚本的开头添加此内容

导入操作系统
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脚本,设置正确的
路径
,然后调用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'
作为命令。

我的假设是,您的
hdfs
位于添加到
路径的某个位置,在
.profile
这样的文件中,它不会通过cron运行

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


让我们假设,
hdfs
位于
/usr/local/hadoop/hadoop-2.7.0/bin
中。在本例中,
哪个hdfs
将向您显示
/usr/local/hadoop/hadoop-2.7.0/bin/hdfs
。(如果路径不同,请根据
哪个HDF
的输出更改以下对路径的所有引用)

现在,您可以在脚本的开头添加此内容

导入操作系统
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脚本,设置正确的
路径
,然后调用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'
的命令。

使用os.environ['PATH']不起作用,但使用到hdfs的绝对路径起作用。在我的例子中,它是:os.system('/usr/local/hadoop/bin/hdfs-dfs-mkdir/user/hadoop/tmp archive')使用os.environ['PATH']不起作用,但使用hdfs的绝对路径起作用。在我的例子中,它是:os.system(“/usr/local/hadoop/bin/hdfs-dfs-mkdir/user/hadoop/tmp-archive”)