web-dev-qa-db-fra.com

Le script shell ne fonctionne pas sur crontab mais fonctionne autrement

J'ai un script qui fusionne tous les petits fichiers présents dans les répertoires horaires de hdfs en un seul fichier volumineux. Le script fonctionne correctement lorsqu'il est exécuté via la CLI. J'ai ensuite configuré le script pour qu'il s'exécute tous les jours à 01h30 afin de fusionner les fichiers du jour précédent. Mais ça ne marche pas. J'ai exporté PATH, HADOOP_HOME, HADOOP_CONF_DIR en haut de mon script. Changement de permission de l'utilisateur en root. Mais sans aide. Voici mon script:

#!/bin/bash

export PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/Java/jdk1.8.0/bin:/home/hadoopuser/hadoop/bin:/home/hadoopuser/zookeeper/bin:/home/hadoopuser/Hive/bin:/home/hadoopuser/derby/bin:/home/hadoopuser/maven/bin:/home/hadoopuser/pig/bin:/home/hadoopuser/spark/bin:/home/hadoopuser/flume/bin:/home/hadoopuser/.local/bin:/home/hadoopuser/bin:/home/hadoopuser/user1/tmp

export HADOOP_HOME=/home/hadoopuser/hadoop
export HADOOP_CONF_DIR=/home/hadoopuser/hadoop/etc/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=/home/hadoopuser/hadoop/lib/native
export HADOOP_OPTS="-Djava.library.path=/home/hadoopuser/hadoop/lib/native"

echo $HADOOP_HOME
echo $HADOOP_CONF_DIR
echo $PATH
mnth=$(date +%m)
day=$(date -d "1 day ago" +"%d")
echo "Running for $day-$mnth-2017"
for k in $mnth
do
     for j in $day
     do
         for i in 17 18 19 20 21 22 23
         do

           hadoop fs -cat /topics/topic1/year=2017/month=$k/day=$j/hour=$i/* | hadoop fs -put - /merged/topic1/2017"_"$k"_"$j"_"$i
           hadoop fs -du -s /merged/topic1/2017"_"$k"_"$j"_"$i > /home/hadoopuser/user1/merge_test/size.txt
           x=`awk '{ print $1 }' /home/hadoopuser/user1/merge_test/size.txt`
           if [ $x -eq 0 ]
           then
           hadoop fs -rm /merged/topic1/2017"_"$k"_"$j"_"$i
           else
           echo "MERGE DONE!!! All files generated at hour $i of $j-$k-2017 merged into one"
           fi
         done
    done
done

rm -f /home/hadoopuser/user1/merge_test/size.txt

Voici ce que je mentionne à crontab -e

30 1 * * * /home/hadoopuser/user1/tmp/cron-merge-generalevents.sh > /home/hadoopuser/user1/tmp/cron-merge-generalevents.txt

Tout ce que je vois dans /home/hadoopuser/user1/tmp/cron-merge-generalevents.txt est pour toutes les heures de la journée

/home/hadoopuser/hadoop
/home/hadoopuser/hadoop/etc/hadoop
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/Java/jdk1.8.0/bin:/home/hadoopuser/hadoop/bin:/home/hadoopuser/zookeeper/bin:/home/hadoopuser/Hive/bin:/home/hadoopuser/derby/bin:/home/hadoopuser/maven/bin:/home/hadoopuser/pig/bin:/home/hadoopuser/spark/bin:/home/hadoopuser/flume/bin:/home/hadoopuser/.local/bin:/home/hadoopuser/bin:/home/hadoopuser/user1/tmp
Running for 19-07-2017
MERGE DONE!!! All files generated at hour 17 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 18 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 19 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 20 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 21 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 22 of 19-07-2017 merged into one
MERGE DONE!!! All files generated at hour 23 of 19-07-2017 merged into one
1
earl

Dans ce cas, le bon conseil est d'exporter aussi Java_HOME car vous utilisez hadoop, qui dépend de Java. Mais le mieux est d’importer/source toutes les variables de bash_profile

(au début du script)

. /path/to/.bash_profile

ou

source /path/to/.bash_profile
0
Romeo Ninov