하지만 프로덕션 환경에서 설치하기위해서 최적의 구성을 생각했어야했는데 개인적으로 생각한 내용과 클라우데라에서 제안한 아키텍처를 보더라도 크게 차이는 없었다.
출처 : 클라우데라 제안 구성 |
여기서 상황에 맞게 필요한 것만 구성을 하고 결론은 마스터 3대, 배치서버1대, 데이터노드 N대로 구성하고 다음과 같은 룰을 따르고자 한다.
리소스 매니저는 Yarn을 한번 올려보고.. 실제로 사용은 Mesos로 컨트롤 할 것이다. Mesos의 장점이 하둡 클러스터의 구간을 나눠놓고 1번 메소스, 2번 메소스, 3번 메소스 클러스터로 분리운영이 가능한데 이는 서버가 장애가 날때, 혹은 배치들을 분리했을 때 운영상 장점이 있기 때문이다.
대략적인 구조는 이런식으로 가져간다.
마스터1 : 주키퍼 저널노드 네임노드(HA) ZKFC 리소스매니저(HA) 메소스마스터
마스터2 : 주키퍼 저널노드 네임노드(HA) ZKFC 리소스매니저(HA) 메소스마스터
마스터3 : 주키퍼 저널노드 잡히스토리서버 스파크히스토리서버 메소스마스터
슬레이브서버들 : 데이터노드 메소스슬레이브
사실 yarn을 쓸 일은 거의 없긴한데 일단 sqoop이나 다른 프레임워크들과 etl을 하면서 필요할 일이 있으니 넣어두고 ha를 굳이 안해도되는데 간단하니까 해보자. 왠만하면 최소화로 가져가야 서버를 리부팅할때 올려야할 서비스를 빼먹지 않기 때문에 간소화하는 것을 좋아한다.
설치는 자바설치, /etc/hosts, 인증키 배포 등 기본적으로 세팅해놓아야 할 설정들은 모두 되었다고 가정을 한다.
zoo_sample.cfg를 복사해서 zoo.cfg를 만들고
<configuration><!-- for NameNode --><property><name>dfs.namenode.name.dir</name><value>/appData01/hadoop/hdfs/name,/appData02/hadoop/hdfs/name,/appData03/hadoop/hdfs/name,/appData04/hadoop/hdfs/name</value></property><!-- for DataNode --><property><name>dfs.datanode.data.dir</name><value>/appData01/hadoop/hdfs/data,/appData02/hadoop/hdfs/data,/appData03/hadoop/hdfs/data,/appData04/hadoop/hdfs/data,/appData05/hadoop/hdfs/data</value></property><!-- HA --><property><name>dfs.nameservices</name><value>hadoop-cluster-bdnode</value></property><property><name>dfs.ha.namenodes.hadoop-cluster-bdnode</name><value>namenode1,namenode2</value></property><property><name>dfs.namenode.rpc-address.hadoop-cluster-bdnode.namenode1</name><value>master1:8020</value></property><property><name>dfs.namenode.rpc-address.hadoop-cluster-bdnode.namenode2</name><value>master2:8020</value></property><property><name>dfs.namenode.http-address.hadoop-cluster-bdnode.namenode1</name><value>master1:50070</value></property><property><name>dfs.namenode.http-address.hadoop-cluster-bdnode.namenode2</name><value>master2:50070</value></property><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://master1:8485;master2:8485;master3:8485/hadoop-cluster-bdnode</value></property><property><name>dfs.client.failover.proxy.provider.hadoop-cluster-bdnode</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property><name>dfs.ha.fencing.methods</name><value>sshfence</value></property><property><name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/scom/.ssh/id_rsa</value></property><property><name>dfs.journalnode.edits.dir</name><value>/appData01/hadoop/hdfs/journalnode</value></property><property><name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><property><name>dfs.blocksize</name><value>268435456</value></property><property><name>dfs.namenode.handler.count</name><value>100</value></property><property><name>dfs.hosts</name><value>/data01/sw/hadoop/etc/hadoop/workers</value></property><property><name>dfs.webhdfs.enabled</name><value>true</value></property><property><name>dfs.namenode.datanode.registration.ip-hostname-check</name><value>false</value></property><property><name>dfs.datanode.du.reserved</name><!-- cluseter variant 90G --><value>96636764160</value><description>Reserved space in bytes per volume. Always leave this much space free for non dfs use.</description></property></configuration>
<configuration><property><name>fs.defaultFS</name><value>hdfs://hadoop-cluster-bdnode</value></property><property><name>ha.zookeeper.quorum</name><value>master1:2181,master2:2181,master3:2181</value></property><!-- trash --><property><name>fs.trash.interval</name><value>14400</value><description>Number of minutes after which the checkpoint gets deleted. If zero, the trash feature is disabled. </description></property><!-- for HUE--><property><name>hadoop.proxyuser.hue.hosts</name><value>*</value></property><property><name>hadoop.proxyuser.hue.groups</name><value>*</value></property></configuration>
<configuration><!-- Site specific YARN configuration properties --><property><name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</value></property><property><name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name><value>org.apache.hadoop.mapred.ShuffleHandler</value></property><property><name>yarn.nodemanager.local-dirs</name><value>/appData01/hadoop/yarn/nm-local-dir,/appData02/hadoop/yarn/nm-local-dir,/appData03/hadoop/yarn/nm-local-dir,/appData04/hadoop/yarn/nm-local-dir</value></property><property><name>yarn.resourcemanager.address.rm1</name><value>master1:8032</value></property><property><name>yarn.resourcemanager.webapp.address.rm1</name><value>master1:8088</value></property><property><name>yarn.resourcemanager.scheduler.address.rm1</name><value>master1:8030</value></property><property><name>yarn.resourcemanager.resource-tracker.address.rm1</name><value>master1:8031</value></property><property><name>yarn.resourcemanager.admin.address.rm1</name><value>master1:8041</value></property><property><name>yarn.resourcemanager.address.rm2</name><value>master2:8032</value></property><property><name>yarn.resourcemanager.webapp.address.rm2</name><value>master2:8088</value></property><property><name>yarn.resourcemanager.scheduler.address.rm2</name><value>master2:8030</value></property><property><name>yarn.resourcemanager.resource-tracker.address.rm2</name><value>master2:8031</value></property><property><name>yarn.resourcemanager.admin.address.rm2</name><value>master2:8041</value></property><property><name>yarn.resourcemanager.fs.state-store.uri</name><value>/appData01/hadoop/yarn/system/rmstore,/appData02/hadoop/yarn/system/rmstore,/appData03/hadoop/yarn/system/rmstore,/appData04/hadoop/yarn/system/rmstore</value></property><property><name>yarn.resourcemanager.hostname.rm1</name><value>master1</value></property><property><name>yarn.resourcemanager.hostname.rm2</name><value>master2</value></property><!-- configure yarn --><property><name>yarn.nodemanager.resource.cpu-vcores</name><value>10</value></property><property><name>yarn.nodemanager.resource.memory-mb</name><value>40960</value></property><property><name>yarn.scheduler.minimum-allocation-mb</name><value>1024</value></property><property><name>yarn.scheduler.maximum-allocation-mb</name><value>24576</value></property><!-- ResourceManager 시작시 state 복구여부 --><property><name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><!-- persistent store로 사용할 class --><property><name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property> <!-- Zookeeper 서버 리스트 --><property><name>yarn.resourcemanager.zk-address</name><value>master1:2181,master2:2181,master3:2181</value></property><property><name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><!-- ResourceManager가 leader election에 참가할 cluster 이름 지정 --><property><name>yarn.resourcemanager.cluster-id</name><value>rm-cluster</value></property><!-- cluster에서 HA를 구성할 ResourceManager id 지정 --><property><name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property></configuration>
<configuration><property><name>mapreduce.framework.name</name><value>yarn</value></property><!-- mapreduce2 memory setting --><property><name>yarn.app.mapreduce.am.resource.mb</name><value>1536</value></property><property><name>mapreduce.map.memory.mb</name><value>4096</value></property><property><name>mapreduce.reduce.memory.mb</name><value>8192</value></property><!-- mapreduce java memory setting --><property><name>mapreduce.map.java.opts.max.heap</name><value>3276</value></property><property><name>mapreduce.reduce.java.opts.max.heap</name><value>6553</value></property><property><name>yarn.app.mapreduce.am.resource.mb</name><value>2048</value></property><property><name>yarn.app.mapreduce.am.env</name><value>HADOOP_MAPRED_HOME=/data01/sw/hadoop</value></property><property><name>mapreduce.map.env</name><value>HADOOP_MAPRED_HOME=/data01/sw/hadoop</value></property><property><name>mapreduce.reduce.env</name><value>HADOOP_MAPRED_HOME=/data01/sw/hadoop</value></property></configuration>