-
[Hadoop] 클러스터 구축하기 NameNode2, DataNode 3, yarn, spark, zookeeper 구성 하기(centos7)데이터 엔지니어링/Hadoop 2022. 8. 10. 21:06반응형
안녕하세요 이번 포스팅은 하둡 클러스터 구축하는 법에 대해 알아 볼까 합니다. 데이터 엔지니어링에서 하둡이 빼놓을 수 없는 중요한 요소 이기 때문에 이번에 잘 정리해서 기록해 두는게 좋을 것같아 준비 했습니다. 저는 Virtual box에 CentOS7으로 진행을 했고 NameNode 2 , DataNode 3를 준비하여 진행 했습니다. 그림으로 표현하면 아래와 같습니다. 해당 작업을 진행하기 전에 Oracle VirtualBox와 Centos를 준비해주시기 바랍니다.
먼저 버츄얼 박스를 펴서 고정 IP로 통신을 하도록 하기 위해 vm에 고정 ip를 할당해 보겠습니다. 그정에 정보를 알아야하는데 windows cmd창을 열어 ipconfig을 치면 ip주소 정보가 나옵니다. 여기서 ipv4 기본 게이트웨이를 알고 넘어가야 진행 할 수 있습니다. 저는 192.168.0.103입니다.
고정 IP 설정
# centOS network 관리 주소 cd /etc/sysconfig/network-scripts # ifcfg-enp0s3 이더넷을 수정 vi ifcfg-enp0s3
명령어를 치면 아래와 같은 곳이 나옵니다. 192.168.0 까지는 같지만 그 뒤에는 자신이 원하는 ip 주소를 입력해주면 됩니다. 255까지이니 자신이 기억하기 좋은 것으로 하면 되겠습니다. Gateway는 기본 게이트웨이로하고 DNS1,2는 KT DNS로 진행 했습니다. 다른 네트워크 표기해도 됩니다.
network 재실행
# network 재실행 systemctl restart network
HostName 설정하기
namenode 2개, datanode3개이니 각각의 주소를 아래와 같이 정해 주었습니다. hosts는 모두 똑같이 기입을 해야하며, hostname 설정은 각각의 노드들에 접속하여 설정을 각각 해주면 됩니다.
# 각각 노드에 모두 기입 # vi /etc/hosts 192.168.0.111 nn1 192.168.0.112 nn2 192.168.0.113 dn1 192.168.0.114 dn2 192.168.0.115 dn3 # 각각 노드들에 hostname 변경 nn1 $ hostnamectl set-hostname nn1 nn2 $ hostnamectl set-hostname nn2 dn1 $ hostnamectl set-hostname dn1 # dn1은 journalnode 겸함 dn2 $ hostnamectl set-hostname dn2 dn3 $ hostnamectl set-hostname dn3
기본 설치사항
기본 적으로 설치해야 하는 것을 진행 하도록 하겠습니다. ca-certificates는 접속 오류가 나면 진행해도 되는데 그냥 진행 추가 하도록 하겠습니다.
sudo yum -y update sudo yum -y upgrade sudo yum install -y vim wget unzip ssh openssh-* net-tools sudo yum install -y ca-certificates
JAVA 설치
각각 노드들에 똑같이 설치 적용해야 합니다. 왼만하면 hostname 설정 하기 전에 java hadoop등 설치 후 복사한후에 진행 하도록 하시면 편하실 겁니다. java는 oracle것을 사용해야 합니다. jps같은 명령어가 없기 때문에 그런데 open-devel을 사용하셔도 되는 것 같던데 저는 oracle것을 사용하도록 하겠습니다.
# 위에서 다운 받아 filezilla로 보내기 # java 설치 sudo tar -zxvf jdk-8u341-linux-x64.tar.gz # 해제 한 파일 이동 mv jdk1.8.0_341/ /usr/local/lib # 환경 변수 설정 vi /etc/profile # 아래 부분 추가 JAVA_HOME=/usr/local/lib/jdk1.8.0_341 JRE_HOME=$JAVA_HOME/jre PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin export JAVA_HOME export JRE_HOME # 나와서 환경 변수 적용 source /etc/profile # 개인 사용자에게 할다 sudo echo 'export JAVA_HOME=/usr/local/lib/jdk1.8.0_341' >> ~/.bashrc source ~/.bashrc # 적용 확인 java -version jps
jps 명령어를 날렸을 때 오류가 없이 그냥 동작하지 않거나 무엇이 나오면 성공적으로 설치가 완료 된것입니다.
Hadoop 설치
그럼 하둡을 설치해 보도록 하겠습니다. wget으로 hadoop 최신 버전을 가져왔습니다. 환경 변수도 설정을 해주면 됩니다.
# hadoop 다운로드 sudo wget <https://dlcdn.apache.org/hadoop/common/hadoop-3.2.3/hadoop-3.2.3.tar.gz> # 압축 해제 sudo tar -zxvf hadoop-3.2.3.tar.gz -C /usr/local # Hadoop 디렉토리 이름 변경 sudo mv /usr/local/hadoop-3.2.3 /usr/local/hadoop # 환경 설정 sudo vim /etc/profile ... HADOOP_HOME=/usr/local/hadoop ... PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin: ... export HADOOP_HOME # 적용 source /etc/profile # 확인 echo $HADOOP_HOME # 하둡에서 사용할 환경 변수 설정 sudo echo 'export HADOOP_HOME=/usr/local/hadoop' >> ~/.bashrc sudo echo 'export HADOOP_COMMON_HOME=$HADOOP_HOME' >> ~/.bashrc sudo echo 'export HADOOP_HDFS_HOME=$HADOOP_HOME' >> ~/.bashrc sudo echo 'export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc sudo echo 'export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop' >> ~/.bashrc sudo echo 'export HADOOP_YARN_HOME=$HADOOP_HOME' >> ~/.bashrc sudo echo 'export HADOOP_MAPRED_HOME=$HADOOP_HOME' >> ~/.bashrc # 적용 source ~/.bashrc # 적용 확인 env | grep HADOOP
Hadoop Configuration
하둡을 설치를 했으면 설정을 해야 합니다. 설정해야하는 파일은 hdfs-site, core-site, yarn-site, mapred-site, hadoop-env 편집 worker, master 파일 생성 및 편집입니다.
hdfs-site 파일 편집
먼저 vim을 통해 들어가면 configuration부분이 있을 텐데 아래의 것을 그대로 복사 해주시면 되겠습니다.
# hdfs-site.xml 편집 sudo vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml # 아래 내용으로 수정 후 저장 <configuration> <!-- configuration hadoop --> <!-- 복제 갯수 --> <property> <name>dfs.replication</name> <value>2</value> </property> <!-- namenode 디렉토리 --> <property> <name>dfs.namenode.name.dir</name> <value>/usr/local/hadoop/data/nameNode</value> </property> <!-- datanode 디렉토리 --> <property> <name>dfs.datanode.data.dir</name> <value>/usr/local/hadoop/data/dataNode</value> </property> <!-- journalnode 디렉토리 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/usr/local/hadoop/data/dfs/journalnode</value> </property> <!-- hadoop cluster 이름 --> <property> <name>dfs.nameservices</name> <value>my-hadoop-cluster</value> </property> <!-- cluster에서 사용할 namenode들 정의 설정 파일에서만 씀 --> <property> <name>dfs.ha.namenodes.my-hadoop-cluster</name> <value>namenode1,namenode2</value> </property> <!-- namenode1 주소 설정 --> <property> <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode1</name> <value>nn1:8020</value> </property> <!-- namenode2 주소 설정 --> <property> <name>dfs.namenode.rpc-address.my-hadoop-cluster.namenode2</name> <value>nn2:8020</value> </property> <!-- namenode1 웹 접속 주소 --> <property> <name>dfs.namenode.http-address.my-hadoop-cluster.namenode1</name> <value>nn1:50070</value> </property> <!-- namenode2 웹 접속 주소 --> <property> <name>dfs.namenode.http-address.my-hadoop-cluster.namenode2</name> <value>nn2:50070</value> </property> <!-- Journalnode 이동하고 다닐 접속 포트 주소 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://nn1:8485;nn2:8485;dn1:8485/my-hadoop-cluster</value> </property> <!-- 꼭 필요 그대로 입력 failover 관련 --> <property> <name>dfs.client.failover.proxy.provider.my-hadoop-cluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 아래도 그대로 입력 --> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <!-- ssh 다른 노드 접속 정보 주소 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <!-- failover시 자동 node설정 할 지 여부 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- name 디렉토리 --> <property> <name>dfs.name.dir</name> <value>/usr/local/hadoop/data/name</value> </property> <!-- data 디렉토리 --> <property> <name>dfs.data.dir</name> <value>/usr/local/hadoop/data/data</value> </property> </configuration>
core-site.xml 설정
# core-site.xml 편집 sudo vim $HADOOP_HOME/etc/hadoop/core-site.xml # 아래 내용으로 수정 후 저장 <configuration> <!-- hdfs 접속 정보 --> <property> <name>fs.default.name</name> <value>hdfs://nn1:9000</value> </property> <!-- 위에 설정한 cluster service이름으로 기입 --> <property> <name>fs.defaultFS</name> <value>hdfs://my-hadoop-cluster</value> </property> <!-- zookeeper 설정 홀수로 설정해야함 --> <property> <name>ha.zookeeper.quorum</name> <value>nn1:2181,nn2:2181,dn1:2181</value> </property> </configuration>
yarn-site.xml 파일 편집
# Hadoop yarn-site.xml 파일 설정 sudo vim $HADOOP_HOME/etc/hadoop/yarn-site.xml # 아래 내용으로 수정 후 저장 <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> <!-- resourcemanager hostname입력 --> <property> <name>yarn.resourcemanager.hostname</name> <value>nn1</value> </property> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> </configuration>
mapred-site.xml 파일 편집
# Hadoop mapred-site.xml 파일 설정 sudo vim $HADOOP_HOME/etc/hadoop/mapred-site.xml # 아래 내용으로 수정 후 저장 <configuration> <!-- mapreduce yarn으로 설정 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- yarn mapreduce 설정 정보 주소 --> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <!-- mapreduce 설정 정보 주소 --> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> </configuration>
Hadoop-env 파일 편집
유저는 root로 진행 했기 때문에 다 root로 한것이고 user 생성하여 진행 하시려면 생성후 그 유저이름 기입하면 됩니다.
# Hadoop hadoop-env.sh 파일 설정 sudo vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh # 아래 내용 수정 후 저장 # Java export JAVA_HOME=/usr/local/lib/jdk1.8.0_341 # 자신의 자바 주소 # Hadoop export HADOOP_HOME=/usr/local/hadoop export HDFS_NAMENODE_USER=root export HADOOP_SECURE_DN_USER=hdfs export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export HADOOP_SECURE_DN_USER=yarn export YARN_NODEMANAGER_USER=root export HDFS_JOURNALNODE_USER=root export HDFS_ZKFC_USER=root
worker 편집
# Hadoop workers 편집 sudo vim $HADOOP_HOME/etc/hadoop/workers # 아래 내용 수정 후 저장 # localhost << 주석 처리 또는 제거 dn1 dn2 dn3
master 편집
# Hadoop masters 편집 sudo vim $HADOOP_HOME/etc/hadoop/masters # 아래 내용 수정 후 저장 nn1 nn2
여기 까지 하면 하둡 설정 완료 입니다.
Spark 설정 하기
Spark 다운로드
# hadoop 버전에 맞는 spark 다운로드 sudo wget <https://dlcdn.apache.org/spark/spark-3.2.2/spark-3.2.2-bin-hadoop3.2.tgz> # 압축해제 sudo tar -xzvf spark-3.2.2-bin-hadoop3.2.tgz # spark 폴더 이동 sudo mv ~/spark-3.2.2-bin-hadoop3.2/ /usr/local/spark # pyspark 설치 sudo yum install -y python3-pip sudo pip3 install pyspark findspark # 환경 설정 sudo vim /etc/profile ... SPARK_HOME=/usr/local/spark ... PATH=$PATH:~:$SPARK_HOME/bin:$SPARK_HOME/sbin ... export SPARK_HOME echo 'export SPARK_HOME=/usr/local/spark' >> ~/.bashrc source ~/.bashrc env | grep SPARK
spark-env.sh 파일 편집
# EC2 Ubuntu terminal # spark-env.sh 파일 카피 cd $SPARK_HOME/conf sudo cp spark-env.sh.template spark-env.sh # spark-env.sh 파일 편집 sudo vim spark-env.sh # 아래 내용 수정 후 저장 export SPARK_HOME=/usr/local/spark export SPARK_CONF_DIR=/usr/local/spark/conf export JAVA_HOME=/usr/local/lib/jdk1.8.0_341 export HADOOP_HOME=/usr/local/hadoop export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop export SPARK_MASTER_WEBUI_PORT=18080
spark-defaults.conf 파일 편집
# Spark spark-defaults.conf.template 파일 복사 sudo cp /usr/local/spark/conf/spark-defaults.conf.template /usr/local/spark/conf/spark-defaults.conf # Spark spark-defaults.conf 파일 설정 sudo vim /usr/local/spark/conf/spark-defaults.conf # 아래 설정 후 저장 # 클러스터 매니저 정보 spark.master yarn # 스파크 이벤트 로그 수행 유무 # true시 spark.eventLog.dir에 로깅 경로 지정해야합니다 - 스파크 UI에서 확인 가능합니다. spark.eventLog.enabled true # 스파크 이벤트 로그 저장 경로 spark.eventLog.dir /usr/local/spark/logs sudo mkdir -p /usr/local/spark/logs sudo chown -R $USER:$USER /usr/local/spark/
workers 파일 편집
: HDFS의 workers 를 설정 하였던 것과 같이, Spark 의 workers도 설정한다.(단, localhost는 주석 처리한다.)
# Spark workers 파일 생성 sudo cp /usr/local/spark/conf/workers.template /usr/local/spark/conf/workers # Spark workers 파일 설정 sudo vim /usr/local/spark/conf/workers # 아래 설정 후 저장 dn1 dn2 dn3
Zookeeper 설치
# 설치 sudo wget <https://dlcdn.apache.org/zookeeper/zookeeper-3.8.0/apache-zookeeper-3.8.0-bin.tar.gz> # 압축해제 tar -xzvf apache-zookeeper-3.8.0-bin.tar.gz -C /usr/local # 파일이동 sudo mv /usr/local/apache-zookeeper-3.8.0-bin/ /usr/local/zookeeper # zookeeper home 설정 sudo vim /etc/profile ZOOKEEPER_HOME=/usr/local/zookeeper # 적용 source /etc/profile # 개인 사용자 환경 설정 echo 'export ZOOKEEPER_HOME=/usr/local/zookeeper' >> ~/.bashrc source ~/.bashrc # 적용 되었는지 확인 env | grep ZOOKEEPER
# config 설정 cd $ZOOKEEPER_HOME sudo cp ./conf/zoo_sample.cfg ./conf/zoo.cfg sudo vim ./conf/zoo.cfg #dataDir=/tmp/zookeeper dataDir=/usr/local/zookeeper/data dataLogDir=/usr/local/zookeeper/logs # the port at which the clients will connect clientPort=2181 maxClientCnxns=0 maxSessionTimeout=180000 server.1=nn1:2888:3888 server.2=nn2:2888:3888 server.3=dn1:2888:3888
# data 폴더 생성 sudo mkdir -p /usr/local/zookeeper/data # logs 폴더 생성 sudo mkdir -p /usr/local/zookeeper/logs # 사용자에게 권한 부여 sudo chown -R $USER:$USER /usr/local/zookeeper # myid에 nn1 - 1, nn2 - 2, dn1 - 3 으로 기입 sudo vim /usr/local/zookeeper/data/myid
zookeeper 서버 실행
# nn1 sudo vim /usr/local/zookeeper/data/myid 1 # nn2 sudo vim /usr/local/zookeeper/data/myid 2 # dn1 sudo vim /usr/local/zookeeper/data/myid 3 # 3개의 노드 다 $ZOOKEEPER_HOME/bin/zkServer.sh start $ZOOKEEPER_HOME/bin/zkServer.sh status
Hadoop 실행
# nn1에서 cd ~ # os에 맞는 format으로 설정초기화 hdfs namenode -format # 통신이 안되는경우 # jounalnode가 띄워져 있는지 확인 # nn1, nn2, dn1 다 확인 해야함 hadoop-daemon.sh start journalnode hadoop-daemon.sh status journalnode # namenode 실행 nn1 - hdfs --daemon start namenode # namenode2 실행 nn2 - hdfs --daemon start namenode nn2 - hdfs namenode -bootstrapStandby # nn1, nn2, dn1, dn2, dn3, jn 다 동작하게 함 nn1 - start-dfs.sh nn1 - start-all.sh 로 실행 되었는지 확인 # 아래 상태가 되어야함 nn1 - jps 24808 Jps 5353 NameNode 19420 DFSZKFailoverController 4478 JournalNode 2628 QuorumPeerMain nn2 - jps 24808 Jps 5353 NameNode 19420 DFSZKFailoverController 4478 JournalNode 2628 QuorumPeerMain # 아래 3가지가 jps 3354 JournalNode 1022 QuorumPeerMain 3374 Jps
Yarn 실행
vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh # 추가 export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop # 실행 start-yarn.sh # 확인 nn1 jps 2628 QuorumPeerMain 24836 Jps 5353 NameNode 19420 DFSZKFailoverController 19661 ResourceManager <- 정상 출력 되어야함 4478 JournalNode # dn1 이동 datanode확인 dn1 jps 3010 DataNode 1459 JournalNode 1061 QuorumPeerMain 3847 NodeManager 4731 Jps
Mapreduce historyserver 실행
mapred --daemon start historyserver 23409 Jps 23346 JobHistoryServer <- 오류 없이 정상 작동해얗 2628 QuorumPeerMain 5353 NameNode 19420 DFSZKFailoverController 19661 ResourceManager 4478 JournalNode
실행 확인
# namenode1 실행 상태인지 확인 hdfs haadmin -getServiceState namenode1 active # namenode2 실행 상태인지 확인 hdfs haadmin -getServiceState namenode2 standby # 파일 생성해 보기 hdfs dfs -mkdir /test hdfs dfs -ls / # 아래 내용이 나오면 설정 잘 된 것임 Found 2 items drwxr-xr-x - root supergroup 0 2022-08-10 12:40 /test drwxrwx--- - root supergroup 0 2022-08-10 12:10 /tmp # mapreduce 실행 확인 # txt파일 복사 hdfs dfs -put /usr/local/hadoop/LICENSE.txt /test hdfs dfs -ls /test/ Found 1 items -rw-r--r-- 2 root supergroup 150571 2022-08-10 12:56 /test/LICENSE.txt # mapreduce 실행 yarn jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.3.jar wordcount hdfs:///test/LICENSE.txt /test/output # 결과값 확인 hdfs dfs -text /root/part-r-00000
Spark 실행
# master와 node 모두 실행 $SPARK_HOME/sbin/start-all.sh starting org.apache.spark.deploy.master.Master, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.master.Master-1-nn1.out dn2: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-dn2.out dn3: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-dn3.out dn1: starting org.apache.spark.deploy.worker.Worker, logging to /usr/local/spark/logs/spark-root-org.apache.spark.deploy.worker.Worker-1-dn1.out nn1 jps 23346 JobHistoryServer 2628 QuorumPeerMain 5353 NameNode 25898 Jps 19420 DFSZKFailoverController 19661 ResourceManager 4478 JournalNode 25839 Master <- 실행 된 것을 확인 dn1 jps 3010 DataNode 1459 JournalNode 5107 Jps 1061 QuorumPeerMain 3847 NodeManager 5037 Worker <- 실행 된 것을 확인 dn2, dn3 모두 동일
참고 문헌
https://www.youtube.com/watch?v=bnYxO2XRCQ0&t=9s
반응형'데이터 엔지니어링 > Hadoop' 카테고리의 다른 글
[Hadoop Yarn]Yarn 동작 과정 알아보기 (0) 2022.08.12 [Hadoop] Hadoop의 클러스터 구성, 파일 저장 되는 원리, 파일 읽는 원리 이해하기 (0) 2022.08.10