# 네트워크 위상(Topology)과 하둡


로컬 네트워크에서 두 개의 노드가 서로 '근접'하다는 것은 무엇을 의미할까?
대용량 데이터 처리 맥락에서 근접성에 대한 제약 요소는 노드 간 데이터 전송률이다(대역폭은 희소성 높은 필수품이다).
이 아이디어는 두 도느 간 거리 측정을 위해 대역폭을 사용한다.

실제로 노드 간 대역폭을 측정하는 것은 다소 어려울 수 있기 때문에(클러스터는 고정적이여야 하고, 더군다나 클러스터에서 한 쌍의 노드를 구성하는 개수는 전체 노드 수의 제곱에 이른다)
하둡은 간단한 접근법을 사용하는데, 네트워크를 하나의 트리로 표현하고 두 개의 노드 간 거리는 그들에게 가장 가까운 공통 조상으로의 거리를 합계하여 계산한다.
트리에서의 레벨은 미리 정해져 있지 않지만, 일반적으로 데이터 센터, 랙, 하나의 프로세스가 실행 중인 노드에 상응하는 수준을 가진다.
이 아이디어는 이용할 수 있는 대역폭이 다음의 각 시나리오에 따라 점차 줄어든다는 것에서 착안한다.

  • 동일 노드의 프로세스
  • 동일 랙의 다른 노드
  • 동일 데이터 센터에 있는 다른 랙의 노드
  • 다른 데이터 센터에 있는 노드(데이터 센터를 넘나들며 수행되기에는 적합하지 않다)


예를 들어 데이터 센터 d1에 있는 랙 r1 위에 노드 n1을 상상해보자.
이것은 /d1/r1/n1/  으로 표현 될 수 있다.
이 표현을 사용하여 네 개 시나리오에 대한 거리를 측정해보자.

  • distance(/d1/r1/n1, /d1/r1/n1) = 0 (동일 노드의 프로세스)
  • distance(/d1/r1/n1, /d1/r1/n2) = 2 (동일 랙의 다른 노드)
  • distance(/d1/r1/n1, /d1/r2/n3) = 4 (동일 데이터 센터에 있는 다른 랙의 노드)
  • distance(/d1/r1/n1, /d2/r3/n4) = 6 (다른 데이터 센터에 있는 노드)

[그림 3-3]에서 이것을 체게적으로 보여준다(거리 측정(distance metric) 함수)
하둡은 네트워크 위상을 미리 알 수 없다.
하둡이 네트워크 위상을 이해하기 위해서는 어느 정도의 도움이 필요하다.
기본적으로 하둡은 네트워크가 단일 수준의 계층처럼 펼쳐져 있다고 가정한다.
다른 말로 하면 모든 노드는 단일 데이터 센터의 단일 랙에 있다고 가정한다.
이러한 가정은 실제로 작은 클러스터에 해당하기도 하고 더 세부적인 설정 정보는 필요 없기도 하다.

사용자 삽입 이미지

보통 하둡 클러스터의 구조는 [그림 9-1]처럼 두 단계의 네트워크 위상(Network Topology)으로 구성된다.
일반적으로 랙 하나당 30~40대의 서버와 한 대의 1GB 스위치가 있으며, 코어 스위치나 라우터로 가는 업링크uplink는 보통 1GB 이상의 대역폭을 갖는다.
같은 랙에 있는 노드 간의 총 대역폭의 합이 다른 랙의 노드 간의 대역폭 보다 훨씬 크다.

사용자 삽입 이미지
랙 인식 기능
하둡의 최대 성능을 이끌어내기 위해서는 하둡에 네트워크 위상을 설정하여야 한다.
여러분의 클러스터가 단일 랙에서만 구동된다면 기본 설정과 동일하기 때문에 특별히 할 일은 없다.
하지만 다중 랙으로 이루어진 클러스터라면 다수 노드와 랙을 매칭시켜야 한다.
이렇게 설정함으로써 맵리듀스 태스크를 각 노드에 할당할 때 하둡은 랙 외부보다는 랙 내부에서(더 많은 대역폭 사용이 가능) 더 많은 데이터 이동을 발생하려고 한다.
HDFS는 성능과 탄력성을 적절하게 조율하면서 더 지능적으로 복제본을 배치할 수 있다.

노드와 랙 같은 네트워크 위치 정보는 위치 간의 네트워크 '거리'를 반영하는 트리로 표현된다.
네임노드는 블록 복제본을 어디에 배치시킬지를 정할 때 네트워크 위치를 사용한다.
맵리듀스 스케줄러는 맵태스크의 입력으로 사용될 복제본 중 가장 가까운 곳을 결정하기 위해 네트워크 위치 정보를 이용한다.

[그림 9-1]의 네트워크에서 랙 위상은 두 개의 네트워크 위치인 /Switch1/Rack1 과 /Switch1/Rack2 로 기술 되었다.
해당 틀러스터에는 오직 하나의 상위 수준 스위치만 있기 때문에 위치는 /Rack1 과 /Rack2 로 단순화 할 수 있다.

대부분 설치 과정에서 인터페이스를 자체적으로 구현할 필요는 없지만, 매치 정보를 만들기 위해서 사용자가 정의한 스크립트를 실행할 때 ScriptBasedMapping를 기본으로 사용한다.
스크립트의 위치는 toplogy.script.file.name 으로 설정한다.
스크립트는 호스트 이름이나 매칭될 IP주소 같은 다수 인자를 전달받는다.
인자에 해당하는 네트워크 위치 정보는 여백을 구분자로 해서 표준 출력으로 보내야 한다.
하둡 위키의 https://wiki.apache.org/hadoop/topology_rack_awareness_scripts 에 예제 코드가 있다.
스크립트 위치가 명기되지 않으면 모든 노드는 단일 네트워크 위치인 /default-rack 에 매칭된다.



설정 예)
Topology Script :
위치 : $HADOOP_HOME/conf/topology.sh

while [ $# -gt 0 ] ; do
  nodeArg=$1
  exec< ${HADOOP_CONF}/topology.data
  result=""
  while read line ; do
    ar=( $line )
    if [ "${ar[0]}" = "$nodeArg" ] ; then
      result="${ar[1]}"
    fi
  done
  shift
  if [ -z "$result" ] ; then
    echo -n "/default/rack "
  else
    echo -n "$result "
  fi
done

Topology Data :
위치 : $HADOOP_HOME/conf/topology.data

hadoopdata1.ec.com     /dc1/rack1
hadoopdata1            /dc1/rack1
10.1.1.1               /dc1/rack2

Hadoop Topology 설정

설정 파일 : $HADOOP_HOME/conf/core-site.xml

<property>
  <name>topology.script.file.name</name>
  <value>$HADOOP_HOME/conf/topology.sh</value>
</property>


Ambari에서 Topology 설정 정보

설정 예)
Topology Script :
위치 : $HADOOP_HOME/conf/topology_script.py

#!/usr/bin/env python
'''
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
'''

import sys, os
from string import join
import ConfigParser


DEFAULT_RACK = "/default-rack"
DATA_FILE_NAME =  os.path.dirname(os.path.abspath(__file__)) + "/topology_mappings.data"
SECTION_NAME = "network_topology"

class TopologyScript():

  def load_rack_map(self):
    try:
      #RACK_MAP contains both host name vs rack and ip vs rack mappings
      mappings = ConfigParser.ConfigParser()
      mappings.read(DATA_FILE_NAME)
      return dict(mappings.items(SECTION_NAME))
    except ConfigParser.NoSectionError:
      return {}

  def get_racks(self, rack_map, args):
    if len(args) == 1:
      return DEFAULT_RACK
    else:
      return join([self.lookup_by_hostname_or_ip(input_argument, rack_map) for input_argument in args[1:]],)

  def lookup_by_hostname_or_ip(self, hostname_or_ip, rack_map):
    #try looking up by hostname
    rack = rack_map.get(hostname_or_ip)
    if rack is not None:
      return rack
    #try looking up by ip
    rack = rack_map.get(self.extract_ip(hostname_or_ip))
    #try by localhost since hadoop could be passing in 127.0.0.1 which might not be mapped
    return rack if rack is not None else rack_map.get("localhost.localdomain", DEFAULT_RACK)

  #strips out port and slashes in case hadoop passes in something like 127.0.0.1/127.0.0.1:50010
  def extract_ip(self, container_string):
    return container_string.split("/")[0].split(":")[0]

  def execute(self, args):
    rack_map = self.load_rack_map()
    rack = self.get_racks(rack_map, args)
    print rack

if __name__ == "__main__":
  TopologyScript().execute(sys.argv)


Topology Data :
위치 : $HADOOP_HOME/conf/topology_mappings.data
[network_topology]
hostName=/default-rack
211.22.11.33=/default-rack

Hadoop Topology 설정 정보(Ambari Web)
HDFS > Configs > core-site > net.topology.script.file.name
net.topology.script.file.name=/etc/hadoop/conf/topology_script.py
사용자 삽입 이미지

















참고 :
하둡 완벽 가이드
HBase 클러스터 구축과 관리


※ 위 내용은, 여러 자료를 참고하거나 제가 주관적으로 정리한 것입니다.
   잘못된 정보나 보완이 필요한 부분을, 댓글 또는 메일로 보내주시면 많은 도움이 되겠습니다.
11 23, 2015 19:29 11 23, 2015 19:29


Trackback URL : http://develop.sunshiny.co.kr/trackback/1043

Leave a comment

« Previous : 1 : ... 12 : 13 : 14 : 15 : 16 : 17 : 18 : 19 : 20 : ... 648 : Next »

Recent Posts

  1. HDFS - Python Encoding 오류 처리
  2. HP - Vertica ROS Container 관련 오류...
  3. HDFS - Hive 실행시 System Time 오류
  4. HP - Vertica 사용자 쿼리 이력 테이블...
  5. Client에서 HDFS 환경의 데이터 처리시...

Recent Comments

  1. 안녕하세요^^ 배그핵
  2. 안녕하세요^^ 도움이 되셨다니, 저... sunshiny
  3. 정말 큰 도움이 되었습니다.. 감사합... 사랑은
  4. 네, 안녕하세요. 댓글 남겨 주셔서... sunshiny
  5. 감사합니다 많은 도움 되었습니다!ㅎㅎ 프리시퀸스

Recent Trackbacks

  1. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   10 2019   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. 오라클 클럽
  4. API - Java
  5. Apache Hadoop API
  6. Apache Software Foundation
  7. HDFS 생태계 솔루션
  8. DNSBL - Spam Database Lookup
  9. Ready System
  10. Solaris Freeware
  11. Linux-Site
  12. 윈디하나의 솔라나라

Site Stats

TOTAL 2724045 HIT
TODAY 511 HIT
YESTERDAY 589 HIT