Краткий ответ
На стороне мастера
hadoop-daemons.sh
В $HADOOP_HOME/sbin/hadoop-daemons.sh
(не $HADOOP_HOME/sbin/hadoop-daemon.sh
, в имени файла есть s
) есть строка, вызывающая $HADOOP_HOME/sbin/slaves.sh
. В моей версии (Hadoop v2.7.7) он гласит:
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
Измените строку на следующую строку, чтобы она учитывала переменные среды подчиненной стороны:
exec "$bin/slaves.sh" "source" ".bash_aliases" \; "hadoop-daemon.sh" "$@"
пряжа-daemons.sh
Аналогично в $HADOOP_HOME/sbin/yarn-daemons.sh
меняем строку:
exec "$bin/slaves.sh" --config $YARN_CONF_DIR cd "$HADOOP_YARN_HOME" \; "$bin/yarn-daemon.sh" --config $YARN_CONF_DIR "$@"
to
exec "$bin/slaves.sh" "source" ".bash_aliases" \; "yarn-daemon.sh" "$@"
На стороне раба
Поместите все переменные среды, связанные с Hadoop, в $HOME/.bash_aliases
.
Старт/Стоп
Чтобы запустить HDFS, просто запустите start-dfs.sh
на главной стороне. Узел данных подчиненной стороны будет запущен, как если бы hadoop-daemon.sh start datanode
выполнялся из интерактивной оболочки на подчиненной стороне.
Чтобы остановить HDFS, просто запустите stop-dfs.sh
.
Примечание
Вышеупомянутые изменения уже завершены. Но для перфекционистов вы также можете захотеть исправить вызывающие sbin/hadoop-daemons.sh
, чтобы команды были правильными, когда вы их сбрасываете. В этом случае найдите все вхождения hadoop-daemons.sh
в сценариях Hadoop и замените --script "$bin"/hdfs
на --script hdfs
(и все --script "$bin"/something
только на --script something
). В моем случае все вхождения равны hdfs
, и поскольку ведомая сторона перепишет путь к команде, когда он связан с hdfs
, команда отлично работает как с этим исправлением, так и без него.
Вот пример исправления в sbin/start-secure-dns.sh
.
Сдача:
"$HADOOP_PREFIX"/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start datanode $dataStartOpt
to
"$HADOOP_PREFIX"/sbin/hadoop-daemons.sh --config $HADOOP_CONF_DIR --script hdfs start datanode $dataStartOpt
В моей версии (Hadoop v2.7.7) необходимо исправить следующие файлы:
sbin/start-secure-dns.sh
(1 раз)
sbin/stop-secure-dns.sh
(1 раз)
sbin/start-dfs.sh
(5 раз)
sbin/stop-dfs.sh
(5 раз)
Объяснение
В sbin/slaves.sh
строка, которая соединяет ведущее устройство с ведомыми через ssh
, гласит:
ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
2>&1 | sed "s/^/$slave: /" &
Я добавил 3 строки перед ним, чтобы сбросить переменные:
printf 'XXX HADOOP_SSH_OPTS: %s\n' "$HADOOP_SSH_OPTS"
printf 'XXX slave: %s\n' "$slave"
printf 'XXX command: %s\n' $"${@// /\\ }"
В sbin/hadoop-daemons.sh
строка, вызывающая sbin/slaves.sh
, читается (я разделил ее на 2 строки, чтобы предотвратить прокрутку):
exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_PREFIX" \; \
"$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"
Сценарий sbin/start-dfs.sh
вызывает sbin/hadoop-daemons.sh
. Вот результат выполнения sbin/start-dfs.sh
:
Starting namenodes on [master]
XXX HADOOP_SSH_OPTS:
XXX slave: master
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: namenode
master: starting namenode, logging to /home/hduser/hadoop-2.7.7/logs/hadoop-hduser-namenode-akmacbook.out
XXX HADOOP_SSH_OPTS:
XXX slave: slave1
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: datanode
slave1: bash: line 0: cd: /home/hduser/hadoop-2.7.7: Permission denied
slave1: bash: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh: Permission denied
Starting secondary namenodes [master]
XXX HADOOP_SSH_OPTS:
XXX slave: master
XXX command: cd
XXX command: /home/hduser/hadoop-2.7.7
XXX command: ;
XXX command: /home/hduser/hadoop-2.7.7/sbin/hadoop-daemon.sh
XXX command: --config
XXX command: /home/hduser/hadoop-2.7.7/etc/hadoop
XXX command: --script
XXX command: /home/hduser/hadoop-2.7.7/sbin/hdfs
XXX command: start
XXX command: secondarynamenode
master: starting secondarynamenode, logging to /home/hduser/hadoop-2.7.7/logs/hadoop-hduser-secondarynamenode-akmacbook.out
Как вы можете видеть из приведенного выше результата, скрипт не учитывает подчиненную сторону .bashrc
и etc/hadoop/hadoop-env.sh
.
Решение
Из приведенного выше результата мы знаем, что переменная $HADOOP_CONF_DIR
разрешается на стороне мастера. Проблема будет решена, если она будет решена на ведомой стороне. Однако, поскольку оболочка, созданная ssh
(с прикрепленной командой), является неинтерактивной оболочкой, сценарий .bashrc
не загружается на подчиненной стороне. Поэтому следующая команда ничего не печатает:
ssh slave1 'echo $HADOOP_HOME'
Мы можем заставить его загрузить .bashrc
:
ssh slave1 'source .bashrc; echo $HADOOP_HOME'
Однако следующий блок в .bashrc
(по умолчанию в Ubuntu 18.04) защищает неинтерактивные оболочки:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
На этом этапе вы можете удалить вышеуказанный блок из .bashrc
, чтобы попытаться достичь цели, но я не думаю, что это хорошая идея. Я не пробовал, но думаю, что охрана там неспроста.
На моей платформе (Ubuntu 18.04) при интерактивном входе в систему (через консоль или ssh) .profile
загружает .bashrc
, а .bashrc
загружает .bash_aliases
. Поэтому у меня есть привычка оставлять все .profile
, .bashrc
, .bash_logout
без изменений, а любые настройки вносить в .bash_aliases
.
Если на вашей платформе .bash_aliases
не загружается, добавьте к .bashrc
следующий код:
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
Вернемся к проблеме. Поэтому мы могли бы загрузить .bash_aliases
вместо .bashrc
. Итак, следующий код выполняет свою работу, и печатается $HADOOP_HOME
со стороны подчиненного устройства:
ssh slave1 'source .bash_aliases; echo $HADOOP_HOME'
Применив эту технику к скрипту sbin/hadoop-daemons.sh
, вы получите упомянутый выше Краткий ответ.
person
Siu Ching Pong -Asuka Kenji-
schedule
02.03.2019