Hadoop2 HA(High Availability) 구성 및 환경변수 설정


VMWare 설치 및 서버 기본 설정

  1. VMWare에 CentOS 7 버전의 가상 서버를 3대 생성
    • Server01 IP: 192.168.111.128
    • Server02 IP: 192.168.111.129
    • Server03 IP: 192.168.111.130

  1. 각 서버의 hostname 및 hosts설정
    • sudo vi /etc/hosts
      192.168.111.128   Server01
      192.168.111.129   Server02
      192.168.111.130   Server03
      
    • sudo vi /etc/hostname : 각 Server 번호에 맞는 이름 부여

  1. 최소 버전으로 설치했다면 기본 툴 설치
    • yum install net-tools 이후, ifconfig 통해 ip 설정 잘 되었는지 확인
    • yum install java 이후, java -version으로 java 버전 확인
    • yum install java-devel 이후, javac -version으로 jave 컴파일러 버전 확인
    • yum groupinstall 'Development Tools'
    • yum groupinstall 'Additional Development'

  1. root 권한으로 Protocol buffer 설치
   su
   cd /usr/local
   wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz
   tar xvfz protobuf-2.5.0.tar.gz
   cd protobuf-2.5.0
   ./configure
   make
   makeinstall
   
   protoc --version 으로, protocol buffer 잘 설치되었는지 확인 

  1. ssh 설정 통해 Host server와 Remote server의 Password-less Connection 환경 구축
    • Server01에서 ssh-keygen -t rsa로 ssh key 생성
ssh-copy-id /home/hadoop/.ssh/id_rsa.pub hadoop@Server02
ssh-copy-id /home/hadoop/.ssh/id_rsa.pub hadoop@Server03

Hadoop2 설치 및 기본 환경변수 설정

  1. Hadoop2 파일 다운로드

  1. 기본 환경변수 설정
cd ~
vi .bash_profile

#hadoop
export HADOOP_HOME=/home/hadoop/hadoop-2.7.6
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_COMMON_LIB_NATIVE_DIR"
export HADOOP_PID_DIR=${HADOOP_HOME}/pids
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin:
export CLASSPATH=$CLASSPATH:$HADOOP_HOME/lib/*

#java
export JAVA_HOME=/usr/lib/jvm/java/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/bin:$JAVA_HOME/lib/tools.jar

이후 source .bash_profile 통해 환경변수 설정 적용

  1. Hadoop2 환경설정
cd hadoop-2.x.x/etc/hadoop

vi hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java/
export HADOOP_PID_DIR=/home/hadoop/hadoop-2.7.6/pids

vi slaves
slaves = Server01, Server02, Server03

vi core-site.xml
<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://hadoop-cluster</value>
        </property>
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>Server01:2181,Server02:2181,Server03:2181</value>
        </property>
         <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/tmp/hadoop-${user.name}</value>
        </property>
</configuration>

vi hdfs-site.xml
<configuration>
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>
        <property>
                <name>dfs.namenode.name.dir</name>
                <value>/home/hadoop/data/dfs/namenode</value>
        </property>
        <property>
                <name>dfs.namenode.checkpoint.dir</name>
                <value>/home/hadoop/data/dfs/namesecondary</value>
        </property>
        <property>
                <name>dfs.datanode.data.dir</name>
                <value>/home/hadoop/data/dfs/datanode</value>
        </property>
        <property>
            <name>dfs.journalnode.edits.dir</name>
            <value>/home/hadoop/data/dfs/journalnode</value>
        </property>
        <property>
            <name>dfs.nameservices</name>
            <value>hadoop-cluster</value>
        </property>
        <property>
            <name>dfs.ha.namenodes.hadoop-cluster</name>
            <value>nn1,nn2</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.hadoop-cluster.nn1</name>
            <value>Server01:8020</value>
        </property>
        <property>
            <name>dfs.namenode.rpc-address.hadoop-cluster.nn2</name>
            <value>Server02:8020</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.hadoop-cluster.nn1</name>
            <value>Server01:50070</value>
        </property>
        <property>
            <name>dfs.namenode.http-address.hadoop-cluster.nn2</name>
            <value>Server02:50070</value>
        </property>
        <property>
            <name>dfs.namenode.shared.edits.dir</name>
            <value>qjournal://Server01:8485;Server02:8485;Server03:8485/hadoop-cluster</value>
        </property>
        <property>
            <name>dfs.client.failover.proxy.provider.hadoop-cluster</name>
            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
        <property>
            <name>dfs.ha.fencing.methods</name>
            <value>sshfence
                shell(/bin/true)
            </value>
        </property>
        <property>
            <name>dfs.ha.fencing.ssh.private-key-files</name>
            <value>/home/hadoop/.ssh/id_rsa</value>
        </property>
        <property>
            <name>dfs.ha.automatic-failover.enabled</name>
            <value>true</value>
        </property>
</configuration>

vi mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.job.ubertask.enable</name>
        <value>true</value>
    </property>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

vi yarn-site.xml
<configuration>
    <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>/home/hadoop/data/yarn/nm-local-dir</value>
    </property>
    <property>
        <name>yarn.resourcemanager.fs.state-store.uri</name>
        <value>/home/hadoop/data/yarn/system/rmstore</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>Server01</value>
    </property>
    <property>
        <name>yarn.web-proxy.address</name>
        <value>0.0.0.0:8089</value>
    </property>
</configuration>

  1. ZooKeeper 다운로드 및 적용
tar xvfz zookeeper-3.4.10
cd zookeeper-3.4.10
mkdir data
vi data/vi myid

cf. Server01에는 1 Server02 2, Server03에는 3의 myid를 부여해야 

cd conf/
cp zoo-sample.cfg zoo.cfg
vi zoo.cfg
dataDir=/home/hadoop/zookeeper-3.4.10/data

최하단에 아래 설정 추가
server.1=Server01:2888:3888
server.2=Server02:2888:3888
server.3=Server03:2888:3888


cf) zkServer.sh status로 leader와 follower 선출 상태 볼 수 있음


  1. HA 환경 구동
    • Server01에서 ZooKeeper 초기화: hdfs zkfc -formatZK
    • 모든 서버에서 journalnode 시작: hadoop-daemon.sh start journalnode
    • Server01에서 Namenode 초기화: hdfs namenode -format
    • Server01에서 Namenode 실행: hadoop-daemon.sh start namenode
    • Server01에서 FailOverController 실행: hadoop-daemon.sh start zkfc
    • 모든 서버에서 Datanode 실행: hadoop-daemon.sh start datanode
    • Standby 모드를 설정할 2번 서버에 hdfs namenode -bootstrapStandby
    • Server02에서 Namenode 실행: hadoop-daemon.sh start namenode
    • Server02에서 FailOverController 실행: hadoop-daemon.sh start zkfc
    • Server01에서 start-yarn.sh 통해 Yarn을 위한 Resoucre Manager와 Node Manager들 구동
    • Server01에서 history server 실행: mr-jobhistory-daemon.sh start historyserver
    • jps로 세 서버의 jvm process 확인

@Server01
NameNode
ResourceManager
DataNode
NodeManager
JournalNode
JobHistoryServer
DFSZKFailoverController

@Server02
NameNode
DataNode
NodeManager
JournalNode
DFSZKFailoverController

@Server03
DataNode
NodeManager
JournalNode

  1. MapReduce의 wordcout Examples 수행
hdfs dfs -mkdir /user
hdfs dfs -mkdir /user/hadoop
hdfs dfs -mkdir /user/hadoop/input

vi test.txt
*********************************************
I am a girl
I am a boy
I am a student
*********************************************

hdfs dfs -put test.txt /user/hadoop/input/

yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.6.jar wordcount input output

hdfs dfs -cat /user/hadoop/output/part-r-00000 통해 결과 확인

<결과>


'Software Convergence > Hadoop' 카테고리의 다른 글

Apache Sqoop 소개  (0) 2018.07.20
Apache Kafka 소개  (0) 2018.07.20
ZooKeeper configuration 설정  (0) 2018.07.19
네임노드가 실행되지 않는 문제의 해결  (0) 2018.07.06

Apache Sqoop

What is Sqoop?

  • Sqoop stands for SQl to hadOOP
  • Sqoop은 구조화된 RDBMS와 Hadoop의 대용량 데이터들을 효율적으로 변환하여 주는 도구
  • Oracle 또는 MySQL과 같은 RDBMS에서 하둡 분산 파일 시스템으로 데이터들을 가져와서 그 데이터들을 MapReduce로 변환을 하고, 그 변환된 데이터들을 다시 RDBMS로 내보낼 수 있음
  • Sqoop은 또한 데이터의 pull과 push를 MapReduce를 이용하여 처리하기 때문에 장애 허용 능력뿐 아니라 병렬 처리가 가능함

Why sqoop?

  • 자원에 대한 처리를 효과적이고 효율적으로 제어 가능
  • 데이터 타입의 mapping과 conversion이 용이
  • Sqoop record를 통한 metadata의 저장이 가능

Sqoop 2

: Sqoop 1의 많은 단점들로 인해 Sqoop2가 등장

Sqoop1 Sqoop2
Client-Side 설치 Server-Side 설치
Connectors가 Local에 설치되어야 하므로 접속하는 Local마다 JDBC의 설치 필요 Connectors가 필요한 서버 한 곳에만 설치되면 연결이 가능(only needs oneJDBC Driver)
CLI 만 제공 CLI 외에도 Web 및 Rest API를 통한 접속 가능
N/A Workflow Manager인 Oozie와 통합된 처리 가능

Sqoop2 (Design Goals)

  1. 보안 및 기능별 분리: 역할 기반의 액세스와 사용
  2. 용이한 확장성: Connectors간의 중복된 기능이 없음
  3. 쉬운 사용: 하둡에 대한 지식 없어도 사용 가능하며, 통합된 기능으로 인해 시나리오에 따른 용이한 구성이 가능

Sqoop2 (Connection vs. Job Metadata)

  • Connection: database 마다 고유한 작업. Stable, same value reused
  • Job: table 마다 고유한 작업. Changing a lot with each execution

Sqoop2 (Workings)

  • metadata에 Connectors 정보 등록
  • metadata repository에 Connections과 Jobs 생성 가능
  • 운영자는 적합한 Connection을 Job에서 실행 가능
  • 관리자는 Connection 사용에 대한 Policy 정의

Sqoop2 (Security)

  • 역할 기반의 액세스 객체를 통해 외부 시스템에 대한 보안 액세스 지원
  • 관리자가 연결에 대한 생성과 수정 및 삭제를 관리
  • 운영자는 만들어진 연결 기능을 사용


Apache Kafka

  • Kafka는 게시-구독 기반으로 내결함성 메시징 시스템이며, 확장성이 뛰어남
  • Kafka는 전통적 메시지 브로커를 대체하고, 분산형의 큰 처리량을 위해 만들어짐.
  • 다른 메시징 시스템과 비교하여 Kafka는 처리량, 파티셔닝, 복제 및 내결함성이 뛰어나 대규모 메시지 처리 응용 프로그램에 적합
cf. What is 'Messaging System'
  • 메시징 시스템은 한 응용 프로그램에서 다른 응용 프로그램으로 데이터를 전송함으로써, 응용 프로그램이 데이터에만 집중하여 공유 방법에 대해서는 걱정하지 않게 되는 구조
  • 분산 메시징은 안정적인 메시지 대기열인 'Queue' 개념에 기반
  • 메시지는 클라이언트 응용 프로그램과 메시징 시스템 간에 비동기적으로 처리됨
  • 두 가지 유형의 메시징 패턴이 있는데, 하나는 지점 간(Point to point). 다른 하나는 게시-구독(pub-sub) 메시징 시스템. 대부분의 메시징 패턴은 pub-sub을 사용



  1. 지점 간 메시징 시스템
  • 지점 간 시스템에서 메시지는 대기열에 유지
  • 하나 이상의 사용자가 대기열의 메시지를 사용할 수 있지만 특정 메시지는 최대 하나의 소비자만 사용할 수 있음
  • 소비자가 대기열에서 메시지를 읽으면 해당 대기열에서 메시지가 사라짐


  1. 게시-구독 메시징 시스템
  • Publish-Subscribe 시스템에서 메시지는 Topic에 유지됨
  • 지점 간 시스템과 달리 소비자는 하나 이상의 Topic을 구독하고 해당 주제의 모든 메시지를 사용할 수 있음
  • Publish-Subscirbe 시스템에서 메시지 생성자는 게시자이고, 소비자는 구독자

What is Kafka?

  • kafka는 분산 게시-구독 메시징 시스템이며 대용량 데이터를 처리할 수 있는 견고한 대기열로, 한 끝점에서 다른 끝점으로 메시지를 전달할 수 있게 함
  • Kafka는 오프라인 및 온라인 메시지 소비 모두에 적합
  • Kafka 메시지는 데이터 손실을 방지하기 위해 디스크에 유지되고 클러스터 내에 복제됨
  • 실시간 스트리밍 데이터 분석을 위해 Storm 및 Spark와 매우 잘 통합됨

Kafka Terminology

  • Topics: 특정 범주에 속하는 메시지 스트림으로, 데이터는 Topic에 저장됨. Topic은 Partition으로 분할되며, 각 Topic에 대해 Kafka는 mini-partition을 하나의 Partition으로 유지. 이러한 각 Partition에는 메시지가 변경 불가능한 순서로 구성되며, Partition은 동일한 크기의 세그머트 파일 세트로 구현됨

  • Partition: Topic에는 많은 파티션이 있을 수 있으므로, 임의의 양의 데이터를 처리할 수 있음

  • Broker: 브로커는 게시된 데이터를 유지 관리하는 시스템. 각 브로커에는 Topic 당 0개 이상의 분할 영역이 있을 수 있음. Topic에 N개의 파티션이 있고, N개의 브로커가 있는 경우 각 브로커에는 하나의 Partition이 있다고 가정

  • Producer: Producer는 Kafka Topic의 메시지 게시자. Producer는 Broker에게 데이터를 보내며, 메시지를 게시할 때 마다 Broker는 마지막 세그먼트 파일에 메시지를 간단하게 추가. 또한 Producer는 원하는 특정 Partition에 메시지를 보낼 수도 있음

  • Consumer: Consumer는 브로커로부터 데이터를 소비. 또한 브로커에서 데이터를 가져와 하나 이상의 주제를 구독하고 게시된 메시지를 사용


Zookeeper Configuration Setting


Standalone mode

ZooKeeper server를 standalone mode로 설정하는 것은 직관적이다. 서버는 JAR 파일에 포함되어 있기 때문에, 설치 시 configuration 파일이 생성된다.
따라서, ZooKeeper를 다운받고 이를 압축해제 하여 configuration 파일을 설정해주어야 한다. 아래는 그 예시이다.

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
  • tickTime: ZooKeeper가 사용하는 기본 시간 단위(milliseconds)로, heartbeats를 보내는데에 사용된다. 또한 세션 타임아웃 최소 단위는 tickTime의 2배로 설정
  • dataDir: 인메모리 데이터베이스 스냅샷을 저장할 공간. 특정 directory가 명시되지 않으면, 트랜잭션 로그는 database에 기록된다.
  • clientPort: client의 연결을 listen할 port 번호


Replicated ZooKeeper

tickTime=2000
dataDir=/var/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

Zookeeper 서비스 내 서버들의 Replicated group을 우리는 'quorum'이라 부른다. 그리고 이러한 Replicated mode의 설정을 위해서는 quorum내 존재하는 모든 서버들이 같은 설정의 configuration 파일을 가지고 있어야 한다. 이 Configuration 파일은 Standalone mode의 설정과 유사하지만, 약간의 추가된 설정이 있다.

  • initLimit은 quorum내의 Zookeeper 서버들이 leader에 연결할 때 사용되는 최대 시간을 제한하기 위해 사용하는 timeout 단위이다.
  • syncLimit은 서버가 leader로부터 얼마나 sync에 뒤쳐질 수 있는지를 제한하는 timeout 단위이다.

위 두 가지 timeout들은 모두 앞서 설정한 tickTime의 시간 단위를 사용한다. 즉, 이 예제에서 initLimit의 timeout은 5 ticks이며 tickTime이 2000 milliseconds이기 때문에, '10초'로 설정된 것이다.

다음으로 server.X 목록들은 ZooKeeper 서비스를 구성하는 서버들을 나타낸다. ZooKeeper 서버가 시작되면 서버는 dataDir 경로에 존재하는 myid 파일을 참조함으로써 해당 서버가 어떤 서버인지 식별한다. myid 파일은 server.X의 x에 해당하는 server 번호를 내용으로 가지고 있어야 한다. 따라서 myid 파일이 해당 경로에 존재하지 않는다면 사용자가 직접 생성해주어야 한다.

마지막으로 위 server list들에 붙어 있는 2888과 3888의 포트 번호들에 대해 알아보자. ZooKeeper 서비스 내의 peer들은 다른 peer와 연결하기 위해 2888 포트 번호를 사용한다. 이 연결은 peer들간 통신이 가능하게 하기 위한 필수적 연결이다. 더 세부적으로 이야기하면, ZooKeeper 서버는 follower들을 leader에 연결시키기 위해 이 포트 번호를 사용한다. 즉, ZooKeeper의 leader가 선출되면 follower는 2888번 포트를 사용하여 TCP 연결을 leader에게 개방한다. 다음으로 포트 번호 3888번은 Service의 leader 선출을 위한 Election에 사용한다. Leader Election 역시 TCP 연결을 사용해서 진행되기 때문에 2888번과 충돌하지 않는 다른 포트 번호를 사용하는 것이다.


Hadoop 사용 시, 메인 서버에서 namenode가 오르지 않는 문제의 해결 방안


1. rm -rf <temporary directory>

: hadoop이 사용하고 있던 데이터 임시 저장 공간을 삭제해준다. main server 뿐 아니라 연결된 모든 remote server 들의 임시 폴더들도 모두 삭제해주어야 한다.


2. ./bin/hadoop namenode -format 

: 메인서버의 namenode 를 포맷해준다.


3. ./bin/start-all.sh 명령어를 통해 모든 Java Process들을 재실행한다.

: namenode 포맷 이후, 메인 서버에서 명령어를 통해 재실행을 하면 대부분의 경우 문제가 해결됨. 즉, 네임노드가 실행되지 않는 이유는 namenode의 format을 원활하게 해주지 못했기 때문인 경우가 가장 많음.

'Software Convergence > Hadoop' 카테고리의 다른 글

Hadoop2 HA(High Availability) 구성 및 환경변수 설정  (0) 2018.07.25
Apache Sqoop 소개  (0) 2018.07.20
Apache Kafka 소개  (0) 2018.07.20
ZooKeeper configuration 설정  (0) 2018.07.19

+ Recent posts