View

순서

  1. 머신 준비
    • hadoop document 기준 권장사항 NameNode 1대,ResourceManager 1대, DataNode와 NodeManager은 일반적으로 같은 머신(하둡은 기본 3개의 복제본을 가지기 때문에 3대이상 권장)
  2. hadoop 사용 계정 생성
  3. key 기반 ssh 통신 설정
  4. 하둡 환경변수 및 옵션 설정
  5. 각 머신에 파일 배포
  6. 실행


기본사항(사전에 알아야 할 것들)

구성

클러스터내의 모든 시스템이 software(파일)를 가지고 있어야 함. 일반적으로 클러스터는 NameNode, ResourceManager를 각 1대 씩 세팅하고 DataNode와 NodeManager를 같이 동작시키는 machine들로 구성함. 여러가지 상황에 따라 Web App Proxy Server나 MapReduce Job History Server를 구성.


환경설정

기본환경변수 설정 

JAVA_HOME, HADOOP_HOME

#vi /etc/profile
export JAVA_HOME=/opt/java
export HADOOP_HOME=/opt/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/sbin
#source /etc/profile

환경설정파일들

하둡 파일을 다운받아보면 etc/hadoop 폴더안에 수많은 환경설정 파일이 있는데 두가지로 나뉨.
  • read-only default configuration : core-default.xml, hdfs-default.xml, yarn-default.xml, mapred-default.xml
  • site-specific configuration : core-site.xml, hdfs-site.xml, yarn-site.xml and mapred-site.xml
다시말해서 xxxx-default.xml 파일은 건드리지말고 각 환경에 따라 xxxx-site.xml 파일만 수정하면됨. bin 디렉토리안에는 하둡을 실행하는 스크립트들이 있는데 이 실생 스크립트들은 환경설정 파일 etc/hadoop/hadoop-env.sh, etc/hadoop/yarn-env.sh의 파일을 수정하면 됨.

주요 환경설정 값들

xml 파일에 설정되어지는 주요 환경설정 값들. hdfs가 원하는데로 동작을 하지 않거나 주소 또는 포트 조정을 하고자할 때 이 파일들을 편집하면 됨. 주요 환경설정 값들은 ClusterSetup 의 Configuring the Hadoop Daemons 섹션을 참고.


데몬구성

HDFS 데몬은 NameNode, SecondaryNameNode, DataNode로 구성되있고 YARN 데몬은 ResourceManager. NodeManager, WebAppProxy로 구성되있음. MapReduce를 쓴다면 MapReduce Job History Server를 돌려야함.


데몬 실행 옵션

etc/hadoop/hadoop-env.sh 파일 또는 상황에 따라서 mapred-env.sh, yarn-env.sh를 설정해서 데몬 실행에 옵션을 줄 수 있음.

하둡에는 여러가지 요소(hdfs, yarn 등)가 있는데 각 데몬에 옵션을 주려면 etc/hadoop/hadoop-env.sh, mapred-env.sh, yarn-env.sh 파일에 설정해서 옵션을 줄 수 있음. 각 요소별 변수는 정해져있음.


DaemonEnvironment Variable
NameNodeHDFS_NAMENODE_OPTS
DataNodeHDFS_DATANODE_OPTS
Secondary NameNodeHDFS_SECONDARYNAMENODE_OPTS
ResourceManagerYARN_RESOURCEMANAGER_OPTS
NodeManagerYARN_NODEMANAGER_OPTS
WebAppProxyYARN_PROXYSERVER_OPTS
Map Reduce Job History ServerMAPRED_HISTORYSERVER_OPTS


예를들어서 hdfs를 실행할 때 namenode의 옵션을 조정정하고 싶다면 etc/hadoop/hadoop-env.sh에 아래와 같이 쓰면 됨


export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx4G"


슬레이브 노드 설정

슬레이브 노드는 hadoop cluster에서 datanode, nodemanager 역할을 맡게 되는데 etc/hadoop/workers 파일에 슬레이브로 사용할 호스트 주소를 적으면 됨. 보통은 /etc/hosts 파일에 도메인을 임시로 등록하거나 등의 방법을 이용해서 도메인으로 등록하는 방식을 많이 사용함. 마스터에서는 ssh를 통해서 슬레이브와 통신하게 되는데 사전에 마스터의 ssh키를 슬레이브에 등록해야 함.


설치

java 설치 및 JAVA_HOME 은 설정되어 있다고 가정
설치 폴더는 /opt
각각 NN.com(NameNode), SC(SecondaryNameNode).com. RM(ResourceManager).com, JH(JobHistoryServer), SL0(Slave0).com, SL1.com 등의 호스트 주소를 사용한다고 가정

ssh 설정

  1. Master/Slave : 하둡계정 생성
  2. Master : ssh 키 생성
  3. Master : ssh키를 각 Slave에 등록
  4. Master : 확인
하둡 실행용 계정 생성 : 하둡에서는 hadoop 이라는 계정이 root가 됨. 리눅스 root 계정으로 실행해도 hdfs상에서는 root대접을 받을 수 없음)
#adduser hadoop
// 비밀번호 및 기타 설정 진행
#su hadoop
// 이후 과정은 hadoop 계정 권한으로 진행
$ssh-keygen
// ssh 설정 진행, 비밀번호는 개발용이므로 없는 것으로,
$cat /home/hadoop/.ssh/id_rsa.pub
// 이 파일의 내용을 사용하고자 하는 모든 Slave Node의 /home/hadoop/.ssh/authorized_keys 파일에 복제(파일이 없으면 새로 만들면 됨)
$ssh slave주소
// 인증관련 yes or no 퀘스쳔이 나오고 바로 접속되면 성공한 것, 비밀번호를 물어본다면 제대로 등록되지 않은 것

다운로드 및 설정(개발용)

  1. 파일 다운로드
  2. 설정
  3. 파일배포
  4. 실행
하둡페이지에서 hadoop***.tar.gz 다운로드
/opt#wget 다운로드주소
// 이하 opt 생략
#tar zxvf hadoop***.tar.gz
#ln -sf hadoop-xxx-xxxx hadoop
// 링크를 만들어 놓으면 앞으로 편함
#cd hadoop/etc/hadoop/etc
// 이 폴더는 앞서 언급했던 환경설정 xml 파일이 있는 곳, ***-site.xml 파일만 수정하면 된다

이 곳의 xml 파일들은 기본적으로 xml 태그안에 
1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
 <property>
  <name>fs.defaultFS</name>
  <value>hdfs://master.com</value>
  <description>hi</description>
 </property>
 <property>
  .....
 </property>
 
</configuration>
 
cs
이와같은 형태로 xml > configuration 태그 안에 property의 반복으로 이루어져 있음. description은 없어도 됨

아래는 본인이 개발하면서 사용했던 개발용 옵션들이며, 포트 값들은 공식 문서에서 default로 하는 값들을 사용하고 있음
기타 true/false나 숫자들은 입맛에 맞게 바꾼 경우가 있음
(보안관련 이슈들로 배포용으로 사용하면 안됨)

name 

value 

description

-------- core-site.xml --------

fs.defaultFS

hdfs://NN.com:9000

 hadoop은 클라이언트(접속하고자 하는 앱 등, slave가 아님)에서 접속할 때 http, hdfs 프로토콜을 지원하는데 hdfs 프로토콜을 사용할 때 엑세스하는 master의 주소 

hadoop.security.authorization

false 

 kerberos나 기타 인증을 통해서 hadoop을 사용할 것인지?

hadoop.proxyuser.{계정}.hosts

*

 클라이언트에서 master에 엑세스할 때 값에 나열된 host에서만 사용할 수 있다. 예를들어서 192.168.1.1 로 값을 지정하면 192.168.1.1에서만 {계정}을 사용하여 엑세스 해서 사용할 수 있다. 이 값과 아래 proxyuser 값들은 애플리케이션 개발하거나 다른 hadoop echosystem을 사용할 때 권한과 관련해서 많이 설정하게 되는데 예를들어서 hue(오픈소스 hadoop web UI)를 사용하려고 하면 hue는 hadoop에 'hue'라는 계정으로 엑세스하게 되는데 proxyuser 설정을 통해서 접속 허가나 권한을 주지 않으면 hue 계정은 hdfs에 접근할 수 없게 된다.

hadoop.proxyuser.{계정}.groups

 클라이언트에서 {계정}을 통해 접속하면 그 계정은 값에 나열된 그룹의 권한으로 활동이 가능하다.

hadoop.proxyuser.{계정}.users

*

 클라이언트에서 {계정}을 통해서 접속하면 그 계정은 값에 나열된 유저로 impersonate 한다. 

-------- hdfs-site.xml --------

dfs.namenode.name.dir

PATH 

 네임노드에서 실제로 구동에 필요한 파일이나 이미지등을 저장하는 local filesystem의 path 

dfs.datanode.data.dir

PATH 

 dfs.namenode.name.dir의 datanode 버전 

dfs.blocksize

134217728

 하둡은 파일을 block 형태로 보관하는데 이 블록사이즈를 설정. 기본 128MB 

dfs.replication 

 하둡은 안정성, 병렬처리 등의 이유로 block을 이 설정값에 따라 복제해서 각 데이터노드에 보관하는데 기본값은 3개. 이 때문에 기본적으로 3개 이상의 데이터노드를 권장함

dfs.secondary.http.address 

SC.com:9868

 하둡은 크게 NameNode, SecondaryNode, DataNode로 구성되는데 SecondaryNode의 http 접속 주소를 설정

dfs.permissions

false 

 false로 하면 파일에 대한 권한 체크를 하지 않는다. 모든 계정이 모든 파일에 엑세스할 수 있다. 

dfs.datanode.dns.namenserver

DNS 값

 저장한 파일을 다시 받아갈 때 네임노드를 통해서 파일을 받으려고 하면 네임노드는 직접 주지 않고 '1번 데이터노드에서 받아가세요' 하면서 파일을 받을 수 있는 데이터노드의 주소를 반환하는데 1번 데이터노드의 ip주소를 돌려준다. 이 설정값을 바로 앞 주소로 설정 해 놓으면(예를들어 a.b.c.com의 경우 b.c.com)통해서 dns를 설정하면 정상적으로 도메인주소로 반환해준다. 

-------- yarn-site.xml --------

yarn.resourcemanager.address

RM.com:8032 

resource manager의 내부 통신용 포트로써 브라우저로 접속해도 아래와 같은 문구가 나옴 'It looks like you are making an HTTP request to a Hadoop IPC port. This is not the correct port for the web interface on this daemon.'

yarn.resourcemanager.scheduler.address

RM.com:8030 

yarn.resourcemanager.resource-tracker.address

RM.com:8031 

yarn.resourcemanager.admin.address

RM.com.8033

yarn.resourcemanager.webapp.address

RM.com:8088 

 yarn의 web UI, 접속하면 yarn의 상태와 submission의 작업 상태등을 확인할 수 있다.

yarn.resourcemanager.hostname

RM 

 yarn 관련 설정 중에 address 관련 설정들은 이 프로퍼티의 값을 가지고 뒤에 기본 포트를 붙여서 동작한다. 

yarn.nodemanager.local-dirs 

PATH 

 slave에서 구동되는 NodeManager가 작업시 생성되는 파일들이 보관되는 local path

yarn.nodemanager.log-dirs

PATH 

 NodeManager의 컨테이너 로그를 저장하는 장소 

yarn.nodemanager.remote-app-log-dir

PATH

 Where to aggregate logs to. 로그를 집계한다는데 설정 값에 따라 hdfs로도 로그가 저장이 됨.

yarn.nodemanager.remote-app-log-suffix

logs 

 이 값은 위 remote-app-log-dir 설정값에 /${user}/logs 와 같은 형태로 저장되게 해준다.

yarn.log-aggregation-enable

true

 로그를 수집할 것인지, 말것인지 설정. 이 값을 true로 하면 app(사용자가 yarn으로 보낸 사용자 프로그램)이 완료되고나서 remote-app-log-** 설정값에 따라 로그가 저장되고 Application Timeline Server를 통해서 볼 수 있음.

yarn.nodemanager.resource.memory-mb

-1 

 MB 단위, 컨테이너에 할당할 physical memory. 이 값이 -1이고 yarn.nodemanager.reousrce.detect-hardware-capabilities가 true면 자동으로 계산됨. 아니면 기본값 8192MB로 잡힘. 

yarn.nodemanager.resource.detect-hardware-capabilities

true

 yarn에서 memory와 cpu를 auto-detection해서 여러 값들을 자동으로 적절한 값으로 설정해주게 허락해준다

-------- mapred-default.xml --------

mapreduce.framework.name 

yarn

 MapReduce job을 실행하기 위한 runtime framework. local/classic/yarn 이 설정 가능함

mapreduce.jobhistory.address 

JH.com:10020

 JobHistoryServer의 IPC 주소

mapreduce.jobhistory.webapp.address

JH.com:19888

 JobHistoryServer의 web ui, JobHistoryServer는 경험상으로는 yarn을 쓰고 다른 hadoop-echosystem의 요소들을 쓰게되면 그 요소들이 yarn의 mapreduce 작업을 사용하는 경우가 생기는데 그 mapreduce 작업에 대한 history를 관리하는 역할을 하는 것 같다.

mapreduce.jobhistory.intermediate-done-dir

PATH

 

mapreduce.jobhistory.done-dir

PATH

 



또 slave는 hadoop폴더/etc/hadoop/workers 등록하면된다.

배포 및 실행

환경설정을 모두 완료하고 hadoop-xxx 폴더 전체를 각 모든 Master/Slave 노드로 옴기고 hadoop:hadoop 권한을 가진 채로 실행하면 완료된다.
/opt 폴더는 보통 새로만든 hadoop 계정에 쓰기권한이 없어서 루트계정으로 scp를 사용해서 넣고 scp를 사용해서 권한을 hadoop:hadoop으로 바꿔주면되는데 편의를 위해서 링크도 만들어 놓으면 나중에 편한 경우가 많아서 각각 접속해서 링크를 만들어 놓는 것을 추천.


// 마스터 노드에서 각 슬레이브 노드로 파일전송 커맨드 예제

#scp -r /opt/apache-hadoop root@SL0.com:/opt/apache-hadoop

// 각 노드에 접속해서 하둡 폴더 권한 모두 변경하면서 같이 링크생성

#chown hadoop:hadoop apache-hadoop -R

#ln -sf apache-hadoop hadoop

#chown hadoop:hadoop hadoop -R


실행파일은 hadoop/sbin 파일 안에 있는 명령어를 주로 사용하는데 3가지 정도가 메인으로 보면된다.


  • start/stop-all.sh : hdfs(namenode, secondarynode, datanode), yarn(resource-manager, node-manager) 모두 실행하거나 종료
  • start/stop-hdfs.sh : hdfs만 실행/종료
  • start/stop-yarn.sh : yarn만 실행/종료
  • mr-jobhistory-daemon.sh : Job History server 실행/종료

$./start-all.sh

위 명령어를 실행해서 에러 없이 실행이 잘 되고 http://NN.com:50070 에 접속했을 때 페이지상에 datanode로 등록한 머신과 configured capacity 가 예상치와 일치하면 얼추 제대로 설치됬다고 할수있다.


$jps


이 명령어를 통해서도 프로세스가 잘올라와있는지 확인할 수 있다.

Share Link
reply