2019년 4월 9일 화요일

하둡 3.1.2 설치 3편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

1. 독립실행모드편
-> 하둡 3.1.2 설치 1편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

2. 가상분산모드편
-> 하둡 3.1.2 설치 2편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

3. 완전분산모드편
-> 하둡 3.1.2 설치 3편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

이번편에서는 하둡 시스템 운영용으로 완전분산모드를 설치해본다.
독립실행모드와 가상분산모드의 경우 장비 1대만 있으면 충분했지만 완전분산모드는 실제 장비 여러 대를 클러스터하여 구성할 것이다.

하둡 3.1.2버전으로 설치할 것이며 대부분의 예제가 1.대 버전이어서 조금 힘들었다. 2.대 예제는 별로 없고 3.대는 참고할만한 예제가 정말 없었다.(내가 못찾았을 수도 있지만..)
결론부터 말하자면 계속 데이터노드가 안떠서 고생했는데 이게 제대로 된건지 확실치가 않으니 몇가지 테스트해보고 잘못된 점이 있으면 수정해야겠다.

구성 시나리오는 총 5대로 구성할것이고 마스터노드 2대, 슬레이브노드 3대 이다.
master01 - namenode
master02 - secondarynamenode
slave01 - datanode
slave02 - datanode
slave03 - datanode

실제 운영하려면 한 노드에 마스터+슬레이브를 같이두는 것보다는 물리적으로 분리시키는 것이 좋을 것이기 때문에 이렇게 구성했다.
참고로 세컨더리네임노드는 네임노드의 백업이 아니다. 혹시나해서 네임노드를 죽여도 세컨더리 노드가 Active-StandBy 모드로 살아나지 않는다.

ip주소는 다음처럼 세팅을 하고자한다.
master01 192.168.10.1
slave01 192.168.10.2
slave02 192.168.10.3
slave03 192.168.10.4
master02 192.168.10.5
네트마스크는 255.255.255.0
게이트웨이는 192.168.10.254
네임서버는 192.168.10.254로 설정을 하기로 한다.


먼저 master01부터 적용해보자.

centos7은 ens33으로 되있어서 이를 수정해주었다.
gedit /etc/sysconfig/network-scripts/ifcfg-ens33

파일 내부를 다음과 같이 수정하였다.

그리고 네트워크를 재시작하면 적용이 된다.

같은 작업을 각각의 노드에 모두 적용하고 네트워크를 재시작하였다.
단 각 노드별로 ip만 바꿔주면 된다. (192.168.10.1~5까지 세팅하였다.)

이제 각 host명을 변경한다.

gedit /etc/hosts

모든 노드에 들어가서 다음과 같이 수정한다.

각 호스트이름도 바꿔준다.
gedit /etc/hostname


각각의 노드를 master01, master02, slave01, slave02, slave03으로 바꿔주었다.

그리고 각 노드에 적용을 해준다.

그리고 각각의 노드에서 터미널을 닫았다가 열면 호스트명이 localhost가 아닌 정해준 이름으로 표현이 된다. 이제 5대 모두 reboot해주자.

각 노드에서 각 노드별로 ping을 날려서 연결이 되는지 확인해보자.
master01 -> slave01, slave02, slave03를 해주고
master02 -> slave01, slave02, slave03를 해주고
slave01 -> master01, slave02, slave03를 해주고
...
slave02, 03도 똑같이 3대 노드에 ping 을 날려서 잘 가는지 확인한다.

하둡은 각 노드간에 로그인을 해야 데이터를 주고받을 수 있는데 이때 ssh를 통해 통신을 한다. 따라서 ssh 공개키를 복사한다.

먼저 master01에서 생성한 공개키를 모든 노드에 복사한다.
사실 기존에 가상분산모드에서 만든 노드를 복사해서 사용했기 때문에 공개키까지 복사가 되어서 ssh 연결이 되지만 처음이라고 생각하고 모두 다시설정하기로 한다.

먼저 master01부터 진행하는데 master02~slave03까지 4대에 인증키를 복사해준다.
scp -rp ~/.ssh/authorized_keys root@slave02:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys root@slave03:~/.ssh/authorized_keys
scp -rp ~/.ssh/authorized_keys root@master02:~/.ssh/authorized_keys

공개키를 복사해주고 master01에서 master02, slave01~slave03까지 ssh 접속이 되는 것을 확인할 수 있다.

각 노드마다 ssh 노드명을 쳐서 접속이 되는지 확인한다.
똑같은 반복작업이지만 잘 되는지 꼭 해주도록 하자.

이제 하둡 파일들을 수정한다.

다음은 hadoop-env.sh를 수정하는데 master만 진행한다.
gedit $HADOOP_HOME/etc/hadoop/hadoop-env.sh

HADOOP_PID_DIR의 경로를 설정해준다.


다음은 core-site.xml을 수정하는데 모든 노드에서 진행한다.
gedit $HADOOP_HOME/etc/hadoop/core-site.xml

다음은 hdfs-site.xml를 모든 노드에서 수정한다.
gedit $HADOOP_HOME/etc/hadoop/hdfs-site.xml

master

slave



다음은 mapred-site.xml을 잡트래커 설정을 수정하며 모든 노드에 mapreduce 설정을 해준다.
gedit $HADOOP_HOME/etc/hadoop/mapred-site.xml


다음은 모든 노드에서 yarn-site.xml을 수정한다.
gedit $HADOOP_HOME/etc/hadoop/yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>master01</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>2048</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.cpu-vcores</name>
        <value>1</value>
    </property>
<property>
        <name>yarn.nodemanager.env-whitelist</name>        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
    </property>



보통 여기까지 작업하면 masters, slaves 파일을 수정(없으면 생성)하는 것 같은데 그냥 skip하고 workers라는 파일이 있어서 master에서만 workers파일을 수정해주었다.

gedit $HADOOP_HOME/etc/hadoop/workers


아마 workers 파일에 worker들을 알려주면 각각의 노드 start, stop을 안하고 master만 start, stop하면 cluster되어 동작하는 것 같다. (ssh 인증이 반드시 되어있어야 한다.)

이후 마스터노드1번기를 포맷한다.
$HADOOP_HOME/bin/hdfs namenode -format

모든 노드의 방화벽을 내려준다.
systemctl stop firewalld.service
systemctl disable firewalld.service


이제 완전분산모드 하둡을 올려볼 것인데 master01에서 각각의 명령어를 날렸다.

start-dfs.sh를 수행한 후 각각 노드 변화


master01에는 NameNode가 올라왔다.


master02에는 SecondaryNameNode가 올라왔다.


slave01~03에는 DataNode가 올라왔다.


다음으로 start-yarn.sh를 수행하고 각각 노드 변화



master01에는 ResourceManager, NodeManager가 올라왔다.


master02에는 NodeManager가 올라왔다.


slave01~03에는 NodeManager가 올라왔다.

이제 정상적으로 동작하는지 테스트를 해봐야겠다.

하둡 Cluster Setup 가이드를 참고했다. (링크)




20190414 추가

독립, 가상분산모드에서 테스트했던 wordcount를 테스트해본다.
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/root
hdfs dfs -mkdir /user/root/cont
hdfs dfs -mkdir /input
hdfs dfs -copyFromLocal /home/centos/hadoop-3.1.2/README.txt /input


먼저 하둡 파일시스템에 /user, /user/root, /user/root/conf, /input 디렉토리를 생성하고 /input에 로컬에 있는 README.txt 파일을 올린다.


잘 올라온 것을 확인했다.

이제 샘플을 돌려본다.
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /input/README.txt ~/wordcount-output

 맵부터 진행하고 리듀스 작업이 진행된다.

결과는 다음과 같다.


2019년 4월 6일 토요일

하둡 3.1.2 설치 2편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

1. 독립실행모드편
-> 하둡 3.1.2 설치 1편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

2. 가상분산모드편
-> 하둡 3.1.2 설치 2편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

3. 완전분산모드편
-> 하둡 3.1.2 설치 3편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

저번에는 Hadoop을 Standalone Mode로 설치하였다.
이어서 Pseude-distributed Mode로 설치해보자. 
Single이지만 Cluster이기 때문에 Single Node Cluster라고도 부른다.

가상분산모드는 장비 1대를 가지고 흉내만 내는 것이지만 설치할 때는 분산처리를 할 수 있도록 해야하기 때문에 ssh도 설치해야한다.

저번 편에서 설치한 독립실행모드에 그대로 설치해도되고 아니면 리눅스를 새로 설치하고 jdk와 하둡만 설치해서 따로 설치해도된다. 설치내용은 100% 똑같기때문에 이어서 설치하도록 한다.

먼저 yum install openssh*를 설치한다.

공개키와 비밀키를 생성한다.
ssh-keygen -t rsa -P ""를 수행하여 디폴트로 생성을 한다.


수행하면 아래에 SHA256으로 암호화된 것이 fingerprint(지문)이다.

인증기로 등록한다.

ssh 접속이 되는지 확인을 한다.
최초에만 연결하겠냐고 물어보고 이후에는 물어보지 않는다.

이제 하둡 설정파일을 세팅해야한다.
먼저 hadoop-env.sh에 자바 홈을 알려준다.
vi로 편집하다가 gedit으로 열어서 line number 표시를 하니까 편하다.


3.1.2 버전기준으로 54번째 line에 위치한다.(위치는 버전마다 다르다.)

core-site.xml에 네임노드(마스터노드) 위치를 알려준다.

configuration이 비어있는데 여기에 네임노드 위치를 알려준다.

hdfs-site.xml에 각 파일을 몇 개로 복제할 것인지 설정한다.
기본 3개인줄 알았는데 1개로도 설정이 가능하다.


아래처럼 configuration을 수정해준다.


이제 네임노드를 포맷하고 하둡 클러스터를 시작해보자.
먼저 네임노드를 포맷한다. (hdfs namenode -format)

그리고 하둡 클러스터를 다시 수행해보면 노드들이 하나씩 올라온다.

jps명령어를 수행해보면 jvm위에 올라가있는 프로세스를 확인할 수 있다.

NameNode, SecondaryNameNode, DataNode가 올라와있는 것을 확인할 수 있다.

참고로 start-dfs.sh는 hdfs를 실행하는 명령어이고 끄는 것은 stop-dfs.sh이다.

HDFS만 실행 : start-dfs.sh
HDFS만 중단 : stop-dfs.sh
맵리듀스만 실행 : start-mapred.sh
맵리듀스만 중단 : stop-mapred.sh
HDFS와 맵리듀스 모두 실행 : start-all.sh
HDFS와 맵리듀스 모두 중단 : stop-all.sh


웹상에서 확인하는 방법은 http://localhost:9870에 들어가보면 확인할 수 있다.


2.9대 버전까지는 port가 50070이었으나 3.대 알파버전부터 바뀌었다.(링크)



다음으로 리소스매니저를 수행해본다.

jps로 확인해보면 NodeManger, ResourceManager가 구동된 것을 확인할 수 있다.

웹상에서 보려면 port 8088로 확인할 수 있다.

테스트 겸 독립실행모드에서 수행했던 wordcount를 수행해보자.

먼저 hdfs에 디렉토리를 생성한다.(centos7 로컬이 아니라 하둡에 만드는 것이다.)


localhost:9870에서 /user, /user/root, /user/root/conf, /input을 생성된 것을 확인할 수 있다.



테스트를 위해 로컬에 있는 파일을 hdfs로 올려보자.

localhost:9870에서 README.txt가 올라온 것을 확인할 수 있다.

또는 명령어로도 확인이 가능하다.


독립실행모드에서 수행했던 명령어의 인풋과 아웃풋을 바꿔서 수행해보자.

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar wordcount /input/README.txt ~/wordcount-output

hdfs dfs -ls ~/wordcount-output로 _SUCCESS가 된 것을 확인할 수 있다.

아래 명령어를 통해 결과를 확인해보자.

단어의 갯수가 세어진 것을 확인할 수 있다.

또는 localhost:9870에 /root/wordcount-output에서 결과를 확인할 수 있다.



전편 포스팅에서 독립실행모드를 설치하였고 이번 포스팅에서 가상분산모드를 설치하였다.
다음 포스팅에서는 실제 운영할 수 있는 완전분산모드를 설치해보도록 하자.

전편 포스팅(독립실행모드 설치)
-> 하둡 3.1.2 설치 1편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

이번 포스팅(가상분산모드 설치)
-> 하둡 3.1.2 설치 2편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

다음 포스팅(완전분산모드 설치)
-> 하둡 3.1.2 설치 3편 - 독립실행모드(Standalone), 가상분산모드(Pseudo-distributed), 완전분산모드(Fully distributed)

2022년 회고

 올해는 블로그 포스팅을 열심히 못했다. 개인적으로 지금까지 경험했던 내용들을 리마인드하자는 마인드로 한해를 보낸 것 같다.  대부분의 시간을 MLOps pipeline 구축하고 대부분을 최적화 하는데 시간을 많이 할애했다. 결국에는 MLops도 데이...