HDFS에서 실행되는 쉘 스크립트에 인라인 매개변수 전달

HDFS에서 실행되는 쉘 스크립트에 인라인 매개변수 전달

저는 oozie 워크플로가 이를 인식할 수 있도록 HDFS에 저장된 셸 스크립트를 실행하고 있습니다. 내가 사용하고 있는 이 스크립트를 실행하세요.

hadoop fs -cat script.sh |exec sh  

하지만 인라인 매개변수를 스크립트에 전달해야 합니다. CLI에서는 그냥 합니다.

./script.sh arg1

그런 다음 $1로 변수를 에코합니다. HDFS에 저장된 스크립트로 동일한 작업을 수행하는 방법을 알아내려고 합니다.

답변1

sh표준 입력 스트림에서 읽는 모든 스크립트를 실행할 수 있습니다 sh -s. 그러나 표준 입력 스트림은 스크립트를 읽는 데 사용되므로 표준 입력의 입력이 필요한 사용자 상호 작용은 예상대로 작동하지 않으며 스크립트는 표준 입력 스트림에서 다른 데이터를 읽지 않습니다.

귀하의 경우, hadoop명령은 이를 실행하는 데 사용할 수 있는 스크립트를 제공합니다 sh -s. sh -s셸에 전달할 명령줄 옵션을 추가합니다 . 다음 코드에서는 래퍼 스크립트의 명령줄 인수가 호출 스크립트에 그대로 전달됩니다.

#!/bin/sh

hadoop fs -cat script.sh | sh -s "$@"

파이프라인의 각 부분이 하위 셸에서 실행되므로 exec호출을 사용하는 것은 불필요합니다.sh -s

답변2

다음과 같은 방법을 시도해 볼 수 있습니다. hadoop fs cat(프로세스 대체에서)에 대한 별도의 호출을 사용하여 각 파일을 검색하고 읽기 위해 열 수 있도록 script.sh에 파일 이름으로 제공합니다.

 # Adjust the hdfs: URLs as necessary
 hadoop fs -cat hdfs://path_to_script/sample.sh | exec bash  \
  <(hadoop fs -cat hdfs://param1) \
  <(hadoop fs -cat hdfs://param2) \
  <(hadoop fs -cat hdfs://param3) \
  <(hadoop fs -cat hdfs://param4)

script.sh가 이미 hdfs에서 읽는 방법을 알고 있다면,

  hadoop fs -cat hdfs://path_to_script/script.sh | exec bash -s param1 param2 param3 param4

그거면 충분할 것 같아요. -s 옵션은 bash에게 표준 입력에서 스크립트를 읽도록 지시하여 param1을 실행할 스크립트 이름으로 착각하지 않도록 합니다.

관련 정보