아파치 플링크(Apache Flink) 스트림 프로세싱 프레임워크 구성
Apache Flink 개요
Apache Flink는 고성능, 저지연, 그리고 분산 스트리밍 데이터 처리 시스템입니다. Flink는 실시간 스트리밍 데이터와 배치 데이터를 모두 처리할 수 있는 유연한 플랫폼을 제공합니다. 주로 실시간 분석, 데이터 파이프라인, ETL(Extract, Transform, Load) 작업, 이벤트 기반 애플리케이션 등에 사용됩니다.
주요 특징
- 저지연 스트리밍 처리: Flink는 이벤트가 발생하는 즉시 데이터를 처리할 수 있습니다.
- 높은 처리량: 분산 시스템 구조로 인해 대규모 데이터도 빠르게 처리할 수 있습니다.
- 상태 관리: Flink는 상태 기반의 스트리밍 작업을 지원하며, 상태를 효율적으로 관리할 수 있는 기능을 제공합니다.
- 유연한 API: DataStream API와 DataSet API를 제공하여 스트리밍 및 배치 데이터 처리를 쉽게 구현할 수 있습니다.
- 확장성: 필요에 따라 클러스터를 확장하여 더 많은 데이터와 작업을 처리할 수 있습니다.
Apache Flink 구성
클러스터 구성 요소
- JobManager: 작업을 조정하고 실행을 관리하는 중앙 노드입니다.
- TaskManager: 실제로 작업을 수행하는 워커 노드입니다. 각 TaskManager는 여러 Task Slot을 가지고 있습니다.
- Client: 사용자가 Flink 클러스터에 작업을 제출하는 인터페이스입니다.
설치 및 설정
1. Flink 다운로드
Flink의 최신 버전을 Apache Flink 공식 웹사이트에서 다운로드합니다.
wget https://downloads.apache.org/flink/flink-1.14.0/flink-1.14.0-bin-scala_2.12.tgz
tar -xzf flink-1.14.0-bin-scala_2.12.tgz
cd flink-1.14.0
2. 클러스터 설정
conf/flink-conf.yaml
파일을 편집하여 클러스터 설정을 합니다. 기본 설정은 로컬 모드로 실행되지만, 분산 모드로 변경할 수 있습니다.
jobmanager.rpc.address: jobmanager-host
taskmanager.numberOfTaskSlots: 4
parallelism.default: 4
3. JobManager 및 TaskManager 시작
# JobManager 시작
bin/start-cluster.sh
# TaskManager 추가 (필요 시)
bin/taskmanager.sh start
Apache Flink 사용법
1. 간단한 Flink 프로그램 작성
다음은 Flink에서 "Hello World" 수준의 간단한 스트리밍 프로그램 예제입니다.
Java 예제
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class HelloFlink {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.fromElements("Hello", "Flink")
.print();
env.execute("Hello Flink");
}
}
2. Flink 작업 제출
작업을 컴파일하고 JAR 파일을 생성한 후 Flink 클러스터에 제출합니다.
# Maven을 사용하여 프로젝트 컴파일
mvn clean package
# 작업 제출
bin/flink run -c com.example.HelloFlink /path/to/your/flink-job.jar
3. Flink Web UI 사용
Flink는 기본적으로 8081 포트에서 웹 UI를 제공합니다. http://localhost:8081에 접속하여 작업의 상태를 모니터링할 수 있습니다.
4. 커넥터 및 라이브러리 사용
Flink는 다양한 데이터 소스 및 싱크와의 연동을 위한 커넥터를 제공합니다. 예를 들어, Kafka 커넥터를 사용하여 Kafka 토픽으로부터 데이터를 읽고 쓸 수 있습니다.
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer;
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class KafkaExample {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties properties = new Properties();
properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "flink-group");
properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("input-topic", new SimpleStringSchema(), properties);
FlinkKafkaProducer<String> producer = new FlinkKafkaProducer<>("output-topic", new SimpleStringSchema(), properties);
env.addSource(consumer)
.map(value -> "Processed: " + value)
.addSink(producer);
env.execute("Kafka Example");
}
}
위의 예제는 Kafka로부터 데이터를 읽어와서 간단히 처리한 후 다시 Kafka로 전송하는 작업입니다.
결론
Apache Flink는 실시간 데이터 스트리밍 처리를 위한 강력한 도구로, 높은 처리량과 저지연, 그리고 유연한 확장성을 제공합니다. Flink를 통해 다양한 데이터 소스와 싱크를 연결하고 복잡한 데이터 파이프라인을 구성할 수 있습니다. 설치 및 설정 과정은 비교적 간단하며, 다양한 API와 커넥터를 통해 원하는 작업을 손쉽게 구현할 수 있습니다.