복붙노트

[HADOOP] hdfs : // URI를 사용할 때 NameNode HA

HADOOP

hdfs : // URI를 사용할 때 NameNode HA

HDFS 또는 HFTP URI 스키마 (예 : hdfs : // namenode / path / to / file)를 사용하면 XML 구성 파일 없이도 HDFS 클러스터에 액세스 할 수 있습니다. hdfs dfs -get, hadoop distcp와 같은 쉘 명령을 실행하거나 sc.hado와 같은 Spark에서 파일을 읽는 것은 모든 관련 HDFS 클러스터의 XML 파일을 복사하여 모든 노드에 관리 할 필요가 없기 때문에 sc.hadoopFile ()과 같은 파일을 읽을 때 매우 편리합니다. 코드가 실행될 수 있습니다.

이 접근법의 한 가지 단점은 활성 NameNode의 호스트 이름을 사용해야한다는 것입니다. 그렇지 않으면 Hadoop은 NN이 대기 중이라는 예외를 던집니다.

일반적인 해결 방법은 하나를 시도한 다음 예외가 잡히면 다른 것을 시도하거나 ZooKeeper에 직접 연결하여 protobuf를 사용하여 바이너리 데이터를 구문 분석하는 것입니다.

이 두 가지 방법은 모두 mysql의 loadbalance URI 나 ZooKeeper의 연결 문자열과 비교할 때 번거롭기 때문에 URI의 모든 호스트를 쉼표로 구분할 수 있으며 드라이버는 자동으로 노드를 찾습니다.

활성 및 대기 namenode 호스트 nn1 및 nn2가 있다고 가정 해보십시오. HDFS의 특정 경로를 참조하는 가장 간단한 방법은 무엇입니까?

해결법

  1. ==============================

    1.예 : hdfs : // nameservice_id / file / path / in / hdfs

    예 : hdfs : // nameservice_id / file / path / in / hdfs

    hdfs-site.xml 파일

    id를 추가하여 nameservice를 생성하십시오 (여기서 nameservice_id는 mycluster입니다)

    <property>
      <name>dfs.nameservices</name>
      <value>mycluster</value>
      <description>Logical name for this new nameservice</description>
    </property>
    

    이제 namenode id를 지정하여 클러스터의 namenode를 결정합니다.

    dfs.ha.namenodes. [$ nameservice ID] :

    <property>
      <name>dfs.ha.namenodes.mycluster</name>
      <value>nn1,nn2</value>
      <description>Unique identifiers for each NameNode in the nameservice</description>
    </property>
    

    그런 다음 namenode ids와 namenode 호스트를 연결합니다.

    dfs.namenode.rpc-address. [$ nameservice ID]. [$ name 노드 ID]

    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn1</name>
      <value>machine1.example.com:8020</value>
    </property>
    <property>
      <name>dfs.namenode.rpc-address.mycluster.nn2</name>
      <value>machine2.example.com:8020</value>
    </property>
    

    Nameservice를 사용하여 네임 노드 HA를 적절하게 설정하는 데 관련된 많은 속성들이 있습니다.

    자바 코드로 속성 적용하기

    Configuration conf = new Configuration(false);
    conf.set("dfs.nameservices","mycluster");
    conf.set("dfs.ha.namenodes.mycluster","nn1,nn2");
    conf.set("dfs.namenode.rpc-address.mycluster.nn1","machine1.example.com:8020");
    conf.set("dfs.namenode.rpc-address.mycluster.nn2","machine2.example.com:8020");
    
    FileSystem fsObj =  FileSystem.get("relative/path/of/file/or/dir", conf);
    
    // now use fsObj to perform HDFS shell like operations
    fsObj ...
    
  2. from https://stackoverflow.com/questions/29634344/namenode-ha-when-using-hdfs-uri by cc-by-sa and MIT license