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



我需要实现一个用例,其中我需要用来自任何源系统的hdfs中的a文件夹中的最新文件更新配置单元表。我在这里没有使用sqoop。

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

现在,一旦新的emp.csv文件出现在HDFS位置/tmp/emp.csv中,我就编写了一个shell脚本,它将删除现有的/user/hivewarehouse/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作业,它就不会从hist_lo_time.txt文件中获取hdfs文件的时间。因此,时间始终保持不变,作业从不为HDFS中的任何新文件更新而运行。

我每3分钟运行一次这个cronjob

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

有人能帮我指点一下吗?我在哪里做错了,做错了什么?如有任何快速帮助,我们将不胜感激。

谨致问候,Bhupesh

最后,我解决了我所面临的问题。

事实上,当我单独运行脚本时,它可以选择hadoopshell命令[在脚本中使用],而当我试图将此脚本作为cron作业运行时,它无法选择Hadoophome[bin]。因此,没有运行该脚本中使用的任何hadoop命令。

因此,我首先尝试使用$which hadoop来定位我的hadoop所在的位置。然后在需要的地方提供hadoop/hdfs命令的绝对路径。例如:

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

然后它就完美地工作了。

最新更新