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

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

결과는 다음과 같다.


댓글 19개:

  1. 작성자가 댓글을 삭제했습니다.

    답글삭제
  2. 서비스가 전부 잘 올라왔는데
    master01, master02 에도 DataNode 가 올라왔는데 이부분은 어디서 잘못된걸까요?

    답글삭제
    답글
    1. 순서대로 봐야겠지만 먼저 각각 마스터, 슬레이브의 hdfs-site.xml가 잘 작성되었는지 확인먼저 해보는게 좋을것같습니다

      삭제
    2. 네임노드 포맷을 다시 해보시면 되는거 같네요

      삭제
    3. 작성자가 댓글을 삭제했습니다.

      삭제
  3. 본문 환경변수 설정에서 master은 master01 master02를 모두 일컫는 말씀이신가요? hdfs-site.xml과 hadoop-env.sh에서 master만 변경한다고 하셨는데 master01,master02를 말씀하시는건지 모르겠어요 그리고 hadoop-env.sh를 slave 노드도 변경해도 되나요?

    답글삭제
    답글
    1. 네 master01만 해도되는데 master02도 같이 해주세요(글에는 없지만 마스터노드 HA를 구성하면 standby master node를 master02에 띄워야되서요) slave의 hadoop-env.sh도 변경해도됩니다. 보통은 master에서 써놓은 파일들을 모든 노드(마스터, 슬레이브)에 복붙해서 써요. 실제로 운영할때에는 수치 옵션을 master<->slave간 차이가 날 수 있습니다. 그냥 쉽게 생각하셔서 master에서 파일들을 제대로 작성해서 slave에 똑같이 복붙해서 사용해도 전혀 문제 없습니다. (설정파일들에 host로 명시만 잘 되어있으니깐요)

      삭제
    2. 정리하면 master, slave 모든 설정파일이 다 동일해도 동작하고 실제로 수백여대를 관리하게 되면 귀찮아서라도 그냥 복붙해서 씁니다. 예를들어 hdfs-site.xml를 똑같이 작성하더라도 마스터노드가 dfs.datanode.data.dir 정보를 들고있고, 슬레이브 노드가 dfs.namenode.data.dir 설정을 알고있어도 각각의 서버에서 네임노드를 띄워야되면 네임노드를 띄우고, 데이터노드를 띄워야하면 데이터노드를 띄우시면 됩니다. (실제로 운영할때는 본문에서처럼 한번에 하둡 각 서비스들을 올리면안되고 각각의 서버에 접속해서 네임노드 올리고 데이터노드 올리고 리소스매니저 올리고 이런식으로 수동으로 올리게 될 것입니다.)

      삭제
    3. ㅠㅠㅠㅠㅠ계속해서 cannot set priority of namenode process 랑 cannot set priority of datanode process 오류가 떠서 미쳐버릴거 같네요 하...

      삭제
    4. 친절한 답변 감사합니다 ㅠㅠㅠㅠ

      삭제
    5. 네임노드와 데이터노드를 한번 포맷하고 시도해보시고 그래도 안되면 로그를 봐야할것같습니다.

      삭제
    6. https://stackoverflow.com/questions/46283634/localhost-error-cannot-set-priority-of-datanode-process-32156

      삭제
    7. 제가 초보자라 그런지 로그 보는법을 모르겠어요....계속해서 귀찮게 해서 죄송합니다 정말 ㅠㅠㅠㅠ

      삭제
    8. hadoop-env.sh 파일에 로그 경로가 있을 거에요 제가 드린 스택오버플로우 링크 보시면 네임노드/데이터노드 디렉토리 자체를 삭제 후 포맷해서 해결했다는데 이렇게 시도도 한번 해보시길 바랍니다.

      삭제
    9. ㅠㅠㅠㅠㅠㅠㅠㅠ slave들은 괜찮은데 master들이 문제네여...

      삭제
    10. 어렵습니다...다시한번 감사드립니다 ㅠㅠㅠㅠㅠ

      삭제
    11. 1년하고도 더 지나서 댓글달아서 이미 해결했을수도 있겠지만 제 케이스 공유해드릴게요
      저는 설정파일에 작성한 포트가 이미 사용중이어서 cannot set priority of namenode process 에러가 발생했었네요~ 다른 포트번호로 수정해서 start-all.sh 해보세요

      삭제
  4. 한달만에 노드까지 완벽히 돌리는데 예제에서 막히네요...ㅋㅋㅋㅋ하....

    답글삭제
    답글
    1. 에러 알려주시면 도움을 드릴수도 있을 것 같습니다. resource manager가 잘 떠있는지 확인해보시고.. 찾아보니까 java 버전으로 인한 문제도 있을 수 있어요. mapreduce job coding을 거의 할 일이 없으실테지만 그래도 구축후에 돌아가는건 확인해봐야하니깐요 ㅎㅎ 요즘은 거의 대부분 spark로 합니다

      삭제