Unix 셸 가이드
Unix 셸 가이드 (Unix Shell Guide)
Apache Hadoop의 기능 대부분은 셸을 통해 제어됩니다. 이 명령들이 어떻게 실행되는지의 기본 동작을 수정하는 방법은 여러 가지가 있습니다.
출처: Unix Shell Guide
중요한 최종 사용자 환경 변수
Apache Hadoop에는 소프트웨어의 다양한 측면을 제어하는 많은 환경 변수가 있습니다(hadoop-env.sh 및 관련 파일 참고). 이 환경 변수 중 일부는 최종 사용자가 런타임을 관리하는 데 전념합니다.
HADOOP_CLIENT_OPTS
이 환경 변수는 모든 최종 사용자, 비데몬 연산에 사용됩니다. 시스템 속성 정의를 통해 어떤 Java 옵션과 어떤 Apache Hadoop 옵션이든 설정하는 데 사용할 수 있습니다. 예를 들어:
HADOOP_CLIENT_OPTS="-Xmx1g -Dhadoop.socks.server=localhost:4000" hadoop fs -ls /tmp
는 메모리를 늘리고 이 명령을 SOCKS 프록시 서버를 통해 보냅니다.
참고: 'YARN_CLIENT_OPTS'가 정의되어 있으면 yarn으로 명령을 실행할 때 'HADOOP_CLIENT_OPTS'를 대체합니다.
(command)_(subcommand)_OPTS
서브커맨드별로 옵션을 설정하는 것도 가능합니다. 이는 특정 경우에 대한 특별한 옵션을 만들 수 있게 해줍니다. 패턴의 첫 번째 부분은 사용되는 명령(모두 대문자)이고, 두 번째 부분은 사용되는 서브커맨드이며, 마지막으로 문자열 _OPT가 이어집니다.
예를 들어 mapred distcp가 2GB 힙을 사용하도록 구성하려면 다음을 사용합니다:
MAPRED_DISTCP_OPTS="-Xmx2g"
이 옵션들은 실행 중 HADOOP_CLIENT_OPTS 뒤에 나타나며 일반적으로 우선합니다.
HADOOP_CLASSPATH
참고: 사이트 전체 설정은 shellprofile 항목을 통해 구성하고, 영구적인 사용자 전체 설정은 hadoop_add_classpath 함수를 사용해 ${HOME}/.hadooprc에서 구성해야 합니다. 자세한 내용은 아래를 참고하세요.
Apache Hadoop 스크립트는 이 환경 변수를 설정함으로써 실행 중인 명령의 클래스패스에 더 많은 내용을 주입할 수 있는 기능이 있습니다. 이는 콜론으로 구분된 디렉터리, 파일, 와일드카드 위치 목록이어야 합니다.
HADOOP_CLASSPATH=${HOME}/lib/myjars/*.jar hadoop classpath
사용자는 HADOOP_USER_CLASSPATH_FIRST 변수로 경로 위치에 대한 힌트를 제공할 수 있습니다. 이 값을 어떤 것으로 설정하면 시스템이 이 경로들을 앞쪽 가까이로 밀어 넣으려고 합니다.
변수의 자동 설정
사용자가 공통 설정 집합을 가지고 있다면 ${HOME}/.hadoop-env 파일에 넣을 수 있습니다. 이 파일은 항상 읽혀 사용자가 커스터마이즈하려는 모든 변수를 초기화하고 덮어씁니다. .bashrc 파일과 유사한 bash 문법을 사용합니다.
예를 들어:
#
# my custom Apache Hadoop settings!
#
HADOOP_CLIENT_OPTS="-Xmx1g"
MAPRED_DISTCP_OPTS="-Xmx2g"
HADOOP_DISTCP_OPTS="-Xmx2g"
.hadoop-env 파일은 기능을 확장하고 Apache Hadoop에 새로운 트릭을 가르치는 데도 사용할 수 있습니다. 예를 들어 환경 변수 ${HADOOP_SERVER}에 참조된 서버에 접근하는 hadoop 명령을 실행하려면 .hadoop-env에 다음이 있으면 됩니다:
if [[ -n ${HADOOP_SERVER} ]]; then
HADOOP_CONF_DIR=/etc/hadoop.${HADOOP_SERVER}
fi
경고 한 가지: 모든 Unix Shell API 루틴이 .hadoop-env에서 사용 가능하거나 올바르게 작동하는 것은 아닙니다. .hadooprc에 대한 자세한 내용은 아래를 참고하세요.
관리자 환경 (Administrator Environment)
다양한 XML 파일 외에도 Unix Shell을 사용할 때 관리자가 Apache Hadoop을 구성할 수 있는 두 가지 핵심 능력이 있습니다.
- 시스템이 어떻게 작동하는지에 영향을 주는 많은 환경 변수. 이 가이드는 몇 가지 핵심 것들만 강조합니다. 일반적으로 더 많은 정보는 다양한 *-env.sh 파일에 있습니다.
- 기존 스크립트를 보완하거나 플랫폼 특정 변경을 수행. Apache Hadoop은 함수 오버라이드 능력을 제공해 그런 작업 없이도 기존 코드 베이스를 그 자리에서 변경할 수 있게 합니다. 함수 교체는 아래 Shell API 문서에서 다룹니다.
(command)_(subcommand)_OPTS
단연 가장 중요한 것은 데몬이 어떻게 작동하는지 제어하는 일련의 _OPTS 변수입니다. 이 변수들은 해당 데몬에 대한 모든 관련 설정을 포함해야 합니다.
위의 사용자 명령과 유사하게 모든 데몬은 (command)_(subcommand)_OPTS 패턴을 존중합니다. 재시작 시 시스템이 사용해야 할 설정을 알도록 이것들을 hadoop-env.sh에 설정하는 것이 일반적으로 권장됩니다. 사용자 대상 서브커맨드와 달리 데몬은 HADOOP_CLIENT_OPTS를 존중하지 않습니다.
또한 추가 보안 모드로 실행되는 데몬은 (command)_(subcommand)_SECURE_EXTRA_OPTS도 지원합니다. 이 옵션들은 일반 *_OPTS에 대한 보충이며 뒤에 나타나므로 일반적으로 우선합니다.
(command)_(subcommand)_USER
Apache Hadoop은 서브커맨드별로 사용자 검사를 하는 방법을 제공합니다. 이 방법은 쉽게 우회될 수 있고 보안 기능으로 간주되어서는 안 되지만, 사고를 방지하는 메커니즘을 제공합니다. 예를 들어 HDFS_NAMENODE_USER=hdfs로 설정하면 hdfs namenode와 hdfs --daemon start namenode 명령이 USER 환경 변수를 확인해 명령을 실행하는 사용자가 hdfs 사용자인지 검증합니다. 이는 비데몬에도 작동합니다. HADOOP_DISTCP_USER=jane으로 설정하면 hadoop distcp 명령을 실행할 수 있기 전에 USER가 jane으로 설정되었는지 검증합니다.
_USER 환경 변수가 있고 명령이 특권(privilege)으로 실행되면(예: root로; API 문서의 hadoop_privilege_check 참고), 실행이 먼저 지정된 사용자로 전환됩니다. 보안상의 이유로 사용자 계정 전환을 지원하고 따라서 SECURE_USER 변수가 있는 명령(아래 더 참고)의 경우, 기본 _USER 변수는 SECURE_USER 계정으로 전환하는 데 사용될 것으로 예상되는 사용자여야 합니다. 예를 들어:
HDFS_DATANODE_USER=root
HDFS_DATANODE_SECURE_USER=hdfs
는 'hdfs --daemon start datanode'가 root가 되도록 강제하지만, 특권 작업이 완료된 후에는 결국 hdfs 사용자로 전환됩니다.
--workers 플래그를 사용하면 사용자 전환이 ssh가 호출된 후에 일어난다는 점을 알아두세요. 그러나 sbin의 다중 데몬 시작 및 중지 명령은 적절하다면 먼저 전환하므로 지정된 _USER의 키를 사용합니다.
개발자 및 고급 관리자 환경
셸 프로파일 (Shell Profiles)
Apache Hadoop은 제3자가 다양한 플러그형 인터페이스를 통해 새 기능을 쉽게 추가할 수 있게 합니다. 여기에는 기본 설치에 필요한 내용을 주입하기 쉬운 셸 코드 하위 시스템이 포함됩니다.
이 기능의 핵심은 셸 프로파일(shell profile) 개념입니다. 셸 프로파일은 클래스패스에 jar를 추가하고, Java 시스템 속성을 구성하는 등의 작업을 할 수 있는 셸 스니펫입니다.
셸 프로파일은 ${HADOOP_CONF_DIR}/shellprofile.d 또는 ${HADOOP_HOME}/libexec/shellprofile.d에 설치할 수 있습니다. libexec 디렉터리의 셸 프로파일은 기본 설치의 일부이며 사용자가 덮어쓸 수 없습니다. 구성 디렉터리의 셸 프로파일은 최종 사용자가 런타임에 구성 디렉터리를 변경하면 무시될 수 있습니다.
셸 프로파일의 예는 libexec 디렉터리에 있습니다.
셸 API (Shell API)
Apache Hadoop의 셸 코드는 관리자와 개발자가 설정과 고급 기능 관리를 돕는 데 사용할 수 있도록 열려 있는 함수 라이브러리가 있습니다. 이 API는 표준 Apache Hadoop 인터페이스 분류를 따르며, 하나가 추가됩니다: Replaceable.
셸 코드는 코어 함수가 오버라이드될 수 있게 합니다. 그러나 모든 함수가 교체될 수 있거나 교체하기에 안전한 것은 아닙니다. 함수가 교체하기에 안전하지 않으면 Replaceable: No 속성을 가집니다. 함수가 교체하기에 안전하면 Replaceable: Yes 속성을 가집니다.
함수를 교체하려면 ${HADOOP_CONF_DIR} 디렉터리에 hadoop-user-functions.sh라는 파일을 만드세요. 이 파일에서 새 교체 함수를 정의하면 시스템이 자동으로 채택합니다. 이 파일에 필요한 만큼 많은 교체 함수가 있을 수 있습니다. 함수 교체의 예는 hadoop-user-functions.sh.example 파일에 있습니다.
Public 및 Stable로 표시된 함수는 셸 프로파일에서 있는 그대로 사용하기에 안전합니다. 다른 함수는 마이너 릴리스에서 변경될 수 있습니다.
사용자 레벨 API 접근
개별 사용자가 hadoop-env.sh를 오버라이드할 수 있게 하는 .hadoop-env 외에도, 사용자는 .hadooprc를 사용할 수 있습니다. 이는 Apache Hadoop 셸 환경이 구성된 후에 호출되며 전체 셸 API 함수 호출 집합을 허용합니다.
예를 들어:
hadoop_add_classpath /some/path/custom.jar
는 .hadooprc에 들어갑니다.
동적 서브커맨드 (Dynamic Subcommands)
셸 API를 활용하면 제3자가 기본 Hadoop 셸 스크립트(hadoop, hdfs, mapred, yarn)에 자신의 서브커맨드를 추가할 수 있습니다.
서브커맨드를 실행하기 전에 기본 스크립트는 (scriptname)subcommand(subcommand) 함수의 존재를 확인합니다. 이 함수는 나머지 모든 커맨드라인 인자를 파라미터로 설정해 실행됩니다. 예를 들어 다음 함수가 정의되어 있으면:
function yarn_subcommand_hello
{
echo "$@"
exit $?
}
yarn --debug hello world I see you를 실행하면 스크립트 디버깅을 활성화하고 yarn_subcommand_hello 함수를 다음과 같이 호출합니다:
yarn_subcommand_hello world I see you
이는 다음 출력을 결과로 냅니다:
world I see you
새 서브커맨드를 사용법 출력에 추가하는 것도 가능합니다. hadoop_add_subcommand 함수는 사용법 출력에 텍스트를 추가합니다. 표준 HADOOP_SHELL_EXECNAME 변수를 활용해 어떤 명령이 새 함수를 얻는지 제한할 수 있습니다.
if [[ "${HADOOP_SHELL_EXECNAME}" = "yarn" ]]; then
hadoop_add_subcommand "hello" client "Print some text to the screen"
fi
특별한 제한이나 추가 능력 등이 없으므로 서브커맨드 유형을 "client"로 설정했습니다. 이 기능은 내장 기능을 오버라이드하는 데에도 사용될 수 있습니다. 예를 들어 다음을 정의하면:
function hdfs_subcommand_fetchdt
{
...
}
기존 hdfs fetchdt 서브커맨드를 사용자 지정 것으로 교체합니다.
동적 서브커맨드에 대한 몇 가지 핵심 환경 변수:
- HADOOP_CLASSNAME - 프로그램 실행이 계속될 때 사용할 Java 클래스의 이름.
- HADOOP_PRIV_CLASSNAME - 데몬이 특권 모드에서 실행될 것으로 예상될 때 사용할 Java 클래스의 이름. (아래 더 참고.)
- HADOOP_SHELL_EXECNAME - 실행 중인 스크립트의 이름. hadoop, hdfs, mapred, yarn 중 하나.
- HADOOP_SUBCMD - 커맨드라인에서 전달된 서브커맨드.
- HADOOP_SUBCMD_ARGS - Apache Hadoop 공통 인자 처리가 이루어진 후의 인자 목록을 포함하는 배열. 서브커맨드 함수에 인자로 전달되는 목록과 동일합니다. 예를 들어 커맨드라인에서
hadoop --debug subcmd 1 2 3이 실행되었다면${HADOOP_SUBCMD_ARGS[0]}는 1이고 hadoop_subcommand_subcmd의 $1도 1입니다. 이 배열 목록은 서브커맨드 함수가 추가 처리를 위해 인자 목록에서 값을 추가하거나 삭제하도록 수정될 수 있습니다. - HADOOP_SECURE_CLASSNAME - 이 서브커맨드가 보안 모드를 지원하는 서비스를 실행하면 이 변수를 보안 버전의 클래스 이름으로 설정해야 합니다.
- HADOOP_SUBCMD_SECURESERVICE - true로 설정하면 hadoop_detect_priv_subcmd와 무관하게 서브커맨드를 강제로 보안 모드에서 실행합니다. HADOOP_SECURE_USER는 최종 프로세스를 실행할 사용자로 설정될 것으로 예상됩니다. 보안 모드에 대한 자세한 내용을 참고하세요.
- HADOOP_SUBCMD_SUPPORTDAEMONIZATION - 이 명령이 데몬으로 실행될 수 있으면 true로 설정.
- HADOOP_USER_PARAMS - 파싱 전의 커맨드라인 전체 내용. --debug 같은 플래그를 포함합니다. 조작해서는 안 됩니다.
Apache Hadoop 런타임 기능은 추가 처리가 필요 없으면 함수가 exit해야 합니다. 예를 들어 위의 hello 예시에서 Java와 다른 기능이 필요하지 않았으므로 간단한 exit $?로 충분했습니다. 그러나 함수가 HADOOP_CLASSNAME을 활용하려면 Hadoop 특정 파라미터가 있는 Java가 주어진 Java 클래스에 대해 실행되도록 프로그램 실행이 계속되어야 합니다. 또 다른 예는 복구할 수 없는 오류의 경우입니다. 적절한 메시지(가능하면 hadoop_error API 호출 사용)를 출력하고 적절히 exit하는 것은 함수의 책임입니다.
특권으로 실행(보안 모드)
DataNode와 NFS 게이트웨이 같은 일부 데몬은 특권 모드로 실행될 수 있습니다. 이는 root로 시작되고 (기본적으로) jsvc를 통해 다른 userid로 전환될 것으로 예상됨을 뜻합니다. 이렇게 하면 이 데몬들이 낮은 특권 포트를 잡은 다음 정상 실행 중에는 슈퍼유저 특권을 버릴 수 있습니다. 동적 서브커맨드를 사용하는 제3자도 특권으로 실행할 수 있습니다. 다음이 모두 참이면:
- (command)_(subcommand)_SECURE_USER 환경 변수가 정의되어 있고 유효한 사용자 이름을 가리킴
- HADOOP_SECURE_CLASSNAME이 정의되어 있고 유효한 Java 클래스를 가리킴
셸 스크립트는 내장 기능처럼 이 클래스를 특권이 있는 명령으로 실행하려고 시도합니다. 일반적으로 사용자는 _SECURE_USER 변수를 정의하고, 개발자는 셸 스크립트 부트스트랩에서 _CLASSNAME을 정의할 것으로 예상됩니다.
더 알아보기 (Learn more)
- 원문: Unix Shell Guide