programming/Flink
01. Flink란?
yhsim98
2023. 3. 5. 20:16
Flink
- 빅데이터 처리 및 분석을 위한 오픈 소스 분산 컴퓨팅 시스템
- 핵심 기능으로는
- 이벤트 시간과 처리 시간 시멘틱
- 순서가 바뀐 이벤트가 들어오더라도 일관성 있고 정확한 결과를 제공한다
- 상태 일관성 보장
- 아파치 하둡, 아파치 카프카, JDBC 등 저장 시스템과 연결하는 여러 종류의 커넥터를 제공한다
- 이벤트 시간과 처리 시간 시멘틱
- 스트림과 배치 작업 모두에 대해 정확하게 한 번만 처리할 수 있는 매커니즘이 내장되어 있다
- 멱등성, 데이터 중복 방지
- 언어는 자바와 스칼라 지원
- 아파치 하둡, 아파치 카프카와 같은 다른 빅데이터 도구와 통합될 수 있다
- Flink에서 애플리케이션은 사용자 정의 연산자에 의해 변환될 수 있는 데이터 흐름으로 구성된다
- 데이터는 하나 이상의 데이터 소스로부터 변환을 수행하고 하나 이상의 싱크로 끝나는 순서를 가진다
데이터플로우 그래프
- 방향성 그래프는 데이터플로우 프로그램을 표시하는 일반적인 방법
- 방향성 그래프의 노드는 연산자라 보르고, 에지는 의존관계를 표현한다
- 데이터 플로우 그래프는 논리적 그래프로, 그래프를 실행하려면 물러직 그래프로 변환해야 한다
- 물리적 데이터플로우에서 노드는 task로 병렬로 수행될 수 있다
- 각 태스크는 입력 데이터를 분할해 연산을 수행한다
데이터 병렬화와 태스크 병렬화
- 데이터플로우 그래프는 여러 방식으로 병렬화 할 수 있다
- 첫 번째 동일 연산을 수행하는 태스크를 각 입력 파티션에 할당해 병렬로 실행
- 이런 종류의 병렬화를 데이터 병렬화라고 부른다
- 두 번째 같거나 다른 데이터에 여러 연산을 수행하는 태스크를 할당할 수 있다
- 태스크 병렬화라 한다
데이터 교환 전략
- 물리적 데이터플로우 그래프에서 어떤 태스크로 레코드를 할당할지 정의
- 전진 전략
- 한 태스크로 들어온 데이터를 다른 태스크 쪽으로 내보낸다
- 브로드캐스트 전략
- 모든 래코드를 연산자의 모든 병렬 태스크로 내보낸다
- 데이터를 복제하고 네트워크를 사용하므로 비용이 비싼 편
- 키 기반 전략
- 데이터를 기준으로 모아 같은 키 값을 가진 데이터를 같은 태스크에 모이도록 보장
- 랜덤 전략
병렬 데이터 흐름
- Flink의 프로그램은 본질적으로 병렬 및 분산입니다.
- 스트림에는 하나 이상의 스트림 파티션이 있고, 각 연산자에는 하나 이상의 연산자 하위 작업이 있다
- 연산자 하위 작업은 각자 독립적이며 서로 다른 스레드에서 실행되며 서로 다른 머신이나 컨테이너에서 실행될 수 있다
Stateful Stream Processing
- 단순히 한 번에 한 레코드를 처리하고 변환하는 애플리케이션이 아니라면 상태는 꼭 필요하다
- 이벤트를 수신한 후 상태에서 데이터를 읽거나 상태에 데이터를 쓰는 연산을 수행한다
- 상태를 프로그램 변수, 로컬 파일, 데이터베이스와 같은 여러 저장소에 저장하고 접근할 수 있다
상태와 일관성 모델
- 거의 모든 계산에서 상태는 필수이다
- 이전 무한 데이터셋을 분석하던 시절에는 짧은 주기로 배치 잡을 반복해 처리했다
- 이때 다음 잡은 이전 잡에 접근할 수 없었고, 결과를 DB같은 외부 저장소에 위임하여 처리했다
- 대조적으로 스트림 잡에서는 모든 이벤트는 상태에 접근 가능하며, 상태를 프로그래밍 모델의 일급 시민으로 노출할 수 있다
Stream 실행 환경
- 모든 Flink 애플리케이션은 실행 환경이 필요하다
- StreamExecutiionEnvironment 를 사용해야 한다
- StreamExecutiionEnvironment 란?
- Apache Flink에서 스트리밍 응용 프로그램이 실행되는 환경을 나타내는 클래스
- 다음과 같은 환경 요소를 구성할 수 있다
- 병렬 처리 : 응용 프로그램의 병렬화 수준을 설정하여 각 연산자의 병렬 인스턴스 수를 결정할 수 있다
- 실행 설정 : 버퍼 시간 초과, 재시도 횟수, 스케줄링 전략 등 실행의 다양한 측면을 구성할 수 있다
- Data source : 환경에 kafka, 소켓 또는 파일과 같은 데이터 소스를 추가할 수 있다
- 체크포인트 : 응용프로그램에 대한 체크포인팅을 활성화하여 응용프로그램의 내결함성을 보장할 수 있습니다
- 데이터 스트림 생성
- StreamExecutiionEnvironment 을 생성했다면 이것을 통해 DataStream 을 생성할 수 있다
- 애플리케이션의 입력과 출력 스트림을 나타낸다
- 만든 DataStream을 통해 필터링, 매핑 및 축소와 같은 다양한 작업을 수행하여 입력 데이터를 변환하고 출력 데이터를 생성할 수 있다
- 마지막으로 execute 메서드를 사용하여 응용 프로그램을 실행할 수 있다
- task를 클러스터에 제출하고,
- 리소스를 사용할 수 있게 되면 응용 프로그램이 데이터 처리를 시작한다
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Transaction> transactions = env
.addSource(new TransactionSource())
.name("transactions");