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
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