hadoop HDFS 랙 인식
4238 단어 hadoop
실험 환경 hadoop : 2.6.5
master: 192.168.1.160
slave1: 192.168.1.161
랙 인식
하나의hadoop분포식 집단은 많은 서버가 있을 것이다. 선반 슬롯과 교환기 인터페이스의 제한을 받기 때문에 대형 분포식 집단은 여러 개의 선반을 뛰어넘는다. 선반 안의 서버 간의 네트워크 속도는 보통 선반 서버 간의 네트워크 속도보다 높고 선반 사이의 서버의 네트워크 통신은 상부 교환기 간의 네트워크 대역폭의 제한을 받는다.
HDFS는 데이터 파일에 블록을 나누어 저장합니다. 블록마다 기본적으로 3개의 복사본이 있습니다. (3보다 크게 설정할 수도 있습니다.) HDFS는 복사본에 대한 저장 정책은 다음과 같습니다.
hadoop : 2.6.5
master: 192.168.1.160
slave1: 192.168.1.161
하나의hadoop분포식 집단은 많은 서버가 있을 것이다. 선반 슬롯과 교환기 인터페이스의 제한을 받기 때문에 대형 분포식 집단은 여러 개의 선반을 뛰어넘는다. 선반 안의 서버 간의 네트워크 속도는 보통 선반 서버 간의 네트워크 속도보다 높고 선반 사이의 서버의 네트워크 통신은 상부 교환기 간의 네트워크 대역폭의 제한을 받는다.
HDFS는 데이터 파일에 블록을 나누어 저장합니다. 블록마다 기본적으로 3개의 복사본이 있습니다. (3보다 크게 설정할 수도 있습니다.) HDFS는 복사본에 대한 저장 정책은 다음과 같습니다.
이러한 전략은 주로 데이터의 신뢰성과 데이터 접근의 성능을 고려하기 위한 것이다.
hadoop이 선반에 대한 감지는 스스로 적응하는 것이 아니라 사용자가hadoop기계(ip)와 선반의 대응 관계를 알려줘야 한다.
실현
hadoop 프레임 감지는 두 가지 방식으로 실현할 수 있으며 프레임 감지 프로그램과 스크립트 방식을 작성할 수 있다.
랙 감지기
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
```
mvn package -Dmaven.test.skip=true
net.topology.node.switch.mapping.impl
com.tongfang.learn.MyDNSToSwitchMapping
./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
net.topology.script.file.name
/home/hadoop/test.py
./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 두 개의 선반에 분포되어 있음을 알 수 있다.