bash + run cli для запуска команды от пользователя hdfs - PullRequest
0 голосов
/ 27 октября 2019

У меня есть следующие строки в моем bash-скрипте, чтобы исправить реплицированные файлы в HDFS

эталон - https://community.cloudera.com/t5/Community-Articles/Fix-Under-replicated-blocks-in-HDFS-manually/ta-p/244746

  su hdfs -c "hdfs fsck / | grep 'Under replicated' | awk -F':' '{print \$1}' > /tmp/under_replicated_files"

  su hdfs -c "for hdfsfile in `cat /tmp/under_replicated_files`; do echo "Fixing $hdfsfile :" ;  hadoop fs -setrep 3 $hdfsfile; done"

, когда скрипт запускается, его сбой при

: ;  hadoop fs -setrep 3 ; done: -c: line 1: syntax error near unexpected token `/user/ambari-qa/.staging/job_1571913174208_0001/job.split'
: ;  hadoop fs -setrep 3 ; done: -c: line 1: `/user/ambari-qa/.staging/job_1571913174208_0001/job.split'

в то время как файл - /tmp/under_replicated_files, содержит:

/user/ambari-qa/.staging/job_1571913174208_0001/job.jar
/user/ambari-qa/.staging/job_1571913174208_0001/job.split
/user/ambari-qa/.staging/job_1571913174208_0003/job.jar

где я ошибаюсь следующей строкой?

  su hdfs -c "for hdfsfile in `cat /tmp/under_replicated_files`; do echo "Fixing $hdfsfile :" ;  hadoop fs -setrep 3 $hdfsfile; done"

примечание:

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

пример:

su hdfs

$ hdfs fsck / | grep 'Under replicated' | awk -F':' '{print $1}' > /tmp/under_replicated_files
$ for hdfsfile in `cat /tmp/under_replicated_files`; do echo "Fixing $hdfsfile :" ;  hadoop fs -setrep 3 $hdfsfile; done

мы пробовали также с

su hdfs -c "for hdfsfile in `cat /tmp/under_replicated_files`; do echo \"Fixing $hdfsfile :\" ;  hadoop fs -setrep 3 $hdfsfile; done"

но мы получаем:

bash: -c: line 1: syntax error near unexpected token `/user/ambari-qa/.staging/job_1571913174208_0001/job.split'
bash: -c: line 1: `/user/ambari-qa/.staging/job_1571913174208_0001/job.split'
...