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

rjjhvcjd  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(422)

我需要实现一个用例,在这个用例中,我需要用来自任何源系统的hdfs中的a文件夹中的最新文件更新hive表。我这里不使用sqoop。
我应该定期从源系统接收更新的文件到特定的hdfs位置(比如/tmp/emp.csv)。我在配置单元中创建了一个托管/内部表,并首次手动将数据加载到其中。因此,我最新的employee表(在hive中创建,仓库位于默认位置-/user/hive/warehouse)将在emp.csv文件中显示所有数据。
现在只要新的emp.csv文件出现在hdfs location/tmp/emp.csv中,我就编写了一个shell脚本,它将删除现有的/user/hive/warehouse/employee/emp.csv文件并用最新的文件替换它,因此我可以通过hive查询查看最新的员工数据。
我的剧本就像


# !/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\u lof\u time.txt文件中获取hdfs文件time和time。因此,对于hdfs中的任何新文件更新,时间始终保持不变,并且作业从不运行。
我每3分钟运行一次这个任务


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

有谁能帮我指点一下,我哪里做错了,哪里做错了?任何快速的帮助都将不胜感激。
你好,布比什

wgmfuz8q

wgmfuz8q1#

最后,我解决了我所面临的问题。
实际上,当我单独运行这个脚本时,它能够选择hadoop shell命令[在脚本中使用],而当我尝试将这个脚本作为cron作业运行时,它不能选择hadoop home[bin]。因此,没有运行该脚本中使用的任何hadoop命令。
因此,我首先尝试定位hadoop使用$which hadoop的位置。然后提供hadoop/hdfs命令的绝对路径。例如:

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

在那之后,它工作得很好。

相关问题