Не удается выполнить две команды hadoop?

Я хочу запустить следующую команду:

hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input

Он работает, когда я вызываю его из оболочки после того, как я ssh на главный узел. Но это не сработает, если я попытаюсь назвать это через ssh следующим образом:

ssh -i /home/USER/keypair.pem [email protected] hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input

Это дает ошибку:

zsh: command not found: hadoop

Но если я выберу последний канал, команда преуспеет:

ssh -i /home/USER/keypair.pem [email protected] hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz"

Из некоторых поисков я обнаружил, что это может быть связано с ошибкой, когда JAVA_HOME не задан, но он установлен правильно в ~/.bashrc на главном узле

Кластером hadoop является кластер Amazon Elastic Map Reduce.

1
nl ja de
Вы уверены, что вся цепочка команд передается в ssh? Потому что из сообщения об ошибке похоже, что вы просто выполняете hadoop fs -ls hdfs: /// logs/ на удаленном хосте и обрабатываете вывод ssh, хотя grep.
добавлено автор Carsten, источник
Ах, я думаю, что это то, что происходит. Как я могу изменить команду для передачи только на удаленном хосте?
добавлено автор Shane, источник

1 ответы

На хосте reomte выполняется только первая команда вашей цепочки команд с каналами. Остальное происходит локально на вашем компьютере. Поэтому, конечно, если вы не установили hasoop, zsh выведет сообщение об ошибке (и в противном случае он просто поместит его на ваш локальный Hadoop, который, вероятно, не тот, который вы хотите.

Чтобы передать все команды в ssh, вы можете поместить их в кавычки «" или одинарные кавычки '':

ssh -i /home/USER/keypair.pem [email protected] 'hadoop fs -ls hdfs:///logs/ | grep -oh "/[^/]*.gz" | grep -oh "[^/]*.gz" | hadoop fs -put - hdfs:///unzip_input/input'
2
добавлено
Вы также должны указать весь путь к команде hadoop (например, home/hadoop/bin/hadoop) в сценарии оболочки, чтобы избежать команды не найденной
добавлено автор viper, источник
Благодарю. Я фактически использовал командную строку flex-mapreduce для передачи команды ssh, которая, как оказалось, имеет ошибку в ней, где она извлекает кавычки, в которых я был.
добавлено автор Shane, источник