"복제 트래픽만 다른 NIC 로 보내고 싶다" 는 요구는 HDFS 설정만으로는 이룰 수 없다. DataNode 는 클라이언트 읽기·쓰기와 블록 복제를 같은 데이터 전송 포트로 처리하며, 용도별로 주소를 나누는 설정이 없다. dfs.datanode.replication.address 같은 속성은 존재하지 않는다.
트래픽을 물리적으로 가르려면 OS 쪽 라우팅이나 본딩으로 해결한다. 실무에서 쓰이는 방법은 두 가지다.
주소를 하나로 고정하려면 각 서비스의 주소 속성에 그 IP 를 적는다.
ip -br addr
hdfs-site.xml 에서 DataNode 쪽을 지정한다. Hadoop 3 기본 포트를 기준으로 한다.
<configuration>
<property>
<name>dfs.datanode.address</name>
<value>10.10.20.11:9866</value>
</property>
<property>
<name>dfs.datanode.ipc.address</name>
<value>10.10.20.11:9867</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>10.10.20.11:9864</value>
</property>
</configuration>
NameNode 쪽은 HA 여부에 따라 속성 이름이 달라진다. 단일 NameNode 면 다음과 같다.
<configuration>
<property>
<name>dfs.namenode.rpc-address</name>
<value>10.10.20.10:8020</value>
</property>
<property>
<name>dfs.namenode.http-address</name>
<value>10.10.20.10:9870</value>
</property>
</configuration>
HA 구성이면 dfs.namenode.rpc-address.<nameservice>.<nn-id> 형태로 네임서비스와 NameNode 식별자를 붙여 지정한다.
호스트마다 IP 가 다르므로 설정 파일을 노드별로 다르게 배포해야 한다. 이것이 번거로우면 모든 노드가 같은 파일을 쓰도록 호스트명 해석 쪽에서 푼다. /etc/hosts 나 DNS 에서 각 노드의 정규 호스트명이 원하는 NIC 의 IP 로 풀리게 해 두면, 설정은 호스트명 기반으로 두어도 의도한 주소에 바인드된다.
Hadoop 에는 인터페이스 이름으로 주소를 고르게 하는 속성도 있다.
<property>
<name>dfs.datanode.dns.interface</name>
<value>eth1</value>
</property>
이 방식은 노드마다 인터페이스 이름이 같아야 쓸 수 있고, 버전에 따라 동작이 달라 권장되지 않는다. (확인 필요)
클라이언트가 어떤 로컬 인터페이스로 DataNode 에 붙을지는 dfs.client.local.interfaces 로 지정할 수 있다.
<property>
<name>dfs.client.local.interfaces</name>
<value>eth1</value>
</property>
여러 개를 적으면 라운드로빈으로 고른다. 이것은 나가는 쪽 인터페이스를 고르는 설정이며, DataNode 가 어느 주소로 응답하는지와는 별개다.
Hadoop 2 에서 쓰던 5xxxx 대 포트가 Hadoop 3 에서 바뀌었다. 옛 문서를 그대로 따라 방화벽을 열면 통신이 되지 않는다.
| 역할 | Hadoop 3 | Hadoop 2 |
|---|---|---|
| NameNode RPC | 8020 | 8020 |
| NameNode HTTP | 9870 | 50070 |
| NameNode HTTPS | 9871 | 50470 |
| DataNode 데이터 전송 | 9866 | 50010 |
| DataNode HTTP | 9864 | 50075 |
| DataNode IPC | 9867 | 50020 |
| Secondary NameNode HTTP | 9868 | 50090 |
ss -tlnp | grep -E "8020|987[01]|986[4-7]"
hdfs dfsadmin -report
hdfs getconf -confKey dfs.datanode.address
dfsadmin -report 에 나오는 DataNode 주소가 의도한 서브넷인지 본다. 클라이언트는 NameNode 가 알려 준 이 주소로 직접 붙으므로, 여기가 관리용 주소로 잡혀 있으면 데이터 트래픽도 그쪽으로 흐른다.
nn/_HOST@REALM)의 호스트명 해석도 함께 확인해야 한다.