Apache Flink는 스트림 처리와 일괄 처리 양쪽에서 모두 고유한 기능을 제공하는 오픈 소스 데이터 처리 프레임워크입니다. 고성능의 확장 가능한 이벤트 중심 애플리케이션 및 아키텍처를 구축하는 데 사용되는 인기 있는 도구입니다.
Confluent를 사용하여 완벽한 데이터 스트리밍 및 분석을 제공하는 업계 유일의 완전 관리형 클라우드 네이티브 Apache Flink® + 서비스형 Kafka를 통해 재사용 가능한 고품질 데이터 스트림을 쉽게 구축할 수 있습니다.
Apache Flink는 바인딩된 스트림과 바인딩되지 않은 스트림에 대한 상태 유지 계산에 사용되는 프레임워크 및 분산 처리 엔진입니다. Flink는 모든 일반 클러스터 환경에서 실행되도록 설계되었으며, 규모에 상관없이 언제나 인메모리 속도로 계산을 수행합니다. 개발자는 Flink 클러스터에서 프레임워크에 의해 실행되는 Java 또는 SQL과 같은 API를 사용하여 Flink용 애플리케이션을 구축합니다.
Apache Spark 및 Kafka Streams와 같은 다른 인기 있는 데이터 처리 시스템은 데이터 스트리밍 또는 일괄 처리 중 하나로 제한되지만, Flink는 둘 다 지원합니다. 일괄 처리 및 스트림 처리를 하나의 통합 플랫폼에서 모두 수행할 수 있어 금융, 전자 상거래 및 통신과 같은 부문의 기업에서 다용도로 활용할 수 있는 도구입니다. 기업에서는 사기 탐지, 개인화된 추천, 주식 시장 분석, 머신 러닝과 같은 최신 애플리케이션에 Apache Flink를 사용할 수 있습니다.
Kafka Streams는 애플리케이션의 일부로 실행되는 라이브러리인 반면, Flink는 독립적으로 배포되는 독립형 스트림 처리 엔진입니다. Apache Flink는 사용자가 배포하는 Flink 클러스터에서 애플리케이션을 실행합니다. 내결함성, 정확한 1회 전달, 높은 처리량, 짧은 지연 시간 등을 갖춰 분산 스트림 처리 시스템이 직면한 어려운 문제에 대한 솔루션을 제공합니다. 이러한 솔루션에는 체크포인트, 세이브포인트, 상태 관리 및 시간 의미론이 포함됩니다.
Flink의 아키텍처는 스트림 및 일괄 처리 모두를 위해 설계되었습니다. 바인딩된 데이터 세트와 바인딩되지 않은 스트림을 처리할 수 있어 실시간 데이터 처리 및 데이터 분석이 가능합니다. 또한 Flink는 복잡한 이벤트 처리 시나리오에서도 데이터 무결성과 일관된 스냅샷을 보장합니다.
아래 다이어그램에서 Flink의 구성 요소와 런타임 흐름을 확인할 수 있습니다. 프로그램 코드 또는 SQL 쿼리가 연산자 그래프로 구성된 다음 클라이언트가 이를 작업 관리자에게 제출합니다. 작업 관리자는 작업을 연산자로 나누고, 이 연산자는, 작업 관리자를 실행 중인 노드에서, 작업으로 실행합니다. 이러한 작업은 스트리밍 데이터를 처리하고 Hadoop 분산 파일 시스템(HDFS) 및 Apache Kafka와 같은 다양한 데이터 소스와 상호 작용합니다.
Apache Flink는 강력한 아키텍처와 광범위한 기능 세트로 사랑받고 있습니다. 정교한 상태 관리, 세이브포인트, 체크포인트, 이벤트 시간 처리 의미론, 상태 유지 처리를 위한 정확히 한 번의 일관성 보장 등의 기능을 제공합니다.
사용자는 Flink의 상태 유지 스트림 처리를 통해 연속 데이터 스트림에 대한 분산 컴퓨팅을 정의할 수 있습니다. 이를 통해 윈도우 조인, 집계 및 패턴 일치와 같은 이벤트 스트림에 대한 복잡한 이벤트 처리 분석을 실행할 수 있습니다.
Flink는 바인딩된 스트림과 바인딩되지 않은 스트림을 모두 처리할 수 있어 일괄 처리 및 스트림 처리를 한 곳에서 통합할 수 있습니다. 따라서 두 가지 유형의 데이터를 모두 처리해야 하는 실시간 스트리밍 애플리케이션과 같은 다양한 데이터 처리 요구 사항에 유용하게 사용할 수 있습니다.
또한 Flink는 거의 모든 규모의 상태 유지 애플리케이션을 실행할 수 있도록 설계되었습니다. 여러 머신에 분산되어 수천 개의 작업으로 병렬화된 데이터를 처리하고, 대규모 데이터 세트를 효율적으로 처리할 수 있습니다. 따라서 지연 시간과 처리량 손실을 최소화하면서 최대 수천 개의 노드로 확장해야 하는 애플리케이션에 적합합니다.
또한 Flink는 다양한 추상화 수준에서 스트림을 처리하는 계층화된 API를 제공합니다. 이는 개발자에게 일반적인 사용 사례는 물론 매우 특수한 스트림 처리 사용 사례를 처리하는 데 필요한 유연성을 제공합니다.
Flink에는 메시징 및 스트리밍 시스템, 데이터 저장소, 검색 엔진, 파일 시스템(예: Apache Kafka, OpenSearch, Elasticsearch, DynamoDB, HBase 및 JDBC 클라이언트를 제공하는 모든 데이터베이스)을 위한 커넥터가 있습니다.
또한 Flink는 하이 레벨 Streaming SQL 및 Table API, 로우 레벨 DataStream API 그리고 미세 제어를 위한 ProcessFunction API 등 다양한 프로그래밍 인터페이스를 제공합니다. 이러한 유연성은 개발자에게 각 문제에 적합한 도구를 제공하며, 바인딩되지 않은 스트림과 바인딩된 데이터 세트를 모두 지원합니다.
또한 Java, Scala, Python 및 Kotlin과 같은 기타 JVM 언어를 포함한 여러 프로그래밍 언어를 지원하여 개발자들 사이에서 인기가 높습니다.
Flink는 일반적인 데이터 프로세서로 구축되었지만, 바인딩되지 않은 스트림을 기본적으로 지원하는 스트림 프로세서로 인기를 얻었습니다. Flink의 일반적인 사용 사례는 Apache Kafka의 사용 사례와 매우 유사하지만, Flink와 Apache Kafka는 용도가 약간 다릅니다. 일반적으로 Apache Kafka는 이벤트 스트리밍을 제공하고 Flink는 해당 스트림의 데이터를 처리하는 데 사용됩니다. Flink와 Apache Kafka는 일반적으로 다음과 같은 용도로 함께 사용됩니다.
일괄 처리: Flink는 바인딩된 데이터 집합을 처리하는 데 매우 탁월하기 때문에 데이터가 유한하고 청크로 처리되는 기존의 일괄 처리 작업에 적합합니다.
스트림 처리: Flink는 바인딩되지 않은 데이터 스트림을 처리하도록 설계되었습니다. 따라서 실시간으로 데이터를 지속적으로 처리할 수 있으므로 실시간 분석 및 모니터링이 필요한 애플리케이션에 적합합니다.
이벤트 기반 애플리케이션: Flink는 이벤트 스트림을 처리하는 기능 덕분에 사기 및 이상 징후 감지 시스템, 신용카드 거래 시스템, 비즈니스 프로세스 모니터링 등과 같은 이벤트 중심 애플리케이션을 구축하는 데 유용하게 활용되는 도구입니다.
상태 유지 애플리케이션(세이브포인트) 업데이트: Flink의 상태 유지 처리 및 세이브포인트를 통해 상태 유지 애플리케이션을 업데이트하고 유지할 수 있습니다. 따라서 장애가 발생해도 일관성과 연속성이 보장됩니다.
스트리밍 애플리케이션: Flink는 간단한 실시간 데이터 처리부터 복잡한 이벤트 처리 및 패턴 감지에 이르기까지, 광범위한 스트리밍 애플리케이션을 지원합니다.
데이터 분석(배치, 스트리밍): Flink는 배치 데이터와 스트리밍 데이터를 모두 처리할 수 있어 데이터 분석에 적합합니다. 실시간 데이터 분석과 과거 데이터 처리가 여기에 포함됩니다.
Apache Flink는 복잡한 아키텍처를 가지고 있습니다. 따라서 배우기가 쉽지 않을 수 있으며, 경험 많은 실무자조차도 이를 이해하여 사용하고 디버그하기 어려울 수 있습니다. Flink 개발자와 운영자는 커스텀 워터마크, 직렬화, 유형 진화 등과 관련된 복잡한 문제로 어려움을 겪는 경우가 많습니다.
대부분의 분산 시스템보다 좀 더 복잡할 수 있는 Flink는 하드웨어 선택 및 작업 특성을 고려하기 위한 성능 조정과 같은 배포 및 클러스터 작업에 어려움을 초래합니다. 일반적인 문제로는 역압, 느린 작업, 지나치게 큰 상태에서 세이브포인트 복원과 같은 성능 문제의 근본 원인에 대한 추론 등이 있습니다. 다른 일반적인 문제로는 체크포인트 실패 수정, 메모리 부족 오류와 같은 작업 실패 디버깅 등을 들 수 있습니다.
Flink를 사용하는 조직은 전문가 팀을 꾸려 스트림 처리 작업을 개발하고 스트림 처리 프레임워크의 운영을 전담하게 하는 경향이 있습니다. 이러한 이유로, Flink는 복잡한 고급 스트림 처리가 필요한 대규모 조직에서만 경제적으로 실현할 수 있었습니다.
Apache Kafka Streams는 입력 및 출력 데이터가 Apache Kafka Cluster에 저장될 때 스트림 처리에 사용되는 인기 있는 클라이언트 라이브러리입니다. Apache Kafka의 일부이기 때문에 기본적으로 Kafka의 장점을 활용합니다.
ksqlDB는 Kafka Streams에 SQL의 간단함을 계층화하여 스트림 처리를 시작할 수 있는 좋은 기반을 제공하고 이를 넓혀 줍니다.
Apache Kafka 사용자와 Confluent 고객은 여러 가지 이유로 스트림 처리 요구 사항을 충족하기 위해 Apache Flink를 사용하는 경우가 많습니다. 예를 들어, 복잡한 스트림 처리는 종종 대규모 중간 상태를 의미하는데, 이 상태가 충분히 커지면 이 상태 자체가 Kafka Cluster를 운영하는 데 필요한 리소스와 계획에 영향을 미치기 때문에 Apache Kafka를 사용하는 것이 항상 합리적이라고 할 수는 없습니다. 또한 서로 다른 위치에 있는 여러 Kafka Cluster의 스트림을 처리해야 하거나, Kafka의 스트림과 Kafka 외부의 스트림을 처리해야 하는 등의 요구 사항이 있을 수 있습니다.
Flink는 고유한 복잡성과 운영 상의 뉘앙스를 가진 자체 분산 시스템이기 때문에 특히 Kafka Streams 또는 Apache Spark와 같은 다른 스트림 처리 기술을 사용할 수 있는 경우 Apache Flink로 작업할 때 발생하는 복잡성이나 관련 비용과 비교해 더 큰 이점을 얻을 수 있는지 여부가 명확하지 않았습니다.
하지만 클라우드는 이러한 우려를 뒤엎고 Apache Flink를 완전히 받아들일 수 있게 해줍니다. Apache Flink를 완전 관리형 클라우드 서비스로 제공함으로써 Confluent Cloud가 Kafka에 제공하는 이점을 Apache Flink에도 제공할 수 있습니다. 인스턴스 유형 또는 하드웨어 프로파일 선택, 노드 구성, 상태 백엔드 선택, 스냅샷, 세이브포인트 관리 등 Apache Flink를 복잡하고 비용이 많이 들게 하는 운영 상의 복잡성과 뉘앙스를 처리하므로 개발자는 Flink와 관련된 뉘앙스가 아닌 애플리케이션 논리에만 집중할 수 있습니다.
이렇게 하면 Flink의 기능을 Confluent Cloud에 제공할 뿐만 아니라 Flink가 스트림 처리에 적합할 때 경제성에도 변화가 생깁니다. 즉, 조직이 스트리밍 성숙도 초기에 있을 때 더 많은 사용 사례에 Flink를 사용할 수 있습니다. 또한 개발자가 적합한 스트림 처리 계층을 선택해 사용할 수 있으므로, 요구 사항이 변경되거나 복잡성이 증가해도 개발자가 하나의 플랫폼을 고수할 수 있습니다.
이제 Flink는 성숙하고 강력한 SQL 인터페이스를 갖추고 있으므로 스트림 처리를 도입하는 최종 사용자뿐만 아니라 Apache Flink를 도입하는 Confluent도 이 인터페이스에서 시작하는 것이 당연합니다.
Introducing the second issue of the Confluent Chronicles comic book! Trust us, this isn’t your typical eBook. Inside you’ll find a fun and relatable approach to learn about the challenges of streaming processing, the basics of Apache Flink, and why Flink and Kafka are better together.