원문은 여기
http://hadoop.apache.org/docs/r2.7.5/hadoop-project-dist/hadoop-common/ClusterSetup.html
/* 사전 작업 */
1. host 이름을 각 서버에 할당한다. ( 이때 _ 등이 들어가면, 하둡 실행할때 에러난다. )
[root@HADOOP1 hadoop]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.192.10 HADOOP1 192.168.192.11 HADOOP2
[root@HADOOP1 hadoop]# hostname HADOOP1
2. 양 서버에 하둡을 다운로드 받는다. 디렉토리는 /hadoop 을 기본으로 설정하였다.
[root@localhost ~]# mkdir /hadoop [root@localhost ~]# cd /hadoop [root@localhost ~]# wget http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz --2018-04-07 10:20:24-- http://apache.mirror.cdnetworks.com/hadoop/common/hadoop-2.7.5/hadoop-2.7.5.tar.gz Resolving apache.mirror.cdnetworks.com... 14.0.101.165 Connecting to apache.mirror.cdnetworks.com|14.0.101.165|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 216929574 (207M) [application/x-gzip] Saving to: `hadoop-2.7.5.tar.gz' 100%[============================================================================================>] 216,929,574 2.79M/s in 79s 2018-04-07 10:21:43 (2.63 MB/s) - `hadoop-2.7.5.tar.gz' saved [216929574/216929574]
3. 만약 JAVA 가 설치되어있지 않다면 설치를 따로 해야한다.
wget --no-check-certificate -c --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.rpm rpm -Uvh jdk-8u161-linux-x64.rpm
/* 하둡 데몬들을 위한 환경변수 세팅 */
아래 3개의 파일을 편집해야한다.
- etc/hadoop/hadoop-env.sh
- etc/hadoop/mapred-env.sh
- etc/hadoop/yarn-env.sh
(1). etc/hadoop/core-site.xml
fs.defaultFS : 네임노드 URI를 설정
io.file.buffer.size : read/write 버퍼 사이즈
fs.defaultFS hdfs://HADOOP1:9000
(2). etc/hadoop/hdfs-site.xml
- 네임노드 세팅
dfs.namenode.name.dir : 네임스페이스와 트렌젝션 로그들이 저장될 네임노드 로컬 파일시스템 경로를 지정한다.
dfs.hosts / dfs.hosts.exclude : 필요한 경우 데이터노드들의 접근 정책을 펼수있는듯.
dfs.blocksize : 기본 사이즈는 268435456
dfs.namenode.handler.count : 기본 100 , 네임노드의 스레드가 더 필요한 경우 세팅
- 데이터 노드 세팅
dfs.datanode.data.dir : 데이터노드의 블록이 저장될 로컬 경로
그러니까..
dfs.namenode.name.dir 하고
dfs.datanode.data.dir 만 세팅하면 될듯하다.
vim etc/hadoop/hdfs-site.xml
dfs.namenode.name.dir /hadoop/hadoop-2.7.5/data/namenode dfs.namenode.data.dir /hadoop/hadoop-2.7.5/data/datanode
mkdir -p /hadoop/hadoop-2.7.5/data/namenode mkdir -p /hadoop/hadoop-2.7.5/data/datanode
(3). etc/hadoop/yarn-site.xml
- ResourceManager , NodeManager 공통
yarn.acl.enable : ACL 이라는 접근제어리스트를 사용할것인지.. 기본값 false
yarn.admin.acl : 관리자 접근 제어
yarn.log-aggregation-enable : 로그 통합기능? 일단 기본값 false
- ResourceManager
address 관련 설정이 정말 많은데... 대부분
yarn.resourcemanager.hostname 를 override 한다고 설명되어있다.
특별하게 다르게 지정할게 아니라면 저것만 설정하자.
yarn.resourcemanager.scheduler.class : 스케쥴러의 방식인데 3가지가 있다.
--1 : CapacityScheduler (권장)
각 큐마다 용량을 설정하여 쓰는방식인데, 다른 큐가 사용하지 않는 용량을 빌려올수있는듯
내용이 들어가면 끝이 없어서 일단 패스..
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
--2 : FairScheduler (권장) 공정한 분배
--3 : FifoScheduler : 먼저들어온걸 먼저 처리하는것.
- NodeManager
yarn.nodemanager.resource.memory-mb : 메모리 세팅 (MB 단위)
yarn.nodemanager.vmem-pmem-ratio : 가상메모리 비율?
yarn.nodemanager.local-dirs : NodeManager가 작업될 경로
yarn.nodemanager.log-dirs : NodeManager 의 로그 경로
yarn.nodemanager.log.retain-seconds : 로그 유지 시간(초), 기본 10800
yarn.nodemanager.aux-services : 맵리듀스 사용시 사용할 셔플 서비스 (mapreduce_shuffle 외에 다른게 더 있나...? )
정리하면 yarn-site.xml는 아래와같이 세팅했다.
yarn.resourcemanager.hostname HADOOP1 yarn.nodemanager.aux-services mapreduce_shuffle
(4). etc/hadoop/mapred-site.xml
- 기본 디렉토리에 mapred-site.xml 파일은 없고 mapred-site.xml.template만 있다.
수정할게 없어보여서 일단 패스
/* Slave 설정 */
- etc/hadoop/slaves 를 편집한다
[root@HADOOP1 hadoop]# cat slaves
HADOOP2
- 지금까지 편집한 파일은
etc/hadoop/core-site.xml
etc/hadoop/hdfs-site.xml
etc/hadoop/yarn-site.xml
etc/hadoop/slaves 이다.
그 외에는 수정한게 없으니 etc/hadoop 밑에있는것을 전부 덮어씌운다.
scp -r /hadoop/hadoop-2.7.5/etc/hadoop/* HADOOP2:/hadoop/hadoop-2.7.5/etc/hadoop/
그리고 양 서버간의 ssh 를 인증없이 통과하게 해주어야한다.
1. 양서버에서 ssh-keygen -t rsa 를 수행한 후
2. /root/.ssh/authorized_keys 파일을 편집하여, 서로 다른 서버에 있는 /root/.ssh/id_rsa.pub 값을 append 한다.
3. 자기 자신서버에 있는 id_rsa.pub 값도 append 한다.
4. 테스트 방법 : 자기 자신과, 다른 노드간에 인증없이 ssh 접속이 되면 성공
/* Operating the Hadoop Cluster */
- [root@HADOOP1 ~]# $HADOOP_PREFIX/sbin/start-dfs.sh 로 파일시스템을 구동하자
[root@HADOOP1 ~]# $HADOOP_PREFIX/sbin/start-dfs.sh Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured. Starting namenodes on [] The authenticity of host 'HADOOP1 (192.168.192.10)' can't be established. RSA key fingerprint is 1f:9c:34:81:0e:a1:c3:e8:b4:2e:72:b8:2b:53:9a:50. Are you sure you want to continue connecting (yes/no)? HADOOP2: Error: JAVA_HOME is not set and could not be found
내 경우, bash_profile에 잡은 확경변수가
아래와 같이 에러가 나는데, 환경변수를 bash_profile에다가 잡아서 못 읽는듯하다.
/etc/hadoop/hadoop-env.sh 에 환경변수 정보를 넣고 다시 시도해본다.
[root@HADOOP1 hadoop-2.7.5]# $HADOOP_PREFIX/sbin/start-dfs.sh Starting namenodes on [HADOOP1] HADOOP1: starting namenode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-namenode-HADOOP1.out HADOOP2: datanode running as process 2955. Stop it first. Starting secondary namenodes [0.0.0.0] 0.0.0.0: starting secondarynamenode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-secondarynamenode-HADOOP1.out [root@HADOOP1 hadoop-2.7.5]# [root@HADOOP1 hadoop-2.7.5]# [root@HADOOP1 hadoop-2.7.5]# $HADOOP_PREFIX/sbin/start-yarn.sh starting yarn daemons starting resourcemanager, logging to /hadoop/hadoop-2.7.5/logs/yarn-root-resourcemanager-HADOOP1.out HADOOP2: starting nodemanager, logging to /hadoop/hadoop-2.7.5/logs/yarn-root-nodemanager-HADOOP2.out [root@HADOOP1 hadoop-2.7.5]#
에러가 없이 일단 실행은 잘 되었다.
/* 서비스 로드 확인 */
일단 아래와 같이 YARN 명령어로도 확인이 가능하고
[root@HADOOP1 hadoop-2.7.5]# bin/yarn node -list 18/04/10 05:09:08 INFO client.RMProxy: Connecting to ResourceManager at hadoop1/192.168.192.10:8032 Total Nodes:1 Node-Id Node-State Node-Http-Address Number-of-Running-Containers HADOOP2:48227 RUNNING HADOOP2:8042 0
아래와 같이 웹 UI를통해서도 확인이 가능하다
우선... 클러스터가 구축은 되었지만, 이게 잘 동작하는지는 잘 모르겠다.
다음 포스팅에는 이것을 이용하여 데이터 수집까지 잘 되는지를 확인해볼 예정이다.
번외 : 호스트명에 _ 와같은 문자가 들어가있으면 실행이 안되더라.. 에러 문구로는 도저히 유추 안되는 내용이였음.
[root@HADOOP_1 .ssh]# $HADOOP_PREFIX/sbin/start-dfs.sh
Incorrect configuration: namenode address dfs.namenode.servicerpc-address or dfs.namenode.rpc-address is not configured.
Starting namenodes on []
HADOOP_1: starting namenode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-namenode-HADOOP_1.out
HADOOP2: starting namenode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-namenode-HADOOP_2.out
HADOOP_1: starting datanode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-datanode-HADOOP_1.out
HADOOP2: starting datanode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-datanode-HADOOP_2.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /hadoop/hadoop-2.7.5/logs/hadoop-root-secondarynamenode-HADOOP_1.out
0.0.0.0: Exception in thread "main" java.lang.IllegalArgumentException: :: HADOOP_1:9000
0.0.0.0: at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:213)
0.0.0.0: at org.apache.hadoop.net.NetUtils.createSocketAddr(NetUtils.java:164)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:432)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:484)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.NameNode.getAddress(NameNode.java:463)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.NameNode.getServiceAddress(NameNode.java:456)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.initialize(SecondaryNameNode.java:229)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.<init>(SecondaryNameNode.java:192)
0.0.0.0: at org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode.main(SecondaryNameNode.java:671)