hadoop HDFS 랙 인식

4238 단어 hadoop

실험 환경

hadoop : 2.6.5
master: 192.168.1.160
slave1: 192.168.1.161

랙 인식


하나의hadoop분포식 집단은 많은 서버가 있을 것이다. 선반 슬롯과 교환기 인터페이스의 제한을 받기 때문에 대형 분포식 집단은 여러 개의 선반을 뛰어넘는다. 선반 안의 서버 간의 네트워크 속도는 보통 선반 서버 간의 네트워크 속도보다 높고 선반 사이의 서버의 네트워크 통신은 상부 교환기 간의 네트워크 대역폭의 제한을 받는다.
HDFS는 데이터 파일에 블록을 나누어 저장합니다. 블록마다 기본적으로 3개의 복사본이 있습니다. (3보다 크게 설정할 수도 있습니다.) HDFS는 복사본에 대한 저장 정책은 다음과 같습니다.
  • 첫 번째 블록 복사본은client가 있는 node에 놓여 있습니다(client가 집단 범위 내에 있지 않으면 이 첫 번째 node는 무작위로 선택됩니다)
  • 두 번째 사본은 첫 번째 노드와 다른 프레임의 node에 놓여 있다(무작위 선택)
  • 세 번째 사본은 첫 번째 사본이 있는 노드와 같은 선반의 다른 노드에 놓여 있다..
  • 더 많은 사본이 있으면 무작위로 집단의 노드에 넣는다..

  • 이러한 전략은 주로 데이터의 신뢰성과 데이터 접근의 성능을 고려하기 위한 것이다.
  • 데이터는 서로 다른 랙에 분포되어 있으며, 전체 랙이 마운트된 후에도 다른 랙에 중복된 백업이 있어도 전체 클러스터는 대외 서비스를 제공할 수 있습니다
  • 데이터는 서로 다른 프레임에 분포되어 있으며,mapreduce 작업을 실행할 때 가까운 곳에서 필요한 데이터를 얻을 수 있습니다

  • hadoop이 선반에 대한 감지는 스스로 적응하는 것이 아니라 사용자가hadoop기계(ip)와 선반의 대응 관계를 알려줘야 한다.

    실현


    hadoop 프레임 감지는 두 가지 방식으로 실현할 수 있으며 프레임 감지 프로그램과 스크립트 방식을 작성할 수 있다.
    랙 감지기
  • 인터페이스 DNStoSwitchMapping 구현
    import org.apache.hadoop.net.DNSToSwitchMapping;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MyDNSToSwitchMapping implements DNSToSwitchMapping {
    
        @Override
        public List resolve(List list) {
            List paths = new ArrayList();
            if (list != null && !list.isEmpty()) {
                for (String hostname : list) {
                    String rackPath = "";
                    if ("master".equals(hostname)) { // , master slave1。
                        rackPath = "/rack1";
                    } else {
                        rackPath = "/rack2";
                    }
                    paths.add(rackPath);
                }
            }
            return paths;
        }
    
        @Override
        public void reloadCachedMappings() {
        }
    
        @Override
        public void reloadCachedMappings(List list) {
        }
    }
    

  • pom.xml
    ```
    
    	org.apache.hadoop
    	hadoop-client
    	2.6.5
    
    ```
    
  • 상기 코드를 포장하여master 노드hadoop 루트 디렉터리share/hadoop/common/lib에 업로드합니다..
     mvn package -Dmaven.test.skip=true
    
  • 코어 사이트 수정.xml 설정..
           
        net.topology.node.switch.mapping.impl                
        com.tongfang.learn.MyDNSToSwitchMapping
    	
    
    
  • jar 패키지와 수정된 설정을 slave1 노드에 나누어 주고 노드를 다시 시작합니다
    ./sbin/start-dfs.sh 
    
  • 집단 기계의 분포 상황을 살펴보다
    [hadoop@master hadoop-2.6.5]$ ./bin/hdfs  dfsadmin -printTopology
    Rack: /rack1
       192.168.1.160:50010 (master)
    Rack: /rack2
       192.168.1.161:50010 (slave1)
    
    기계가 rack1과 rack2 두 개의 선반에 분포되어 있음을 알 수 있다..

  • 스크립트hadoop도 스크립트 방식으로 프레임 감지 방식을 설정합니다. 흔히 볼 수 있는 실현 방식은 셸 스크립트와python 스크립트 두 가지가 있습니다. 여기서python 스크립트를 예로 들겠습니다.
  • 감지 스크립트를 작성하고 실행 권한을 부여합니다.
    #!/usr/bin/python
    #coding=utf-8
    import sys
    rack={
              "192.168.1.160":"/dc1/rack1",
              "192.168.1.161":"/dc1/rack2",
              "master":"/dc1/rack1",
              "slave1":"/dc1/rack2",
            }
            
    if __name__=="__main__":
    	print rack.get(sys.argv[1], "default-rack") # ip , default-rack
    

  • 호스트 이름인지 IP 주소인지 정확한 문서를 찾지 못했기 때문에 스크립트에서 호스트 이름과 IP 주소를 호환하는 것이 좋습니다.
     :
    
    	chmod +x test.py
    
  • 마스터에서 코어 사이트를 수정합니다.xml 설정..
    
    	net.topology.script.file.name
    	/home/hadoop/test.py
    	
    
  • 스크립트와 수정된 설정을 slave1에 나누어 주고 그룹을 다시 시작합니다
    ./sbin/start-dfs.sh 
    
  • 집단기계 분포 상황 보기..
    [hadoop@master hadoop-2.6.5]$ ./bin/hdfs  dfsadmin -printTopology
    Rack: /dc1/rack1
       192.168.1.160:50010 (master)
    Rack: /dc1/rack2
       192.168.1.161:50010 (slave1)
    
    

  • 기계가/dc1/rack1과/dc1/rack2 두 개의 선반에 분포되어 있음을 알 수 있다.

    좋은 웹페이지 즐겨찾기