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

时间:2017-11-17 23:07:20

标签: hive cron hdfs sh hadoop2

我需要实现一个用例,我需要使用最新文件更新hive表,该文件位于任何源系统的hdfs文件夹中。我不是在这里使用sqoop。

我应该定期从源系统接收更新的文件到特定的HDFS位置(比如/tmp/emp.csv)。我在hive中创建了一个托管/内部表,并且第一次手动将数据加载到其中。 因此,我的最新员工表(在配置单元中创建,在默认位置具有仓库 - / 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作业,它就不会从hist_lof_time.txt文件中获取hdfs文件的时间和时间。因此,时间始终保持不变,并且HDFS中的任何新文件更新都不会运行作业。

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

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

任何人都可以帮我解决任何指针,我在哪里和我做错了什么?任何快速帮助将不胜感激。

此致 布佩希

1 个答案:

答案 0 :(得分:0)

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

实际上,当我单独运行脚本时,它能够选择hadoop shell命令[在脚本中使用],当我尝试将此脚本作为cron作业运行时,它无法选择Hadoop home [bin ]。因此没有运行该脚本中使用的任何hadoop命令。

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

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

然后它完美地工作了。