이 페이지는 구조화된 스트리밍 API를 직접 사용하는 실시간 모드 쿼리 지원에 대해 설명합니다. 관리되는 파이프라인에 대해서는 Lakeflow 파이프라인의 실시간 모드를 참고하세요. 이 모드는 별도의 런타임, 소스, 싱크, 운영자 요구사항을 가지고 있습니다.
지원되는 언어
실시간 모드는 Scala, Java 및 Python 지원합니다.
컴퓨팅 형식
실시간 모드는 다음 컴퓨팅 유형을 지원합니다.
| 컴퓨팅 형식 | 지원됨 |
|---|---|
| 전용(이전: 단일 사용자) | ✓ |
| 표준(이전: 공유) | ✓ (Python만 해당) |
| 클래식의 Lakeflow 파이프라인 | 파이프라인 구성을 통한 지원 |
| 서버리스의 Lakeflow 파이프라인 | 파이프라인 구성을 통한 지원 |
| 서버리스 Notebook 및 작업 | 직접 구조화된 스트리밍 실시간 쿼리에 지원되지 않음 |
UDF를 사용하는 대기 시간에 민감한 워크로드의 경우 Databricks는 전용 액세스 모드를 사용하는 것이 좋습니다. Table 함수를 참조하세요.
실행 모드
실시간 모드는 업데이트 모드만 지원합니다.
| 실행 모드 | 지원됨 |
|---|---|
| 업데이트 모드 | ✓ |
| Append mode | 지원되지 않음 |
| 전체 모드 | 지원되지 않음 |
데이터 소스 및 데이터 싱크
실시간 모드는 다음 원본 및 싱크를 지원합니다.
| 출력 또는 입력 | 출처에 따라 | 싱크로 |
|---|---|---|
| Apache Kafka | ✓ | ✓ |
| Event Hubs(Kafka 커넥터 사용) | ✓ | ✓ |
| Kinesis | ✓ (EFO 모드 권장) | 지원되지 않음 |
| AWS MSK | ✓ | 지원되지 않음 |
| 델타 | 지원되지 않음 | 지원되지 않음 |
| Google Pub/Sub (Google의 메시징 서비스) | 지원되지 않음 | 지원되지 않음 |
| 아파치 펄서 | 지원되지 않음 | 지원되지 않음 |
임의 싱크(forEachWriter 사용) |
해당 없음 | ✓ |
운영자
실시간 모드는 대부분의 구조적 스트리밍 연산자를 지원합니다.
상태 비지정 작업
| Operator | 지원됨 |
|---|---|
| 선택 사항 | ✓ |
| Projection | ✓ |
mapPartitions |
지원되지 않음(제한 사항 참조) |
| Union | ✓ (몇 가지 제한 사항) |
UDFs
| Operator | 지원됨 |
|---|---|
| Scala 사용자 정의 함수 (UDF) | ✓ (몇 가지 제한 사항) |
| UDF Python | ✓ (몇 가지 제한 사항) |
Aggregation
| 기능 | 지원됨 |
|---|---|
| sum | ✓ |
| 개수 | ✓ |
| max | ✓ |
| min | ✓ |
| avg | ✓ |
| 집계 함수 | ✓ |
Windowing
| Operator | 지원됨 |
|---|---|
| Tumbling | ✓ |
| Sliding | ✓ |
| 세션 | 지원되지 않음 |
Deduplication
| Operator | 지원됨 |
|---|---|
| dropDuplicates (중복 제거) | ✓ |
| 워터마크 내 중복 제거 (dropDuplicatesWithinWatermark) | ✓ |
테이블로 스트림 조인
| Operator | 지원됨 |
|---|---|
| 내부 조인 | ✓ |
| 외부 조인 | ✓ |
| 브로드캐스트 테이블 조인(테이블 크기 10mb 이하) | ✓ |
| 테이블 조인(브로드캐스트 제외) | 지원되지 않음 |
스트림-스트림 조인
| Operator | 지원됨 |
|---|---|
| 내부 조인 | ✓ (Databricks Runtime 18 LTS 이상, 일부 구성 포함) |
| 외부 조인 | 지원되지 않음 |
메모
스트림을 사용하여 실시간 모드에서 조인을 스트리밍하려면 추가 Spark 구성을 설정해야 합니다. 구성 및 여러 스트림을 실행하기 위한 요구 사항에 대한 자세한 내용은 스트림을 참조하여 조인을 스트리밍합니다.
임의의 상태 저장 연산자
| Operator | 지원됨 |
|---|---|
| (플랫)MapGroupsWithState | 지원되지 않음 |
| transformWithState | ✓ (몇 가지 차이점) |
사용자 정의 싱크
| 싱크대 | 지원됨 |
|---|---|
| forEach | ✓ |
| forEachBatch | 지원되지 않음 |
특별 고려 사항
일부 연산자와 기능은 실시간 모드에서 사용할 때 특정 고려 사항 또는 차이점이 있습니다.
transformWithState 실시간 모드
사용자 지정 상태 저장 애플리케이션을 빌드하기 위해 Databricks는 Apache Spark 구조적 스트리밍의 API를 지원합니다 transformWithState. API와 코드 스니펫에 대한 자세한 내용은 'Build a custom stateful application' transformWithState 을 참고하세요.
그러나 API는 마이크로 일괄 처리 쿼리와 실시간 모드에서 다르게 동작합니다.
- 실시간 모드는 각 행에
handleInputRows(key: String, inputRows: Iterator[T], timerValues: TimerValues)대한 메서드를 호출합니다.-
inputRows반복기는 단일 값을 반환합니다. 마이크로 일괄 처리 모드는 각 키에 대해 한 번 호출하고inputRows반복기는 마이크로 일괄 처리에서 키에 대한 모든 값을 반환합니다. - 코드를 작성할 때의 이러한 차이점에 대한 계정
-
- 이벤트 타이머는 실시간 모드에서 지원되지 않습니다.
-
transformWithStateInPandas는 실시간 모드에서 지원되지 않습니다. 대신 pandas DataFrames 대신 개체를 사용하는 행 기반transformWithStateAPI를 사용합니다Row. - 실시간 모드에서 타이머는 데이터 도착에 따라 실행이 지연됩니다.
- 타이머가 10:00:00으로 예약되었지만 데이터가 도착하지 않으면 타이머가 즉시 실행되지 않습니다.
- 데이터가 10:00:10에 도착하면 타이머는 10초 지연 후 작동합니다.
- 데이터가 도착하지 않고 장기 실행 일괄 처리가 종료되면 일괄 처리가 종료되기 전에 타이머가 작동합니다.
메모
Databricks Runtime 18.1 이하에서 처리량이 낮고 초당 레코드가 5개 미만인 Python transformWithState 및 실시간 모드를 사용하는 경우 최대 수백 밀리초의 대기 시간이 증가할 수 있습니다. Databricks는 해결하려면 Databricks Runtime 18.2 이상으로 업그레이드하는 것이 좋습니다.
Python UDF를 실시간 모드로
Databricks는 대부분의 Python UDF(사용자 정의 함수)를 실시간 모드로 지원합니다.
상태 비저장
| UDF 유형 | 지원됨 |
|---|---|
| Python 스칼라 UDF(Python 스칼라 UDF(사용자 정의 함수)) | ✓ |
| 화살표 스칼라 UDF | ✓ |
| Pandas 스칼라 UDF(pandas 사용자 정의 함수) | ✓ |
화살표 함수(mapInArrow) |
✓ |
| Pandas 함수(Map) | ✓ |
상태 저장 그룹화(UDAF)
| UDF 유형 | 지원됨 |
|---|---|
transformWithState (인터페이스만 Row 해당) |
✓ |
transformWithStateInPandas |
지원되지 않습니다. 대신 pandas DataFrames 대신 개체를 사용하는 행 기반 transformWithState API를 사용합니다 Row . 자세한 내용은 지원되지 않음을 참조하세요transformWithStateInPandas. |
applyInPandasWithState |
지원되지 않음 |
상태를 저장하지 않는 그룹화 (UDAF)
| UDF 유형 | 지원됨 |
|---|---|
apply |
지원되지 않음 |
applyInArrow |
지원되지 않음 |
applyInPandas |
지원되지 않음 |
테이블 함수
| UDF 유형 | 지원됨 |
|---|---|
| UDTF(Python UDF(사용자 정의 테이블 함수)) | 지원되지 않음 |
| UC UDF | 지원되지 않음 |
실시간 모드에서 Python UDF를 사용할 때 고려해야 할 몇 가지 사항이 있습니다.
- 대기 시간을 최소화하려면 화살표 일괄 처리 크기(
spark.sql.execution.arrow.maxRecordsPerBatch)를 1로 설정합니다.- 절충: 이 구성은 처리량을 희생하면서 대기 시간을 최적화합니다. 대부분의 워크로드에서는 이 설정을 사용하는 것이 좋습니다.
- 입력 볼륨을 수용하기 위해 더 높은 처리량이 필요한 경우에만 일괄 처리 크기를 늘리십시오. 이로 인해 대기 시간이 증가할 가능성을 받아들일 수 있습니다.
- Pandas UDF 및 함수는 화살표 일괄 처리 크기가 1인 경우 성능이 좋지 않습니다.
- pandas UDF 또는 함수를 사용하는 경우 화살표 일괄 처리 크기를 더 높은 값(예: 100 이상)으로 설정합니다.
- 이는 대기 시간이 더 높다는 것을 의미합니다. Databricks는 가능한 경우 화살표 UDF 또는 함수를 사용하는 것이 좋습니다.
-
transformWithStateInPandas는 실시간 모드에서 지원되지 않습니다. 대신 pandas DataFrames 대신 개체를 사용하는 행 기반transformWithStateAPI를 사용합니다Row. 행 기반 API를 사용하는 작업 Python 예제는transformWithStateInPandas지원되지 않음 및 리알타임 모드 예제를 참조하세요. - UDF를 사용하는 대기 시간에 민감한 워크로드의 경우 Databricks는 전용 액세스 모드를 사용하는 것이 좋습니다. 표준 액세스 모드에서는 보안 격리 오버헤드로 인해 UDF 성능이 저하될 수 있습니다.