Не удается запустить кластер с namenode (мастер): разные $HADOOP_HOME на узле данных (ведомом) и namenode (мастер)

Я использую Hadoop 1.2.1 на ведущем и подчиненном устройствах, но они установлены в разных каталогах. Поэтому, когда я вызываю bin/start-dfs.sh на мастере, я получаю следующую ошибку.

partho@partho-Satellite-L650: starting datanode, logging to /home/partho/hadoop/apache/hadoop-1.2.1/libexec/../logs/hadoop-partho-datanode-partho-Satellite-L650.out
hduser@node2-VirtualBox: bash: line 0: **cd: /home/partho/hadoop/apache/hadoop-1.2.1/libexec/..: No such file or directory**
hduser@node2-VirtualBox: bash: **/home/partho/hadoop/apache/hadoop-1.2.1/bin/hadoop-daemon.sh: No such file or directory**
partho@partho-Satellite-L650: starting secondarynamenode, logging to /home/partho/hadoop/apache/hadoop-1.2.1/libexec/../logs/hadoop-partho-secondarynamenode-partho-Satellite-L650.out

Демоны прекрасно создаются на Мастере, как вы можете видеть ниже.

partho@partho-Satellite-L650:~/hadoop/apache/hadoop-1.2.1$ jps
4850 Jps

4596 DataNode

4441 NameNode

4764 SecondaryNameNode

Очевидно, что Hadoop пытается найти hadoop-daemon.sh и libexec на ведомом устройстве, используя $HADOOP_HOME на ведущем.

Как настроить отдельные узлы данных/ведомые устройства таким образом, чтобы при запуске кластера с главного устройства домашний каталог Hadoop для соответствующих подчиненных устройств проверялся на наличие hadoop-daemon.sh?


person user2963898    schedule 11.01.2015    source источник


Ответы (4)


Hadoop обычно устанавливает переменную среды HADOOP_HOME на каждом узле в файле с именем hadoop-env.sh.

Вы можете обновить файл hadoop-env.sh на каждом узле, указав путь для соответствующего узла. Возможно, он должен быть в /home/partho/hadoop/apache/hadoop-1.2.1/. Вероятно, сначала нужно остановить кластер, чтобы он принял изменения.

Если у вас установлена ​​локация, запустите locate hadoop-env.sh или найдите /-name "hadoop-env.sh"

person Blake Russo    schedule 24.11.2016

Для лучшего решения для этого вы должны сохранить каталог hadoop в любом каталоге, но он должен быть одинаковым для обоих, например: Пример:

на главном пути:

/opt/hadoop

на рабском пути

/opt/hadoop

не имеет значения, какую версию вы используете, но имя каталога должно быть одинаковым

person Hmnt Jangir    schedule 06.09.2018
comment
Версия должна иметь значение. Свойства Hadoop3 не будут работать на Hadoop 2 или 1 - person OneCricketeer; 06.09.2018
comment
почему бы не работать нормально, если у вас есть hadoop3 на ведущем и hadoop2 на подчиненном, но имя каталога должно быть как у hadoop только на обоих, оно будет брать данные с главного и искать тот же файл конфигурации на подчиненном устройстве. - person Hmnt Jangir; 06.09.2018
comment
Имена каталогов и местоположения не важны. Протокол, используемый клиентами при общении с мастером, и свойства, которые они считывают из файлов, имеют значение. - person OneCricketeer; 06.09.2018
comment
Например, если у вас есть файл свойств с включенными контейнерами YARN Docker и настройками Erasure Coding HDFS, он будет работать только на Hadoop3, не более того. - person OneCricketeer; 06.09.2018
comment
API поддерживаются Hadoop в Hadoop 3, 2, 1 совместимы - person Hmnt Jangir; 06.09.2018

После того, как вы настроили кластер, для запуска всех демонов с мастера

bin/hadoop namenode -format(if required)
bin/stop-dfs.sh
bin/start-dfs.sh
bin/start-mapred.sh

Чтобы запустить все узлы с мастера,

- you need to install ssh on each node
- once you install ssh and generate ssh key in each server, try connecting each nodes from master
- make sure slaves file in master node has all Ips of all nodes

Таким образом, команды будут

- install ssh(in each node) : apt-get install openssh-server
- once ssh is installed,generate key : ssh-keygen -t rsa -P ""
- Create password less login from namenode to each node:
  ssh-copy-id -i $HOME/.ssh/id_rsa.pub user@datanodeIP
  user - hadoop user on each machine`enter code here`
- put all nodes ip in slaves(in conf dir) file in namenode
person Asm    schedule 12.01.2015

Краткий ответ

На стороне мастера

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