HDFS 튜토리얼: Archi강의, Java API를 이용한 읽기 및 쓰기 작업

HDFS란 무엇입니까?

HDFS는 상용 하드웨어 클러스터에서 실행되는 매우 큰 데이터 파일을 저장하기 위한 분산 파일 시스템입니다. 내결함성이 있고 확장 가능하며 확장이 매우 간단합니다. Hadoop은 다음과 함께 번들로 제공됩니다. HDFS (Hadoop 분산 파일 시스템).

데이터가 단일 물리적 시스템의 스토리지 용량을 초과하는 경우 이를 여러 개의 개별 시스템으로 나누는 것이 필수적입니다. 머신 네트워크 전체에서 스토리지 관련 작업을 관리하는 파일 시스템을 분산 파일 시스템이라고 합니다. HDFS는 그러한 소프트웨어 중 하나입니다.

HDFS Archi강의

HDFS 클러스터는 주로 다음으로 구성됩니다. 네임 노드 파일 시스템을 관리하는 것 메타 데이터데이터 노드 저장하는 것은 실제 데이터.

  • 네임노드: NameNode는 시스템의 마스터로 간주될 수 있습니다. 이는 시스템에 존재하는 모든 파일 및 디렉터리에 대한 파일 시스템 트리와 메타데이터를 유지 관리합니다. 파일 XNUMX개 '네임스페이스 이미지' 그리고 '로그 편집' 메타데이터 정보를 저장하는 데 사용됩니다. 네임노드는 주어진 파일에 대한 데이터 블록을 포함하는 모든 데이터노드에 대한 지식을 가지고 있지만 블록 위치를 지속적으로 저장하지는 않습니다. 이 정보는 시스템이 시작될 때마다 데이터노드에서 재구성됩니다.
  • 데이터노드: DataNode는 클러스터의 각 시스템에 상주하며 실제 스토리지를 제공하는 슬레이브입니다. 클라이언트에 대한 요청 처리, 읽기 및 쓰기를 담당합니다.

HDFS의 읽기/쓰기 작업은 블록 수준에서 작동합니다. HDFS의 데이터 파일은 블록 크기의 청크로 나누어져 독립적인 단위로 저장됩니다. 기본 블록 크기는 64MB입니다.

HDFS는 데이터 블록의 여러 복제본이 생성되어 클러스터 전체의 노드에 분산되어 노드 장애 시 데이터의 고가용성을 가능하게 하는 데이터 복제 개념으로 작동합니다.

당신은 알고 계십니까? 단일 블록보다 작은 HDFS의 파일은 블록의 전체 저장소를 차지하지 않습니다.

HDFS의 읽기 작업

데이터 읽기 요청은 HDFS, NameNode 및 DataNode에서 제공됩니다. 독자를 '클라이언트'라고 부르자. 아래 다이어그램은 파일 읽기 작업을 보여줍니다. 하둡.

HDFS의 읽기 작업

  1. 클라이언트는 호출을 통해 읽기 요청을 시작합니다. '열려 있는()' FileSystem 객체의 메소드; 그것은 유형의 객체이다 분산파일시스템.
  2. 이 객체는 RPC를 사용하여 네임노드에 연결하고 파일 블록 위치와 같은 메타데이터 정보를 가져옵니다. 이 주소는 파일의 처음 몇 블록에 대한 주소입니다.
  3. 이 메타데이터 요청에 대한 응답으로 해당 블록의 복사본이 있는 DataNode의 주소가 다시 반환됩니다.
  4. DataNode의 주소가 수신되면 다음 유형의 객체가 생성됩니다. FSDataInputStream 클라이언트에게 반환됩니다. FSDataInputStream 이 포함되어 있습니다 DFSInputStream DataNode 및 NameNode와의 상호 작용을 관리합니다. 위 다이어그램에 표시된 4단계에서 클라이언트는 다음을 호출합니다. '읽다()' 원인이 되는 방법 DFSInputStream 파일의 첫 번째 블록을 사용하여 첫 번째 DataNode와의 연결을 설정합니다.
  5. 클라이언트가 호출하는 스트림 형식으로 데이터를 읽습니다. '읽다()' 방법을 반복적으로 사용합니다. 이 과정은 읽다() 블록 끝에 도달할 때까지 작업이 계속됩니다.
  6. 블록 끝에 도달하면 DFSInputStream은 연결을 닫고 다음 블록의 다음 DataNode를 찾기 위해 이동합니다.
  7. 고객이 읽기를 마친 후 전화를 겁니다. 닫기() 방법.

HDFS의 쓰기 작업

이 섹션에서는 파일을 통해 데이터가 HDFS에 기록되는 방법을 이해합니다.

HDFS의 쓰기 작업

  1. 클라이언트는 새 파일을 생성하는 DistributedFileSystem 개체의 'create()' 메서드를 호출하여 쓰기 작업을 시작합니다. – 단계 번호. 위 도표의 1.
  2. DistributedFileSystem 개체는 RPC 호출을 사용하여 NameNode에 연결하고 새 파일 생성을 시작합니다. 그러나 이 파일 생성 작업은 어떤 블록도 파일과 연결하지 않습니다. 생성 중인 파일이 이미 존재하지 않고 클라이언트가 새 파일을 생성할 수 있는 올바른 권한을 가지고 있는지 확인하는 것은 NameNode의 책임입니다. 파일이 이미 존재하거나 클라이언트에 새 파일을 생성할 수 있는 충분한 권한이 없는 경우 IO 예외 클라이언트에게 던져집니다. 다른wise, 작업이 성공하고 파일에 대한 새 레코드가 NameNode에 의해 생성됩니다.
  3. NameNode에 새 레코드가 생성되면 FSDataOutputStream 유형의 개체가 클라이언트에 반환됩니다. 클라이언트는 이를 사용하여 HDFS에 데이터를 씁니다. 데이터 쓰기 메소드가 호출됩니다(다이어그램의 3단계).
  4. FSDataOutputStream에는 DataNode 및 NameNode와의 통신을 관리하는 DFSOutputStream 개체가 포함되어 있습니다. 클라이언트가 계속해서 데이터를 쓰는 동안, DFS출력스트림 이 데이터로 계속해서 패킷을 생성합니다. 이러한 패킷은 다음과 같은 대기열에 추가됩니다. 데이터큐.
  5. 라는 구성 요소가 하나 더 있습니다. 데이터스트리머 이것을 소비하는 데이터큐. DataStreamer는 또한 NameNode에게 새 블록 할당을 요청하여 복제에 사용할 바람직한 DataNode를 선택합니다.
  6. 이제 DataNode를 사용하여 파이프라인을 생성하는 것으로 복제 프로세스가 시작됩니다. 우리의 경우 복제 수준을 3으로 선택했으므로 파이프라인에 3개의 DataNode가 있습니다.
  7. DataStreamer는 파이프라인의 첫 번째 DataNode에 패킷을 쏟아 붓습니다.
  8. 파이프라인의 모든 DataNode는 수신한 패킷을 저장하고 이를 파이프라인의 두 번째 DataNode로 전달합니다.
  9. 또 다른 큐인 'Ack Queue'는 DataNode의 승인을 기다리는 패킷을 저장하기 위해 DFSOutputStream에 의해 유지됩니다.
  10. 대기열의 패킷에 대한 승인이 파이프라인의 모든 DataNode로부터 수신되면 '승인 대기열'에서 제거됩니다. DataNode에 오류가 발생하면 이 대기열의 패킷이 작업을 다시 시작하는 데 사용됩니다.
  11. 클라이언트는 데이터 쓰기 작업을 마친 후 close() 메서드를 호출합니다(다이어그램의 9단계). close()를 호출하면 나머지 데이터 패킷이 파이프라인으로 플러시되고 승인을 기다립니다.
  12. 최종 승인을 받으면 NameNode에 연결하여 파일 쓰기 작업이 완료되었음을 알립니다.

JAVA API를 사용하여 HDFS에 액세스

이 섹션에서는 이해하려고 노력합니다. 자바 Hadoop의 파일 시스템에 액세스하는 데 사용되는 인터페이스입니다.

Hadoop의 파일 시스템과 프로그래밍 방식으로 상호 작용하기 위해 Hadoop은 여러 JAVA 클래스를 제공합니다. org.apache.hadoop.fs라는 패키지에는 Hadoop의 파일 시스템에서 파일을 조작하는 데 유용한 클래스가 포함되어 있습니다. 이러한 작업에는 열기, 읽기, 쓰기 및 닫기가 포함됩니다. 실제로 Hadoop용 파일 API는 일반적이며 HDFS 이외의 다른 파일 시스템과 상호 작용하도록 확장될 수 있습니다.

프로그래밍 방식으로 HDFS에서 파일 읽기

객체 java.net.URL 파일의 내용을 읽는 데 사용됩니다. 우선, Java가 Hadoop의 hdfs URL 체계를 인식하도록 해야 합니다. 이는 전화를 통해 수행됩니다. setURLStreamHandlerFactory URL 개체의 메서드와 FsUrlStreamHandlerFactory 인스턴스가 전달됩니다. 이 메소드는 당 한 번만 실행되어야 합니다. JVM이므로 정적 블록으로 묶입니다.

예제 코드는 다음과 같습니다.

public class URLCat {
    static {
        URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
    }
    public static void main(String[] args) throws Exception {
        InputStream in = null;
        try {
            in = new URL(args[0]).openStream();
            IOUtils.copyBytes(in, System.out, 4096, false);
        } finally {
            IOUtils.closeStream(in);
        }
    }
}

이 코드는 파일의 내용을 열고 읽습니다. HDFS에 있는 이 파일의 경로는 명령줄 인수로 프로그램에 전달됩니다.

명령줄 인터페이스를 사용하여 HDFS에 액세스

이는 HDFS와 상호 작용하는 가장 간단한 방법 중 하나입니다. 명령줄 인터페이스는 파일 읽기, 디렉터리 생성, 파일 이동, 데이터 삭제, 디렉터리 나열과 같은 파일 시스템 작업을 지원합니다.

우리는 달릴 수 있습니다 '$HADOOP_HOME/bin/hdfs dfs -help' 모든 명령에 대한 자세한 도움말을 얻으려면 여기, 'dfs' 여러 하위 명령을 지원하는 HDFS의 쉘 명령입니다.

널리 사용되는 명령 중 일부는 일부 명령과 함께 아래에 나열되어 있습니다.tails 각각의.

1. 로컬 파일 시스템에서 HDFS로 파일 복사

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

명령줄 인터페이스를 사용하여 HDFS에 액세스

이 명령은 로컬 파일 시스템의 temp.txt 파일을 HDFS로 복사합니다.

2. 다음을 사용하여 디렉토리에 있는 파일을 나열할 수 있습니다. -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

명령줄 인터페이스를 사용하여 HDFS에 액세스

우리는 파일을 볼 수 있습니다 '임시.txt' (앞서 복사한 것)이 아래에 나열되어 있습니다. '/' 디렉토리.

3. HDFS에서 로컬 파일 시스템으로 파일을 복사하는 명령

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

명령줄 인터페이스를 사용하여 HDFS에 액세스

우리는 볼 수있다 임시.txt 로컬 파일 시스템에 복사되었습니다.

4. 새 디렉터리를 생성하는 명령

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

명령줄 인터페이스를 사용하여 HDFS에 액세스

디렉터리가 생성되었는지 확인합니다. 이제 어떻게 해야 하는지 알아야 합니다 😉