Shell脚本单独运行但不能生成正确的结果作为crontab作业

Shell脚本单独运行但不能生成正确的结果作为crontab作业

问题描述:

我需要实现一个用例,我需要用来自任何源系统的hdfs文件夹中的最新文件更新配置单元表。我没有在这里使用sqoop。Shell脚本单独运行但不能生成正确的结果作为crontab作业

我应该定期从源系统接收更新的文件到特定的HDFS位置(比如/tmp/emp.csv)。我已经在配置单元中创建了托管/内部表,并且第一次手动将数据加载到该表中。 因此,我的最新员工表(在配置单元中创建,仓库位于默认位置 -/user/hive/warehouse)将拥有emp.csv文件中的所有数据。

现在,只要新的emp.csv文件进入HDFS位置/tmp/emp.csv,我写了一个shell脚本,它将删除现有的/user/hive/warehouse/employee/emp.csv文件并将其替换与最新的文件,因此,我可以通过蜂巢查询看到最新的员工数据。

我的剧本就像是

#!/bin/bash 
file_date=`hadoop fs -ls /tmp/emp.csv | awk '{print $6" "$7}'` 
echo "file_date="$file_date 

log_file_date="$(cat hist_lof_time.txt)" 
echo "log_file_date="$log_file_date 
if [ "$file_date" != "$log_file_date" ]; then 
       echo "file data not match with log date" 
     if [ -z "$log_file_date" ]; then 
       echo "inside log date edit loop" 
       echo $file_date > hist_lof_time.txt 
    fi 

     rm /opt/emp.csv 
     hadoop fs -get /tmp/emp.csv /opt/ 

     hadoop fs -get /user/hive/warehouse/employee/emp.csv /opt/bkp/  
     hadoop fs -rm /user/hive/warehouse/employee/emp.csv 

     hadoop fs -put /tmp/emp.csv /user/hive/warehouse/employee/ 
     echo $file_date > hist_lof_time.txt 
    else 
     echo "file is same so not processing further" 
fi 

当我运行它作为控制台shell脚本,但只要我添加它作为我的crontab的工作,它不拿起HDFS现在这个脚本工作正常从hist_lof_time.txt文件中提取文件的时间和时间。因此时间总是保持不变,并且工作从不运行HDFS中的任何新文件更新。

我运行此的cronjob在每3分钟

*/3 * * * * /opt/myscript.sh >>/opt/myscriptout.txt 

任何人都可以请帮助我的任何指针,在那里和我在做什么错在这里?任何快速的帮助,将不胜感激。

问候, 布佩希

最后,我决定这是我面临的问题。

其实当我单独运行脚本,有人能挑到Hadoop的shell命令[在脚本中使用]这里,当我试图运行该脚本的cron作业的,它在那里没有能挑到Hadoop的家[二进制]。因此没有运行该脚本中使用的任何hadoop命令。

因此,我首先尝试定位我的hadoop使用$哪个hadoop。然后根据需要提供hadoop/hdfs命令的绝对路径。 例如:

file_date=`/opt/hadoop-2.6.4/bin/hadoop fs -ls /tmp/emp.csv | awk '{print $6" "$7}'` 

它的工作完美,然后后。