Я создал кластер Raspberry pi с установленными Spark и Hadoop и сделал несколько функций в .bashrc, чтобы немного облегчить общение и взаимодействие
function otherpis {
grep "pi" /etc/hosts | awk '{print $2}' | grep -v $(hostname)
}
function clustercmd {
for pi in $(otherpis); do ssh $pi "$@"; done
$@
}
Где другие пользователи просто смотрят нахост-файл, в котором я предварительно скомпилировал все остальные малиновые pis в кластере с их статическими IP-адресамиЯ также настроил ssh с авторизованными ключами, поэтому мне не нужно вводить пароль каждый раз, когда я ssh.
Я могу вызывать такие команды, как
$ clustercmd date
Thu 03 Oct 2019 02:00:13 PM CDT
Thu 03 Oct 2019 02:00:11 PM CDT
Thu 03 Oct 2019 02:00:12 PM CDT
......
или
$ clustercmd sudo mkdir -p /opt/hadoop_tmp/hdfs
и все работает просто отлично. Но по какой-то причине, когда я пытаюсь передать что-либо в команду с помощью hadoop или spark, он говорит, что не может найти команду, кроме pi, из которого я вызываю команду.
$ clustercmd hadoop version | grep Hadoop
bash: hadoop: command not found
bash: hadoop: command not found
.....
Hadoop 3.2.1
Но когда я вручную вставляю ssh в пи и вызываю команду, она работает просто отлично.
$ ssh pi2
pi@pi2: $ hadoop version | grep Hadoop
Hadoop 3.2.1
Я экспортировал все правильные пути в .bashrc. У меня есть chown всех соответствующих каталогов на каждом пи. Что бы я ни пытался, просто команды spark и hadoop не регистрируются. Все остальное есть. У меня даже есть функция, которая будет выполнять копирование файлов по всему кластеру
function clusterscp {
for pi in $(otherpis); do
cat $1 | ssh $pi "sudo tee $1" > /dev/null 2>&1
done
}
Я настраиваю hadoop и spark на первом пи, а затем массово перенес все файлы и конфигурации с помощью вышеуказанной функции безпроблемы. Любое понимание поможет
РЕДАКТИРОВАТЬ Добавление всех экспортируемых путей в .bashrc
export JAVA_HOME=$(readlink –f /usr/bin/java | sed "s:bin/java::")
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
export SPARK_HOME=/opt/spark
export PATH=$PATH:$SPARK_HOME/bin
export HADOOP_OPTS="-XX:-PrintWarnings –Djava.net.preferIPv4Stack=true"
export HADOOP_HOME_WARN_SUPPRESS=1
export HADOOP_ROOT_LOGGER="WARN,DRFA"
Обратите внимание, что, как я уже говорил ранее, когда я на самом деле SSH-впи, все экспортированные пути работают нормально, только когда я пытаюсь запустить команду clustercmd , что hadoop и spark не найдены
Решено
Я исправил это, переместиввсе экспорты выше этой строки в .bashrc
# If not running interactively, don't do anything
case $- in
*i*);;
*) return;;
esac
И я добавил его в .profile в домашнем каталоге. Первоначально это было предложено Мангустой, он просто добавил слово в файл ".bash_profile", когда оно должно быть просто "профиль"