개요
주요 설정 정보
core-site.xml
<configuration>
HDFS의 기본이름을 의미, URL형태로 사용, 데이터노드는 여러 작업을 진행하기 위해 반드시 네임노드의 주소를 알고 있어야 한다.
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
하둡에서 발생하는 임시 데이터를 저장하기 위한 공간
<property>
<name>hadoop.tmp.dir</name>
<value>/hadoop_tmp/hadoop/tmp</value>
</property>
HDFS웹 UI에 콘텐트를 렌더링 할때 필터링할 사용자 이름.
<property>
<name>hadoop.http.staticuser.user</name>
<value>서버의 계정 이름</value>
</property>
bz2 및 zlib 압축 코덱에 네이티브 라이브러리를 사용할지 여부,
다른 네이티브 라이브러리를 제어하지 않습니다.
<property>
<name>io.native.lib.available</name>
<value>true</value>
</property>
압축/압축 해제에 사용할 수 있는 압축 코덱 클래스의 쉼표로 구분된 목록,
이 속성으로 지정된 모든 클래스(우선 순위가 있음) 외에도 클래스 경로의 코덱 클래스는 Java ServiceLoader를 사용하여 검색된다.
<property>
<name>io.compression.codecs</name>
<value>org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec,org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
시퀀스 파일에서 사용할 버퍼의 크기,
이 버퍼의 크기는 하드웨어 페이지 크기(Intel x86의 경우 4096)의 배수여야 하며 읽기 및 쓰기 작업 중에 버퍼링되는 데이터의 양을 결정
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
</property>
rack awareness 를 설정해 주기 위한 스크립트 파일 위치를 등록 (아래 rack awareness 정보 참조)
<property>
<name>net.topology.script.file.name</name>
<value>/home/zumse/programs/config/hadoop/rack/rack-topology.sh</value>
</property>
exclude.hosts 에 클러스터 예외 목록파일 작성
<property>
<name>dfs.hosts.exclude</name>
<value>/home/zumse/programs/config/hadoop/exclude.hosts</value>
<final>true</final>
</property>
</configuration>
Cf) 클러스터를 다시 시작하지 않고 데이터 손실 없이 데이터 노드를 해지하는 방법
1. exclude.hosts 에 클러스터 예외 목록파일 작성 (데이터 노드 해지 목록)
2. 그 후 아래처럼 exclude.hosts의 경로를 작성해주고
3. 다음 명령어를 실행하여 데이터 노드 해지
- $bin/hadoop dfsadmin -refreshNodes
4. 만약 해지한 데이터 노드를 다시 추가시키고 싶다면 클러스터 예외 목록 파일에서 해당 노드를 제거한 후
$bin/hadoop dfsadmin -refreshNodes 실행
hdfs-site.xml
<configuration>
HDFS의 저장될 데이터의 복제본 개수, 이 값을 1로 하면 가상 분산 모드로 하둡을 실행, 완전 분산 모드로 하려고 하기 때문에 3으로 설정
3으로 설정되어 있을 경우 각 블록을 3개의 노드에 나누어 기록하며, 파일 저장시 실제 파일의 3배의 용량이 필요하다.
이 설정은 모든 파일을 기준으로 하는것이 아니라 파일이 기록되는 시점에 설정된 값으로 적용된다.
즉, 어떤 파일이 기록되는 시점에 값이 2였지만 이후 3으로 변경되었다고 해서 블록을 한번 더 복제하지는 않는다.
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
네임노드의 HDFS 파일시스템 메타데이터를 저장하는 경로의 목록
공백이 들어가면 안되며, 각 경로는 콤마(,)로 구분한다.
<property>
<name>dfs.namenode.name.dir</name>
<value>/data1/hadoop/namenode,/data2/hadoop/namenode,/data3/hadoop/namenode</value>
</property>
체크포인팅을 수행후 보조 네임노드에는 previous.checkpoint 디렉토리에 부수적으로 저장된다.
만약 모든 데이타가 날아갔을 경우 네임노드가 시작될때 -imortCheckpoint 옵션으로 fs.checkpoint.dir 속성에 정의된
디렉토리에서 가장 최근의 메타데이타를 가져온다.
<property>
<name>fs.checkpoint.dir</name>
<value>/data1/hadoop/secondarynamenode</value>
</property>
데이터노드의 HDFS 블록을 저장하는 경로의 목록이다.
이 역시 콤마(,)로 구분되며, 여러 경로를 지정할 수 있다.
단, HDFS자체에서 데이터노드끼리 복제를 하기 때문에 각 경로에 복제를 하지는 않고, 분산 저장을 하게된다.
<property>
<name>dfs.datanode.data.dir</name>
<value>/data1/hadoop/datanode,/data2/hadoop/datanode,/data3/hadoop/datanode</value>
</property>
네임노드용 웹서버의 주소값
네임노드의 HTTP 서버의 호스트명(IP)과 포트
<property>
<name>dfs.namenode.http-address</name>
<value>master:50070</value>
</property>
기본값 10
네임노드는 클라이언트와 다른 데몬의 RPC요청을 처리하는 워커의 스레드 풀이 있다.
스레드풀의 핸들러 수가 많을수록 더 많은 요청(클라이언트의 요청 및 데이터노드의 하트비트, MapReduce/Yarn의 요청 등)들을 동시에 처리할 수 있다.
만약 대형 클러스터이거나, 클라이언트가 많을 경우에는 값을 기본값 이상으로 늘릴 필요가 있다. 필요한 값을 구하는 공식은 log(데이터노드의 수) * 20 이다.
(log는 자연로그, 데이터노드 100 이하는 기본값)
<property>
<name>dfs.namenode.handler.count</name>
<value>100</value>
</property>
기본값 10
데이터노드도 마찬가지로 네임노드와 클라이언트의 요청을 처리하는 스레드 풀이 있다.
<property>
<name>dfs.datanode.handler.count</name>
<value>200</value>
</property>
하나의 Datanode에서 동시에 서비스 가능한 block 개수 제한을 나타낸다.
과거에는 dfs.datanode.max.xcievers라는 이름의 설정이었다.
기본값은 256인데, 우리는 4096으로 바꿨다.
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
기본값 134217728 (bytes) = 128MB
HDFS가 파일을 생성할 때 필요한 블록의 크기이다.
HDFS는 파일을 블록단위의 크기로 쪼개 분산 저장한다.
물론 파일의 크기가 블록보다 작으면 그 크기로 한블록을 생성한다.
또한 블록의 값을 변경한다고 해서 이전에 저장된 파일들의 블록크기가 변경되지는 않는다.
<property>
<name>dfs.block.size</name>
<value>268435456</value>
</property>
HDFS 밸런서는 분산된 블록의 균형을 맞추기 위한 도구로,
공간이 부족한 데이터노드의 블록들을 여유가 있는 데이터노드로 옮기는 역할을 한다.
하지만 이런 균형조작에 전송률을 소모하여 다른 작업을 방해할 수 있다.
이를 방지하기 위해 밸런서의 네트워크 대역폭을 제한할 필요가 있다. 이 값의 단위는 바이트 단위이다.
<property>
<name>dfs.datanode.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>
</configuration>
yarn-site.xml
<configuration>
맵리듀스 어플리케이션을 위해 세팅되어야 하는 Shuffle 서비스명(mapreduce_shuffle로 지정하면 된다.)
보조서비스 이름은 알파벳 대소문자와 숫자 및 언더바(_)만 허용되며, 숫자로 시작할 수 없다.
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
기본값 org.apache.hadoop.mapred.ShuffleHandler
aux-services의 구현 클래스, 별도의 ShuffleHandler를 구현하지 않았다면 기본값을 사용하면 된다.
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>master:8081</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>master:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>master:8031</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>master:8032</value>
</property>
<property>
<name>yarn.resourcemanager.admin.address</name>
<value>master:8033</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>master:8088</value>
</property>
노드메니저가 컨테이너를 위해 사용할 수 있는 총 CPU코어(가상코어포함)의 개수
기본값 8
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>6</value>
</property>
노드메니저가 컨테이너를 위해 사용할 수 있는 총 메모리 크기
기본값 8192 (MB)
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
리소스메니저가 허용하는 가장 큰 컨테이너의 CPU코어(가상코어포함)의 개수
어플리케이션은 이 이상의 CPU코어 개수를 가진 컨테이너를 요청할 수 없다.
기본값 32
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>3</value>
</property>
리소스매니저가 허용하는 가장 작은 컨테이너의 메모리 크기
어플리케이션이 이 값보다 작은 메모리를 가진 컨테이너를 요청하면 이 값으로 변경된 컨테이너를 할당한다.
기본값 1024 (MB)
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
리소스메니저가 허용하는 가장 큰 컨테이너의 메모리 크기
어플리케이션은 이 이상의 메모리 크기를 가진 컨테이너를 요청할 수 없다.
기본값 8192 (MB)
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
노드에서 에플리케이션 마스터를 실행할 때 할당하는 메모리
yarn.app.mapreduce.am.resource.mb은 2GB 이상으로 설정해주도록 하자.
단, 이 값은 yarn.scheduler.maximum-allocation-mb 값보다는 작아야 한다.
<property>
<name>yarn.app.mapreduce.am.resource.mb</name>
<value>4096</value>
</property>
애플리케이션 마스터의 힙사이즈
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value>-Xmx3276m</value>
</property>
</configuration>
mapred-site.xml
<configuration>
Hadoop YARN을 위한 실행 프레임워크 classic, local, yarn 을 선택할 수 있다.
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
맵리듀스 작업히스토리 서버 host:port(default : 10020)
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
맵리듀스 작업히스터리 서버 웹 UI host:port(default : 19888)
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
작업을 제출하는 동안 사용되는 준비 디렉터리
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/mapred</value>
</property>
맵을 위해 사용될 리소스 용량(default : 1536)
<property>
<name>mapreduce.map.memory.mb</name>
<value>2048</value>
</property>
리듀스를 위해 사용될 리소스 용량(default : 3072)
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
맵의 자식 jvm의 힙사이즈(default : -Xmx1024m)
Xms512m : 최초 할당 힙 사이즈 0.512 GB
Xmx1638m : 최대 할당 힙 사이즈 1.638 GB
XX:NewRatio : new 공간 할당 사이즈
Djava.net.preferIPv4Stack : IPv4 활성화
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1638m -Xms512m -server -XX:NewRatio=8 -Djava.net.preferIPv4Stack=true</value>
<final>ture</final>
</property>
리듀스의 자식 jvm의 힙사이즈 (default : -Xmx2560m)
Xms512m : 최초 할당 힙 사이즈 0.512 GB
Xmx1638m : 최대 할당 힙 사이즈 1.638 GB
XX:NewRatio : new 공간 할당 사이즈
Djava.net.preferIPv4Stack : IPv4 활성화
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx3276m -Xms512m -server -XX:NewRatio=8 -Djava.net.preferIPv4Stack=true</value>
<final>ture</final>
</property>
이 옵션을 true로 설정하면 맵 태스크의 출력 데이터를 압축 파일로 생성한다.
맵 출력 데이터를 압축해서 네트워크 트래픽을 줄이는 방법이다.
<property>
<name>mapreduce.compress.map.output</name>
<value>true</value>
</property>
압축 방식을 설정할 수 있다.
압축된 파일은 네트워크를 통해 리듀스 태스크로 전송된 후,
압축 해제되어 리듀스 태스크의 입력 데이터로 사용된다.
<property>
<name>mapreduce.map.output.compression.codec</name>
<value>org.apache.hadoop.io.compress.SnappyCodec</value>
</property>
</configuration>
hadoop-env.sh
- hadoop 실행 정보 설정을 위한 shell script
export JAVA_HOME=${JAVA_HOME}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
if [ "$HADOOP_CLASSPATH" ]; then
export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
else
export HADOOP_CLASSPATH=$f
fi
done
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS"
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_IDENT_STRING=$USER
export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -Xmx24576m"
export HADOOP_DATANODE_OPTS="$HADOOP_DATANODE_OPTS -Xmx4096m"
slaves
slave01
slave02
slave03
slave04
slave05
slave06
slave07
slave08
slave09
slave10