파일 시스템

파일 시스템 (File Systems)

Apache Flink는 애플리케이션 결과와 내결함성·복구를 위해 파일 시스템을 사용해 데이터를 소비하고 영구 저장합니다. 여기에는 local, hadoop-compatible, Amazon S3, Aliyun OSS, Azure Blob Storage 등 가장 널리 쓰이는 파일 시스템들이 포함됩니다.

출처: 문서

본문

Apache Flink는 애플리케이션 결과와 내결함성·복구를 위해 파일 시스템을 사용해 데이터를 소비하고 영구 저장합니다. 다음은 가장 널리 쓰이는 파일 시스템들입니다: local, hadoop-compatible, Amazon S3, Aliyun OSS, Azure Blob Storage.

특정 파일에 사용되는 파일 시스템은 해당 파일의 URI scheme 으로 결정됩니다. 예를 들어 file:///home/user/text.txt 는 로컬 파일 시스템의 파일을 나타내고, hdfs://namenode:50010/data/user/text.txt 는 특정 HDFS 클러스터의 파일입니다.

파일 시스템 인스턴스는 프로세스당 한 번 생성된 뒤 캐시/풀링됩니다. 이는 스트림 생성마다 구성 오버헤드를 피하고 연결/스트림 제한 같은 특정 제약을 강제하기 위함입니다.

로컬 파일 시스템

Flink는 로컬 머신의 파일 시스템(그 로컬 파일 시스템에 마운트된 NFS 나 SAN 드라이브 포함)에 대한 내장 지원을 제공합니다. 추가 구성 없이 기본적으로 사용할 수 있습니다. 로컬 파일은 file:// URI scheme 으로 참조됩니다.

플러그 가능한 파일 시스템 (Pluggable File Systems)

Apache Flink 프로젝트는 다음 파일 시스템을 지원합니다:

  • Amazon S3 오브젝트 스토리지는 flink-s3-fs-prestoflink-s3-fs-hadoop 두 가지 구현으로 지원됩니다. 두 구현 모두 의존성 없이 자체적으로 완결됩니다.
  • Aliyun Object Storage Serviceflink-oss-fs-hadoop 로 지원되며 oss:// URI scheme 으로 등록됩니다. 구현은 Hadoop Project 를 기반으로 하지만 의존성 없이 자체적으로 완결됩니다.
  • Azure Data Lake Store Gen2flink-azure-fs-hadoop 로 지원되며 abfs(s):// URI scheme 으로 등록됩니다. 구현은 Hadoop Project 를 기반으로 하지만 의존성 없이 자체적으로 완결됩니다.
  • Azure Blob Storageflink-azure-fs-hadoop 로 지원되며 wasb(s):// URI scheme 으로 등록됩니다. 구현은 Hadoop Project 를 기반으로 하지만 의존성 없이 자체적으로 완결됩니다.
  • Google Cloud Storagegcs-connector 로 지원되며 gs:// URI scheme 으로 등록됩니다. 구현은 Hadoop Project 를 기반으로 하지만 의존성 없이 자체적으로 완결됩니다.

이들을 plugin 으로 사용할 수 있고 사용해야 합니다.

플러그 가능한 파일 시스템을 사용하려면 Flink 를 시작하기 전에 해당 JAR 파일을 Flink 배포판의 opt 디렉터리에서 plugins 디렉터리 아래의 디렉터리로 복사하세요. 예:

mkdir ./plugins/s3-fs-hadoop
cp ./opt/flink-s3-fs-hadoop-2.3.0.jar ./plugins/s3-fs-hadoop/

주의: 파일 시스템용 plugin 메커니즘은 Flink 버전 1.9 에서 plugin 마다 전용 Java 클래스 로더를 지원하고 클래스 셰이딩(shading) 메커니즘에서 벗어나기 위해 도입되었습니다. 이전 메커니즘을 통해 해당 JAR 파일을 lib 디렉터리에 복사해 제공된 파일 시스템(또는 자체 구현)을 여전히 사용할 수 있습니다. 그러나 1.10 부터 s3 플러그인은 반드시 plugin 메커니즘을 통해 로드해야 합니다; 이 플러그인들은 더 이상 셰이딩되지 않으므로(구체적으로 1.10 부터 클래스가 재배치되지 않으므로) 이전 방식은 더 이상 작동하지 않습니다.

파일 시스템을 지원하는 경우 plugins 기반 로딩 메커니즘을 사용하는 것이 권장됩니다. lib 디렉터리에서 파일 시스템 컴포넌트를 로드하는 것은 향후 Flink 버전에서 지원되지 않을 것입니다.

새 플러그 가능한 파일 시스템 구현 추가하기

파일 시스템은 그 파일 시스템에서 파일과 객체에 접근·수정하는 방법을 포착하는 org.apache.flink.core.fs.FileSystem 클래스로 표현됩니다.

새 파일 시스템을 추가하려면:

  • org.apache.flink.core.fs.FileSystem 의 서브클래스인 File System 구현을 추가합니다.
  • 그 파일 시스템을 인스턴스화하고 FileSystem 이 등록되는 scheme 을 선언하는 팩토리를 추가합니다. 이는 org.apache.flink.core.fs.FileSystemFactory 의 서브클래스여야 합니다.
  • 서비스 항목을 추가합니다. 파일 시스템 팩토리 클래스의 클래스 이름을 포함하는 META-INF/services/org.apache.flink.core.fs.FileSystemFactory 파일을 만듭니다(자세한 내용은 Java Service Loader 문서 참고).
  • 선택 사항으로, 팩토리에서 getPriority() 를 오버라이드해 상대적 우선순위를 선언합니다. 이는 같은 URI scheme 에 여러 팩토리가 존재할 수 있을 때(예: FS 백엔드 간 마이그레이션 중) 유용합니다. 가장 높은 우선순위의 팩토리가 선택됩니다. 기본 우선순위는 0 입니다. 구성으로 우선순위를 오버라이드하는 방법은 Common Configurations 를 참고하세요. 새 실험적 팩토리에는 getPriority()return -1 하도록 오버라이드하는 것이 권장됩니다. 이렇게 하면 파일 시스템 마이그레이션에 안전한 프로덕션 기본값을 제공할 수 있습니다.

플러그인 탐색 중 파일 시스템 팩토리 클래스는 다른 플러그인 및 Flink 컴포넌트와의 클래스 충돌을 피하기 위해 전용 Java 클래스 로더로 로드됩니다. 파일 시스템 인스턴스화와 파일 시스템 연산 호출 중에는 같은 클래스 로더를 사용해야 합니다.

실제로는 구현에서 Thread.currentThread().getContextClassLoader() 클래스 로더를 사용하지 않아야 함을 의미합니다.

Hadoop 파일 시스템 (HDFS) 및 그 외 구현

Flink 가 직접 지원하는 파일 시스템을 찾을 수 없는 모든 scheme 에서는 Hadoop 으로 대체됩니다. flink-runtime 과 Hadoop 라이브러리가 클래스패스에 있으면 모든 Hadoop 파일 시스템이 자동으로 사용 가능합니다.

이 방식으로 Flink 는 org.apache.hadoop.fs.FileSystem 인터페이스를 구현하는 모든 Hadoop 파일 시스템과 모든 Hadoop 호환 파일 시스템(HCFS)을 원활하게 지원합니다.

  • HDFS (테스트됨)
  • Alluxio (테스트됨, 아래 구성 참고)
  • XtreemFS (테스트됨)
  • Hftp 를 통한 FTP (테스트되지 않음)
  • HAR (테스트되지 않음)

Hadoop 구성은 core-site.xml 파일에 필요한 파일 시스템 구현에 대한 항목이 있어야 합니다. [Alluxio 예제를 참고하세요.

특별히 필요하지 않다면 Flink 의 내장 파일 시스템을 사용할 것을 권장합니다. 예를 들어 그 파일 시스템을 Hadoop 의 core-site.xml 에 있는 fs.defaultFS 구성 속성을 통해 YARN 의 리소스 저장소로 사용할 때처럼, Hadoop 파일 시스템을 직접 사용해야 할 수 있습니다.

Alluxio

Alluxio 지원을 위해 core-site.xml 파일에 다음 항목을 추가하세요:

<property>
  <name>fs.alluxio.impl</name>
  <value>alluxio.hadoop.FileSystem</value>
</property>

더 알아보기 (Learn more)