ошибка hadoop 3.1.2 ./start-all.sh, синтаксическая ошибка рядом с неожиданным токеном `‹'

Я запускаю Hadoop 3.1.2 на Mac, и при выполнении ./start-all.sh я получаю сообщение об ошибке

Starting namenodes on [localhost]
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-functions.sh: line 398: syntax error near unexpected token `<'
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-functions.sh: line 398: `  done < <(for text in "${input[@]}"; do'
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 70: hadoop_deprecate_envvar: command not found
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 87: hadoop_bootstrap: command not found
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 104: hadoop_parse_args: command not found
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 105: shift: : numeric argument required
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 244: hadoop_need_reexec: command not found
/usr/local/Cellar/hadoop/3.1.2/libexec/bin/../libexec/hadoop-config.sh: line 252: hadoop_verify_user_perm: command not found

Я открываю hadoop-functions.sh и нахожу информацию ниже в строке 398:

done < <(for text in "${input[@]}"; do
    echo "${text}"
  done | sort)

есть идеи, как это исправить?


person Bargitta    schedule 14.05.2019    source источник
comment
Это похоже на ошибку. Как вы установили Hadoop?   -  person tk421    schedule 15.05.2019
comment
варить установить хауп @tk421   -  person Bargitta    schedule 15.05.2019
comment
Я думаю, что это ошибка, я могу запустить узел имени и узел данных отдельно, но не могу использовать start-all.sh или start yarn @tk421   -  person Bargitta    schedule 15.05.2019
comment
Да, я немного копался в кодовой базе, и это было там какое-то время. Это несовместимость с bash, когда версия bash для MacOS — 3.x, в то время как большинство Linux работают под управлением bash 4.x.   -  person tk421    schedule 15.05.2019
comment
Похоже, древняя версия bash связана с apple.stackexchange.com/questions/193411/.   -  person tk421    schedule 15.05.2019


Ответы (1)


Вы обнаружили ошибку, хотя вряд ли она будет устранена в ближайшее время. MacOS работает с bash 3.x, но этот синтаксис работает на большинстве современных Linux, которые используют bash с версией 4.x.

Согласно Руководству по Bash: Замена процесса <(cmd(s) обрабатывается как файл, поэтому вы можете интерпретировать это как:

for text in "${input[@]}"; do
  echo "${text}"
done | sort > /tmp/results

while read -r line; do
  tmpa[${counter}]=${line}
  ((counter=counter+1))
  IFS='@' read -ra brup <<< "${line}"
  option="${brup[0]}"
  if [[ ${#option} -gt ${maxoptsize} ]]; then
    maxoptsize=${#option}
  fi
done < /tmp/results

Ваши варианты:

  • установить более позднюю версию bash
  • перепишите 2 экземпляра < <( в hadoop-functions.sh, которые являются единственными экземплярами этой конструкции.

использованная литература

person tk421    schedule 15.05.2019