Apache Flink는 분산 데이터 스트림 처리와 일괄 데이터 처리를 위한 오픈 소스 컴퓨팅 플랫폼으로, 동일한 Flink 런타임을 기반으로 스트림 처리와 일괄 처리라는 두 가지 유형의 애플리케이션을 지원하는 기능을 제공할 수 있습니다.
기존 오픈 소스 컴퓨팅 솔루션은 스트림 처리와 일괄 처리를 서로 다른 두 가지 애플리케이션 유형으로 간주합니다. 왜냐하면 이들이 제공하는 SLA(서비스 수준 합의)가 완전히 다르기 때문입니다. 스트림 처리 일반적으로 대기 시간이 짧고 정확히 한 번만 수행됩니다. 보장이 지원되어야 하며 일괄 처리는 높은 처리량과 효율적인 처리를 지원해야 합니다.
Flink는 스트림 처리와 일괄 처리를 다른 관점에서 살펴보고 두 가지를 통합합니다. Flink는 스트림 처리를 완벽하게 지원합니다. 즉, 스트림 처리로 볼 때 입력 데이터 스트림이 제한되지 않음을 의미합니다. 일종의 스트림 처리에서는 입력 데이터 스트림만 제한된 것으로 정의됩니다.
Flink 스트림 처리 기능:
Flink는 소프트웨어 스택을 계층적 시스템 형태로 조립합니다. 스택의 다양한 레이어는 하위 레이어를 기반으로 구축되며, 각 레이어는 프로그램 형태의 다양한 계층의 추상화를 허용합니다.
1. 스트림, 변환, 연산자
Flink 프로그램은 스트림과 변환이라는 두 가지 기본 구성 요소로 구성됩니다. 스트림은 중간 결과 데이터이고 변환은 작업입니다. 하나 이상의 입력 스트림에 대해 계산을 수행하고 하나 이상의 결과 스트림을 출력합니다.
Flink 프로그램이 실행되면 Streaming Dataflow에 매핑됩니다. 스트리밍 데이터 흐름은 일련의 스트림 및 변환 연산자로 구성됩니다. 이는 DAG 그래프와 유사하며 하나 이상의 소스 연산자에서 시작되고 시작될 때 하나 이상의 싱크 연산자로 끝납니다.
2. 병렬 데이터 흐름
스트림은 여러 스트림 파티션으로 나눌 수 있고, 연산자는 여러 연산자 하위 작업으로 나눌 수 있으며, 각 연산자 하위 작업은 스레드에서 독립적으로 실행됩니다. . 연산자의 병렬성은 연산자 하위 작업의 수와 동일합니다. 스트림의 병렬성은 항상 이를 생성한 연산자의 병렬성과 같습니다.
일대일 모드
예를 들어 Source[1]부터 map()[1]까지 Source의 파티셔닝 특성(Partitioning)과 처리를 유지한다. 즉, map()[1]의 하위 작업에 표시된 데이터 스트림의 레코드 순서는 Source[1]에 표시된 레코드 순서와 일치합니다.
재배포 모드
이 모드는 map()[1], map()[2]에서 keyBy()/window(와 같이 입력 데이터 스트림의 분할을 변경합니다. ) /apply()[1], keyBy()/window()/apply()[2], 업스트림 하위 작업은 데이터를 여러 개의 다른 다운스트림 하위 작업으로 전송하여 실제 애플리케이션과 다른 데이터 흐름의 분할을 변경합니다. 선택 연산자가 관련되어 있습니다.
3. 작업 및 연산자 체인
Flink 분산 실행 환경에서는 여러 연산자 하위 작업이 서로 연결되어 실제로 실행 체인인 연산자 체인을 형성합니다. TaskManager의 별도 스레드에서 실행됩니다.
4. 시간
스트림에서 레코드를 처리할 때 레코드에는 일반적으로 다양한 일반적인 시간 필드가 포함됩니다.
이벤트 시간: 이벤트 생성 시간을 나타냅니다.
p>
수집 시간: 이벤트가 Flink 데이터 흐름에 들어가는 시간을 나타냅니다.
처리 시간: 운영자가 이벤트를 처리하는 로컬 시스템 시간을 나타냅니다.
Flink는 WaterMark A 측정값을 사용합니다. 시간이 지나면 WaterMark는 타임스탬프 t를 전달하고 스트림에 삽입됩니다.
5. 창
Flink는 시간 창 작업 및 데이터 기반 창 작업을 지원합니다.
창 분류:
텀블링/슬라이딩 시간 창
// (sensorId, carCnt)의 스트림
val vehicleCnts: DataStream[(Int, Int)] = ...
val tumblingCnts: DataStream [(Int, Int)] = vehicleCnts
// sensorId에 의한 키 스트림
.keyBy(0)
// 1분 길이의 텀블링 시간 창
.timeWindow(Time. Minutes(1))
// carCnt에 대한 합계 계산
.sum(1)
< p> val SlidingCnts: DataStream[(Int, Int)] = vehicleCnts.keyBy(0)
// 길이가 1분이고 트리거 간격이 30초인 슬라이딩 시간 창
< p> .keyBy(0)p>
.timeWindow(Time.분(1), Time.seconds(30))
.sum(1)
p>텀블링/슬라이딩 카운트 창
// Stream of (sensorId, carCnt)
val vehicleCnts: DataStream[(Int, Int)] = ... p>
val tumblingCnts: DataStream[(Int, Int) )] = vehicleCnts
// 센서 ID별 키 스트림
.keyBy(0)
// 100개 요소 크기의 텀블링 카운트 윈도우
< p> .countWindow(100)// carCnt 합계 계산
.sum(1)
val SlidingCnts: DataStream[(Int, Int)] = vehicleCnts
.keyBy(0)
// 100개 요소 크기의 슬라이딩 카운트 창 및 10개 요소 트리거 간격
.countWindow(100, 10) < /p>
.sum(1)
사용자 정의 창
기본 작업:
< p> 6. 내결함성장벽 메커니즘:
정렬:
운영자가 여러 입력 데이터 스트림을 수신하면 스냅샷 장벽에서 데이터 스트림을 정렬해야 합니다.
스트림 정렬 작업을 기반으로 정확히 한 번 의미론을 달성할 수 있지만 이는 또한 장벽을 정렬하기 위해 스트림 레코드의 일부가 일시적으로 버퍼에 캐시되기 때문에 스트림 처리 애플리케이션에 지연을 가져옵니다. 이는 특히 데이터 흐름 병렬성이 높은 시나리오에서 더 분명할 수 있습니다. 최신 Barrier가 정렬됩니다. Stream은 Buffer에 캐시된 레코드가 처리되는 시점입니다. Flink에서는 Stream Aligning 사용 여부를 선택할 수 있는 스위치가 제공됩니다. 꺼져 있으면 Exactly Once가 적어도 한 번이 됩니다.
체크포인트:
스냅샷은 데이터 흐름에 대한 단순한 상태 체크포인트가 아니라 Operator 내부에 있는 상태도 포함하므로 다음과 같은 경우 데이터 스트림 처리를 올바르게 재개할 수 있습니다. 스트림 처리 시스템이 실패합니다. 두 가지 상태가 있습니다:
7. Scheduling
JobManager 측에서는 클라이언트가 제출한 JobGraph 형식의 Flink Job이 수신됩니다. JobGraph를 ExecutionGraph로 변환합니다. ExecutionGraph 이는 TaskManager에서 실행되도록 작업을 예약하는 실제 JobManager의 논리적 보기인 JobGraph의 병렬 표현입니다.
리소스 할당 및 사용에 따른 물리적 스케줄링의 예:
8. 반복
기계 학습 및 그래프 컴퓨팅 애플리케이션 모두 계산을 위해 반복을 사용합니다. 반복 연산자에 Step 함수를 정의하여 반복 알고리즘을 구현합니다. 이 반복 알고리즘에는 Iterate와 Delta Iterate의 두 가지 유형이 있습니다.
반복
반복 연산자는 간단한 반복 형태입니다. 각 반복에 대해 Step 함수에 대한 입력은 전체 입력 데이터 세트이거나 이전 반복의 결과입니다. 이번 반복을 통해 다음 계산(Next Partial Solution이라고도 함)에 필요한 입력이 계산되고, 반복 종료 조건이 충족되면 최종 반복 결과가 출력됩니다.
의사코드 처리:
IterationState state = getInitialState()
while (!terminationCriterion()) {
state = step ( state);
}
setFinalState(state);
Delta Iterate
Delta Iterate 연산자는 증분 반복을 구현합니다.
의사 코드 처리:
IterationState 작업 세트 = getInitialState();
IterationState 솔루션 = getInitialSolution()
while (!terminationCriterion( )) {
(델타, 작업 세트) = step(작업 세트, 솔루션)
솔루션.업데이트(델타)
}
setFinalState(solution);
최소값 전파:
9. 배압 모니터링
스트림 처리 시스템에서 다운스트림 운영자가 따라잡을 수 없는 경우 처리 속도 이 경우 다운스트림 Operator가 자신의 처리 상태를 업스트림 Operator에 전파할 수 있다면 업스트림 Operator의 처리 속도를 늦추면 기존 스트림 처리 시스템 문제를 알람을 통해 알리는 등의 문제가 완화됩니다.
Flink 웹 인터페이스는 실행 중인 작업의 스택 추적을 샘플링하기 위해 샘플링 스레드를 사용하여 구현되는 실행 중인 작업의 BackPressure 동작에 대한 모니터링을 제공합니다.
기본적으로 JobManager는 50ms마다 작업의 각 태스크에 대해 100개의 스택 추적 호출을 트리거합니다. 비율은 계산을 통해 얻어집니다(예: radio=0.01, 즉 100개의 스택 추적 호출만 수행됨을 의미). 100번의 메소드 호출 차단. Flink는 현재 다음과 같은 배압 상태를 정의합니다.
OK: 0 lt; Ratio lt = 0.10
LOW: 0.10 Ratio lt; HIGH: 0.5 lt; 비율 lt; 1
1. 테이블
Flink의 테이블 API는 SQL과 유사한 방법을 사용하여 스트림 및 일괄 처리를 구현합니다.
자세한 내용은 https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/table_api.html을 참조하세요.
2. CEP
Flink의 CEP(복합 이벤트 처리)는 스트림에서 복잡한 이벤트 패턴 발견을 지원하고 사용자가 관심 있는 데이터를 빠르게 필터링합니다.
자세한 내용은 https://ci.apache.org/projects/flink/flink-docs-release-1.2/concepts/programming-model.html#next-steps를 참조하세요.
3. Gelly
Gelly는 Flink에서 제공하는 그래프 컴퓨팅 API로, 그래프 컴퓨팅 분석 애플리케이션의 개발 및 구축을 단순화하는 인터페이스를 제공합니다.
자세한 내용은 https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/libs/gelly/index.html을 참조하세요.
4. FlinkML
FlinkML은 Flink에서 제공하는 기계 학습 라이브러리로, 기계 학습 시스템 개발을 단순화하기 위한 확장 가능한 기계 학습 알고리즘, 간단한 API 및 도구를 제공합니다.
자세한 내용은 https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/libs/ml/index.html을 참조하세요.
< p> 내일 업데이트 예정입니다. 배포 및 테스트이 글은 제 개인적인 견해일 뿐입니다. 설명이 좋지 않은 경우 지도와 수정을 해주시면 감사하겠습니다.