Hadoop 운영을 위한 설정 정보 상세분석( Crawl )

Q·2022년 12월 1일
1

개요

  • 해당 설정 정보는 CrawlWeb Document를 저장 하는 용도Hadoop서버를 기준으로 운영을 하기위한 설정 정보 입니다.
  • 앞의 Hadoop Cluster 구성이 되어 있어야 합니다.
  • heap 메모리 구조와 GC 알고리즘을 알고 있어야 합니다.
  • JAVA 메모리 설정을 알고 있어야 합니다.

주요 설정 정보

core-site.xml

  • hdfs, mapred 공통 설정
<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

  • hdfs 설정
<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

  • yarn 설정
<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

  • mapred 설정
<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"}

# 추가 Java CLASSPATH 요소. 용량 스케줄러를 자동으로 삽입합니다.
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

# HBASE_OPTS : 마스터를 포한한 전체 서버 프로세스에 적용
# -Djava.net.preferIPv4Stack=true : IPv4 를 우선적으로 사용하게 설정 
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

# HADOOP_NAMENODE_OPTS : 네임노드 서버 프로세스에만 적용
# -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS : Namenode에서 garbage 수집 로깅 활성화
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"

# HADOOP_DATANODE_OPTS : 데이터노드 서버 프로세스에만 적용
# -Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS : Datanode에서 garbage 수집 로깅 활성화
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"

# HADOOP_SECONDARYNAMENODE_OPTS : 보조네임노드 서버 프로세스에만 적용
# -Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS : SecondaryNamenode에서 garbage 수집 로그 활성화
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"


# portmap 서비스는 NIS와 NFS와 같은 RPC 서비스에 사용되는 동적 포트 할당 데몬
# portmap의 최대 할당 힙사이즈 0.512GB
# HADOOP_NFS3_OPTS : 하둡 nfs3 게이트웨이 설정
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS"

# client의 최대 할당 힙사이즈 0.512GB
# 다음은 여러 명령(fs, dfs, fsck, distcp 등)에 적용 된다.
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"

# 보안 데이터노드에서 사용자는 권한을 삭제한 후 데이터노드를 실행
# 권한 있는 포트를 사용하는 경우 보안 HDFS를 활성화할때 사용
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}

# HADOOP_SECURE_DN_LOG_DIR : 보안 데이터 환경에서 로그 파일이 저장되는 위치
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}

# 하둡 pid 디렉토리 위치
# 이 디렉토리는 사용자만 쓸 수 있는 디렉토리로 설정해야 한다.
# symlink 공격 가능성.
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}

# 이 hadoop 인스턴스를 나타내는 문자열입니다. 기본적으로 $USER.
export HADOOP_IDENT_STRING=$USER

# Namenode의 최대 힙사이즈 24.576GB
export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -Xmx24576m"

# Datanode의 최대 힙사이즈 4.096GB
export HADOOP_DATANODE_OPTS="$HADOOP_DATANODE_OPTS -Xmx4096m"

slaves

  • 10개의 slaves로 구성
slave01
slave02
slave03
slave04
slave05
slave06
slave07
slave08
slave09
slave10
profile
Data Engineer

0개의 댓글