기능 뷰 구체화

Unity 카탈로그에 저장된 기능 보기 정의를 만든 후에는 기능 정의를 사용하여 원본 테이블에서 기능 데이터를 생성할 수 있습니다. 이 프로세스를 기능 구체화라고 합니다. Azure Databricks 모델 학습 및 일괄 처리 채점 또는 온라인 서비스를 위해 Unity 카탈로그의 테이블을 채우는 Lakeflow 파이프라인을 만들고 관리합니다.

기능 보기를 제공하는 방법에 대한 자세한 내용은 기능 보기 제공을 참조하세요.

과거 소스 데이터를 수정하거나 추가한 후 물질화된 값을 재계산하려면 Backfill Feature Views를 참조하세요.

선택된 엔티티의 구체화된 값을 제거하려면 엔티티의 특성 값 제거를 참조하세요.

요구 사항

  • 기능을 기능 보기로 만들고 Unity 카탈로그에 저장해야 합니다.
  • 버전 요구사항에 대해서는 요구사항을 참조하세요.

기능 유형별 머티리얼라이제이션 지원

특징이 구현될 수 있는지, 그리고 어디에 존재할지에 따라 유형이 달라집니다:

온라인 스토어에만 구현되는 기능도 오프라인에서도 사용할 수 있으며, create_training_setcompute_features 시점 값을 소스에서 직접 계산하므로 오프라인 구현이 필요하지 않습니다.

ColumnSelection 구체화

ColumnSelection 에서는 집계 없이 엔터티 키당 단일 열의 최신 값을 선택합니다. 온라인 스토어에서만 실현될 수 있습니다. 오프라인 사용 사례(학습 및 일괄 처리 유추) ColumnSelection 의 경우 기능은 쿼리 시 원본 데이터에서 직접 페치되므로 오프라인 구체화가 필요하지 않습니다.

구체화 행위

  • 파이프라인은 집계 창 없이 엔터티 키당 가장 최근 행을 온라인 테이블에 씁니다.
  • 온라인 실체화는 온라인 테이블을 엔터티 키당 현재의 최신 값으로 채웁니다.

예시

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    DeltaTableSource, Feature, ColumnSelection, TableTrigger, OnlineStoreConfig,
)

fe = FeatureEngineeringClient()

delta_source = DeltaTableSource(
    catalog_name="catalog",
    schema_name="schema",
    table_name="transactions",
)

amount_feature = Feature(
    source=delta_source,
    function=ColumnSelection("amount"),
    entity=["user_id"],
    timeseries_column="transaction_time",
    name="latest_transaction_amount",
)

# Register before materializing
amount_feature = fe.register_feature(
    feature=amount_feature,
    catalog_name="catalog",
    schema_name="schema",
)

mfs = fe.materialize_features(
    features=[amount_feature],
    online_config=OnlineStoreConfig(
        catalog_name="catalog",
        schema_name="feats_online",
        table_name_prefix="txn_",
        online_store_name="lb_usw2"
    ),
    trigger=TableTrigger(),
)

ColumnSelection 기능은 TableTrigger을 사용하여 원본 델타 테이블이 새 커밋을 받을 때마다 파이프라인을 실행합니다. 오프라인 사용 사례(학습 및 일괄 처리 유추)에 대한 기능을 원본에서 직접 읽기 때문에 offline_config 필요하지 않습니다ColumnSelection.

메모

RequestSource 기능은 유추 시간에 호출자가 제공한 데이터를 나타내거나 학습 시 레이블이 지정된 DataFrame에서 추출되므로 구체화할 수 없습니다. 읽을 원본 테이블이 없습니다. 값은 요청 페이로드 또는 학습 DataFrame에만 존재합니다.

신선도 제한 최신 값 구체화

Last이 있는 배치 RollingWindow 집계는 온라인 피처에 TTL(수명 시간)을 부여합니다. 즉, 윈도우 범위 내에 들어오는 소스 값이 없으면 해당 값은 온라인 스토어에서 만료됩니다. 이는 값의 경과 시간이 해당 값을 안전하게 제공할 수 있는지를 결정할 때 유용합니다. 예를 들어, 지난 한 시간 동안의 장치 상태는 서비스될 수 있지만, 이전 상태는 무한히 사용 가능한 상태가 아닌 null로 해결됩니다.

A RollingWindow 는 기능의 TTL과 유사한 동작을 부여하는 명시적 지속 시간을 정의합니다. 예를 들어, 소스가 매일 값을 공개하는데 최근 7일 값만 남기고 싶다면 7일 기간의 a RollingWindow 를 사용하세요. 트리거가 실행될 때마다 머티리얼라이제이션은 온라인 테이블을 전체 교체하므로, 윈도우 범위를 벗어난 값은 예측 가능한 일정에 따라 제거됩니다. 이 방법은 , 를 사용하는 RollingWindow스트리밍 Last 과 동일한 결과를 얻지만, 연속적으로 계산을 실행하지 않기 때문에 비용이 적게 듭니다.

이 퍼블리싱 패턴은 스냅샷 모드로 TTL이 퍼블리싱되는 특징 테이블과 유사합니다. 기능 테이블 세트를 유지하고 다른 기능 뷰와 함께 사용하고 싶다면, 이를 기능 뷰 저작 프레임워크에 맞게 조정할 수 있습니다. TableTrigger 및 Last가 있는 배치 RollingWindow를 사용하세요.

이 조합은 다음과 같은 조건을 가진 특별한 온라인 전용 물질화 모드를 가지고 있습니다:

  • 소스는 DeltaTableSource여야 합니다.
  • 집계 함수는 반드시 Last여야 하며, 해당 윈도는 반드시 RollingWindow여야 합니다.
  • 구체화는 OfflineStoreConfig을 제공하고, OnlineStoreConfig은 생략하며, TableTrigger를 사용해야 합니다.

다음 예 latest_device_state_1h 시에서는 이러한 요건을 충족하는 등록된 특징입니다:

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import OnlineStoreConfig, TableTrigger

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=[latest_device_state_1h],
    online_config=OnlineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="latest_device_state_serving",
        online_store_name="device_state_store",
    ),
    trigger=TableTrigger(),
)

오프라인 학습 및 배치 점수 산출을 위해 특징 엔지니어링 클라이언트는 소스에서 직접 시점 값을 계산합니다. 이 기능은 오프라인 머티리얼리제이션을 읽지 않습니다.

고려 사항

  • 만료는 트리거가 있을 때만 진행됩니다. 소스 테이블 커밋이 머티리얼라이제이션 새로 고침을 트리거하면 온라인 값과 그 만료 시점이 앞당겨집니다. 시간이 흐른다고 해서 새로고침이 일어나지 않습니다. 소스가 게시를 중단하면, 마지막으로 물질화된 값은 이후 커밋이 새로고침을 트리거할 때까지 온라인 스토어에 남아 있습니다.
  • 타임시리즈 열을 원본 게시 시간에 맞추세요. 시계열 열은 출처가 데이터를 공개한 시점을 반영해야 합니다. 그렇지 않으면 온라인 스토어는 트리거 시점에 조인되고 오프라인 조회는 시계열 시점에 조인되므로 온라인 값과 오프라인 값이 서로 달라집니다.
  • 창 시간을 게시 주기의 배수로 설정하세요. RollingWindow 지속 시간이 소스 출판 주기의 배수가 아니라면, 일부 값은 오프라인 훈련 중 만료된 것으로 간주되지만 온라인에서는 여전히 표시됩니다.

주문형 기능과 물질화

RequestSource 값은 학습 데이터프레임이나 추론 요청에서 나오므로, 소스 테이블을 구현할 수 없습니다. FeatureViewSource 피처는 학습 또는 서빙 시 업스트림 피처 값에 CustomUDF를 적용합니다. 이들은 미리 계산된 결과를 저장하지 않습니다. Delta 테이블을 기반으로 하는 CustomUDF 기능의 경우 구체화도 지원되지 않습니다.

margin 및 revenue_sum_7d가 cost_sum_7d 기능에 입력으로 제공되는 종속성 그래프의 경우:

  • 오프라인 교육의 경우 margin번으로 create_training_set에 전화하세요. 상류 특징을 해석하고 시점 값을 계산하며, 가능한 경우 호환되는 오프라인 물질화를 사용합니다.
  • 온라인 서비스의 경우, 지원되는 수익 및 비용 기능을 온라인 스토어에 적용하세요. 엔드포인트는 각 요청을 조회하고 계산합니다 margin .
  • 지원되는 업스트림 기능만 materialize_features에 전달하고, margin 또는 요청 기반 기능은 전달하지 마세요. 물질화는 파생 특징의 의존성을 재귀적으로 물질화하지 않습니다.

요청 지원 기능만을 사용하는 그래프는 온라인 스토어가 필요하지 않습니다. FeatureViewSource 기능으로 학습하기 및 파생 특성 제공하기를 참조하세요.

Permissions

물질화는 특징과 소스 및 목적지 자원에 대한 권한이 필요합니다. Unity 카탈로그 권한 설명은 Unity 카탈로그 권한 참고 문서를 참조하세요.

  • 기능을 구현하려면 MANAGE이 필요합니다. materialize_features를 호출하면 기반 Lakeflow 파이프라인과 Unity Catalog 테이블을 생성하고 관리하게 되므로 관리 작업입니다. 실체화되는 기능 정의를 읽으려면 해당 기능에 MANAGE이(가) 설정되어 있어야 하며, READ FEATURE도 함께 있어야 합니다.

  • 물질화된 특징을 삭제하는 것은 그 기능의 창조자에게만 제한됩니다. 구체화된 기능을 만든 사용자만 delete_materialized_feature로 이를 삭제할 수 있습니다. 이 제한은 Unity 카탈로그 권한과는 무관합니다: MANAGE 기능이나 그 상위 스키마에서는 다른 사용자가 삭제할 수 없습니다.

  • 소스 데이터를 읽으려면 가 필요합니다 SELECT. Delta 테이블 소스를 사용하는 기능의 경우, 소스 테이블에 SELECT이(가) 있어야 합니다. Stream 소스를 사용하는 기능의 경우, Stream의 수집 테이블에 SELECT이 있어야 합니다.

    스트림 인증 설정에서 요구되는 기타 권한에 대해서는 Kafka 인증을 참조하세요.

  • 목적지 테이블을 생성하려면 가 필요합니다 CREATE TABLE. OnlineStoreConfig 또는 CREATE TABLE로 지정된 모든 스키마에 OfflineStoreConfig가 있어야 합니다. 오프라인과 온라인 목적지는 서로 다른 스키마나 카탈로그에 있을 수 있으며, 물질화는 각 목적지에 대한 권한이 필요합니다.

  • 온라인 스토어에 반영하려면 CAN USE가 필요합니다. CAN USE 온라인 스토어에서 사용하는 Lakebase 인스턴스나 프로젝트에 있어야 합니다. Lakebase 권한에 대한 정보는 프로젝트 권한 부여를 참조하세요.

  • 구체화된 기능을 나열하려면 상위 기능에 READ FEATURE가 필요합니다. list_materialized_features를 사용하려면 구체화된 기능에 READ FEATURE가 있어야 합니다.

  • 구체화된 데이터를 읽으려면 SELECT이 필요합니다. 액세스하는 각 오프라인 또는 온라인 출력 테이블에는 SELECT가 있어야 합니다. READ FEATURE 부모 기능에서는 이 테이블들에 대한 접근 권한을 부여하지 않습니다.

구체화에 사용되는 각 Unity Catalog 리소스에 대해 해당 상위 카탈로그에는 USE SCHEMA 권한이, 해당 상위 스키마에는 USE CATALOG 권한이 추가로 필요합니다. 이 요구사항은 기능, 각 소스 또는 스트림 인제스팅 테이블, 그리고 각 설정된 목적지에 적용됩니다. READ FEATURE 및 MANAGE에 스키마 또는 카탈로그에 대해 부여된 권한은 여기에 포함된 현재 및 향후의 모든 기능에 적용됩니다.

API 데이터 구조

OfflineStoreConfig

구체화된 기능이 기록될 오프라인 저장소에 대한 구성입니다. materialize_features 호출되면 기능 저장소 백 엔드는 이 접두사를 사용하여 테이블을 만듭니다. 각 파이프라인 실행은 구체화 일정에 따라 최신 기능 값을 테이블에 구체화합니다.

OfflineStoreConfig(
    catalog_name: str,        # Catalog name for the offline table where materialized features will be stored
    schema_name: str,         # Schema name for the offline table
    table_name_prefix: str    # Table name prefix for the offline table. The pipeline may create multiple tables with this prefix, each updated at different cadences
)
from databricks.feature_engineering.entities import OfflineStoreConfig

offline_store = OfflineStoreConfig(
    catalog_name="main",
    schema_name="feature_store",
    table_name_prefix="customer_features"
)

OnlineStoreConfig

모델 서비스에서 사용하는 기능을 저장하는 온라인 스토어에 대한 구성입니다. 구체화는 델타 테이블을 catalog.schema.table_name_prefix로 만들고 동일한 이름으로 온라인 Feature Store로 테이블을 스트리밍합니다.

from databricks.feature_engineering.entities import OnlineStoreConfig

online_store = OnlineStoreConfig(
    catalog_name="main",
    schema_name="feature_store",
    table_name_prefix="customer_features_serving",
    online_store_name="customer_features_store"
)

MaterializedFeature

Unity Catalog에서 미리 계산된 표현이 제공되는, 즉 머티리얼라이즈된 피처 뷰를 나타냅니다. 오프라인 테이블과 온라인 테이블에는 별도의 구체화된 기능이 있습니다. 보통 MaterializedFeature를 직접 인스턴스화하지 않습니다.

latest_backfill_operation 필드는 구체화된 피처의 가장 최근 백필 이름을 보유합니다. 백필 피처 뷰를 참조하세요.

API 함수 호출

materialize_features()

기능 보기 목록을 오프라인 델타 테이블 또는 온라인 기능 저장소로 구체화합니다. 이 함수(예: 사용 create_feature 또는 register_feature)를 호출하기 전에 기능을 Unity 카탈로그에 등록해야 합니다. 등록되지 않은 로컬로 생성된 기능은 작동하지 않습니다.

FeatureEngineeringClient.materialize_features(
    *,                                                                     # Arguments are keyword-only
    features: List[Feature],                                               # List of Feature Views to materialize
    offline_config: Optional[OfflineStoreConfig] = None,                   # Offline store config (aggregation features only)
    online_config: Optional[OnlineStoreConfig] = None,                     # Online store config
    trigger: Union[CronSchedule, TableTrigger, StreamingMode],             # Materialization trigger
    tags: Optional[Dict[str, str]] = None,                                 # Custom tags for cost attribution
    budget_policy_id: Optional[str] = None,                                # Serverless usage policy for cost attribution
) -> List[MaterializedFeature]:

이 메서드는 기능 값이 업데이트되는 시기와 기능이 구체화되는 Unity 카탈로그 테이블에 대한 메타데이터를 포함하는 구체화된 기능 목록을 반환합니다.

둘 다 OnlineStoreConfigOfflineStoreConfig 제공된 경우 제공된 기능당 두 개의 구체화된 기능이 반환되며, 각 저장소 유형에 대해 하나씩 반환됩니다.

매개 변수는 trigger 구체화 파이프라인이 실행되는 시기를 제어합니다.

  • CronSchedule: 기능 타이밍에서 파생된 일정이나 발신자가 제공하는 Quartz cron 일정에 따라 진행됩니다. 배치 집계 기능이 지원됩니다(AggregationFunction부터 DeltaTableSource).
  • TableTrigger: 업스트림 델타 테이블이 커밋을 받을 때 실행됩니다. DeltaTableSource에 의해 지원되는 ColumnSelection 기능 및 집계 기능(AggregationFunction)에 대해 지원됩니다. 집계 기능의 경우, 파이프라인은 기능 세분도의 절반(슬라이딩 윈도의 슬라이드 지속 시간, 텀블링 윈도의 윈도우 길이)마다 최대 한 번만 실행되도록 제한되며, 최대 1시간으로 제한되고 5분 간격을 넘지 않습니다. 예를 들어, 세분성이 1시간인 경우에는 최대 30분에 한 번, 세분성이 2시간 이상인 경우에는 최대 한 시간에 한 번입니다. 이 간격은 이전 실행에서 측정한 것이므로, 시간이 지난 후에 도착한 커밋은 여전히 즉시 실행을 트리거합니다.
  • StreamingMode: 연속 스트리밍 파이프라인으로 실행됩니다. StreamSource에서 지원되는 기능에 필요합니다.

단일 materialize_features 호출에서 다른 트리거 형식이 필요한 기능을 혼합할 수 없습니다. 대신 별도의 호출을 실행합니다.

머티리얼라이제이션 비용을 귀속하려면 tags, budget_policy_id 또는 둘 다를 전달하세요. Azure Databricks는 자신이 생성하는 작업 또는 파이프라인에 이를 적용하므로, 해당 사용 비용은 청구 대상 사용량 시스템 테이블에 고객의 귀속 정보와 함께 반영됩니다. 둘 다 창조 시점에 적용되기 때문에, 기존 물질화를 다르게 귀속시키는 것은 새로운 물질화를 창조하는 것을 의미합니다. budget_policy_id 서버리스 사용 정책의 ID를 가져갑니다. 하나를 만들고 ID를 얻으려면 서버 없는 사용 정책 만들기를 참조하세요. 태그 한도, 각 값이 도달하는 자원, 그리고 속성 지출을 조회하는 방법은 Feature Store 비용 관리를 참조하세요.

오프라인 저장소로 구체화

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    CronSchedule, OfflineStoreConfig,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=features,
    offline_config=OfflineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features"
    ),
    trigger=CronSchedule(
        quartz_cron_expression="0 0 * * * ?",  # Hourly
        timezone_id="UTC",
    ),
)

온라인 스토어로 구체화

메모

대부분의 집계 기능을 온라인 스토어에 구현하려면 오프라인 스토어에도 구현해야 합니다. offline_config와 online_config 모두 필수입니다. online_store_name 기존 온라인 기능 저장소를 참조해야 합니다. 만들기에 대한 지침은 Databricks Online 기능 저장소를 참조하세요.

ColumnSelection 기능에는 OfflineStoreConfig가 필요하지 않습니다. ColumnSelection 구체화를 참조하세요.

RollingWindow 특수 사례가 포함된 배치 Last도 온라인 전용입니다. Materialize 최신성 제한 최신값을(를) 참조하세요.

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    CronSchedule, OfflineStoreConfig, OnlineStoreConfig,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=features,
    offline_config=OfflineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features"
    ),
    online_config=OnlineStoreConfig(
        catalog_name="main",
        schema_name="feature_store",
        table_name_prefix="customer_features_serving",
        online_store_name="customer_features_store"
    ),
    trigger=CronSchedule(
        quartz_cron_expression="0 0 * * * ?",  # Hourly
        timezone_id="UTC",
    ),
)

스트리밍 기능 구체화

스트리밍 기능은 온라인 스토어로만 구체화할 수 있습니다. offline_config 매개 변수는 지원되지 않습니다. 스트리밍 기능에는 초 미만의 새로 고침을 보장하기 위해 실시간 파이프라인이 필요하기 때문에 오프라인 구체화는 지원되지 않습니다. 오프라인 학습 또는 평가의 경우 기능 엔지니어링 클라이언트는 평가된 각 데이터 요소에 따라 기능 값을 다시 계산합니다.

스트리밍 기능은 동일한 materialize_features 호출에서 일괄 처리 기능과 혼합할 수 없습니다.

from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
    OnlineStoreConfig, StreamingMode,
)

fe = FeatureEngineeringClient()

materialized = fe.materialize_features(
    features=[streaming_feature],
    online_config=OnlineStoreConfig(
        catalog_name="my_catalog",
        schema_name="my_schema",
        table_name_prefix="streaming_features_serving",
        online_store_name="feature_store_online"
    ),
    trigger=StreamingMode(),
)

list_materialized_features()

전체 이름으로 식별되는 단일 기능의 구체화를 반환합니다. feature_name 가 필요하며 키워드 전용입니다. 여러 기능의 구체화를 검토하려면 먼저 카탈로그 또는 스키마의 기능을 나열한 다음 반환된 각 기능을 호출 list_materialized_features 합니다.

기본적으로 최대 100개의 구체화가 반환됩니다. 매개 변수를 사용하여 max_results 이 제한을 변경할 수 있습니다.

FeatureEngineeringClient.list_materialized_features(
    *,                                      # Arguments are keyword-only
    feature_name: str,                      # Required: full name of the feature whose materializations to list
    max_results: int = 100,                 # Maximum number of materializations to return
) -> List[MaterializedFeature]:

delete_materialized_feature()

구체화된 기능을 삭제하기 전에 해당 기능을 참조하는 모델 또는 기능 사양을 제거하거나 업데이트합니다.

구체화된 기능을 삭제합니다. 전달할 기능은 기능 유형에 따라 달라집니다.

  • 집계 기능: 오프라인 구체화된 기능을 전달합니다. 동일한 기능에 대해 구체화된 온라인 기능이 있는 경우 둘 다 삭제됩니다. RollingWindow가 있는 온라인 전용 배치 Last 특성의 경우 온라인으로 구체화된 특성을 전달하세요.
  • ColumnSelection 기능: 온라인 실현된 기능을 전달합니다. ColumnSelection 기능은 온라인 스토어에만 구현되므로 (ColumnSelection 구현 참조) 쌍을 이루는 오프라인 기능은 없습니다.

구체화의 일환으로 기능을 데이터 원본 및 집계 창별로 그룹화하여 효율성을 높입니다. ColumnSelection 기능은 집계 창이 없으므로 데이터 원본별로만 그룹화됩니다. 구체화 파이프라인, 오프라인 테이블 및 온라인 테이블은 그룹화된 모든 기능이 삭제될 때까지 삭제되지 않습니다. 그룹의 마지막으로 구체화된 기능이 삭제되면 기능 저장소는 백그라운드 프로세스에 의한 자동 정리를 위해 연결된 리소스를 예약합니다. 백그라운드 리소스 정리를 참조하세요.

구체화된 기능을 정리하려면 구체화된 기능과 연결된 테이블을 확인합니다. 계산 및 델타 테이블 리소스가 정리되기 전에 테이블의 각 기능(열당 하나)을 삭제해야 합니다.

list_materialized_features()를 사용하여 materialized_feature 인수를 가져옵니다.

FeatureEngineeringClient.delete_materialized_feature(
    materialized_feature: MaterializedFeature,  # Required: The materialized feature to delete
) -> None
from databricks.feature_engineering import FeatureEngineeringClient

fe = FeatureEngineeringClient()

feature_names = [
    "main.feature_store.amount_sum_sliding_7d_1d",
    "main.feature_store.amount_sum_sliding_30d_1d",
    "main.feature_store.transaction_count_sliding_7d_1d",
    "main.feature_store.latest_transaction_amount",
    "main.feature_store.latest_user_tier",
]

for name in feature_names:
    mfs = fe.list_materialized_features(feature_name=name)   # required, keyword-only
    offline = [mf for mf in mfs if not mf.is_online]
    for mf in (offline or mfs):
        fe.delete_materialized_feature(materialized_feature=mf)
    fe.delete_feature(full_name=name)

백그라운드 리소스 정리

구체화된 기능을 삭제하면 Databricks는 기능 메타데이터를 즉시 제거합니다. 연결된 인프라(테이블, 파이프라인 및 작업)는 백그라운드 프로세스에 의해 비동기적으로 정리됩니다.

구체화된 여러 기능이 동일한 테이블 및 파이프라인을 공유할 수 있으므로 이러한 공유 리소스는 참조하는 구체화된 모든 기능이 삭제될 때까지 제거되지 않습니다. 테이블 집합을 공유하는 마지막 구체화된 기능이 삭제되면 백그라운드 프로세스는 다음 리소스를 자동으로 삭제합니다.

  • 구체화된 기능 데이터가 포함된 오프라인 델타 테이블
  • 온라인 테이블(기능이 온라인 스토어로 구체화된 경우)
  • 구체화 파이프라인
  • 오케스트레이션 작업

이 백그라운드 프로세스는 Databricks 관리 시스템 서비스 주체를 사용하여 작업 영역에서 테이블, 파이프라인 및 작업을 삭제하는 것을 포함하여 사용자를 대신하여 이러한 정리 작업을 수행합니다. 사용자가 수행할 작업은 없습니다. 정리는 기능 저장소에서 완전히 관리됩니다.

메모

그룹에서 마지막으로 구체화된 기능을 삭제하고 연결된 테이블 및 기타 리소스를 제거하는 데 약간의 지연이 있을 수 있습니다.

구체화 상태 보기

Databricks UI에서 기능 뷰의 물질화 상태를 확인하고 디버그 물질화 오류를 보려면 Unity 카탈로그의 기능 뷰 탐색을 참조하세요.

RollingWindow 종단 간 신선성 검증

메모

신선성 검증은 공개 미리보기 중인 Lakebase Change Data Feed(CDF)를 사용합니다. 작업 공간 관리자가 CDF를 켜기 전에 Lakebase Change Data Feed 미리보기를 활성화해야 합니다.

이 섹션은 RollingWindow 집계에만 적용됩니다. 배치 기능은 여기서 설명한 스트리밍 신선도 메타데이터를 노출하지 않습니다.

스트리밍 RollingWindow 기능은 Lakebase 온라인 스토어에 구체화된 자료를 행별 신선도 메타데이터를 포함하는 형태로 구현되었습니다. CDF는 온라인 테이블의 모든 업데이트를 Unity 카탈로그의 델타 히스토리 테이블에 캡처하고, 추가 파이프라인 없이 종단 간 신선도를 측정할 수 있습니다. 종단 간 신선도는 이벤트가 발생한 시점부터 그 집계값이 서빙 가능해진 시점 사이의 지연 상태를 의미합니다.

롤링윈도우 기능이 행을 방출하는 방법

RollingWindow 기능의 경우, 각 엔터티의 값은 고정된 시간 창 내의 이벤트(예: 최근 한 시간 동안의 거래 건수)를 요약합니다. 윈도우가 계속 앞으로 이동하므로 두 가지 상황에서 온라인 스토어에 행이 기록됩니다:

  • 데이터 기반 업데이트 (is_timer = false): 새로운 이벤트가 도착하여 집계를 업데이트합니다. 줄은 창에서 가장 최근 이벤트를 반영합니다.
  • 창 만료 (is_timer = true): 새로운 이벤트는 발생하지 않지만, 시간이 진행되고 가장 오래된 이벤트가 윈도우 범위를 벗어나거나 만료됩니다. 이 이벤트들이 더 이상 집계에 포함되지 않기 때문에 값이 변합니다(예: 카운트 감소). 따라서 기능은 타이머에 따라 업데이트된 행을 출력합니다. 이 행은 가장 오래된 이벤트가 만료된 순간을 반영하며, 이는 해당 이벤트의 시간 창이 끝나는 순간입니다.

롤링 윈도우 스트리밍 기능이 행을 쓰는 두 가지 방식입니다: 새로운 이벤트가 도착했을 때 데이터 기반 업데이트(is_timer = false), 그리고 가장 오래된 이벤트가 창에서 사라졌을 때 윈도우 만료 업데이트(is_timer = true)입니다.

두 경우 모두 event_time는 이 행을 생성한 변화가 발생한 시점입니다: 새로운 이벤트가 도착했거나, 가장 오래된 이벤트가 만료된 경우입니다. 따라서 commit_time - event_time는 행이 어떻게 방출되었는지와 관계없이 행의 신선도입니다.

신선도 메타데이터

각 스트리밍 온라인 항목은 다음과 같은 열을 포함합니다:

Column Description
event_time 행을 생성한 변경이 발생한 시점. 데이터 기반 업데이트(is_timer = false)에서는 창 내 가장 최근(최대) 이벤트 시간입니다. 윈도우 만료 업데이트(is_timer = true)에서는 가장 오래된 이벤트가 만료된 시간은 해당 이벤트의 시간에 윈도우 기간을 더한 값입니다. 온라인 테이블에 서로 다른 윈도우 기간을 가진 피처가 있다면, 만료된 윈도우가 사용됩니다.
output_time 출력 시점의 스트리밍 윈도우 프런티어(워터마크).
is_timer 행이 어떻게 생성되었는지: false = 새로 도착한 이벤트로 집계가 업데이트되었다(데이터 기반); true = 타이머에 따라 윈도우가 진행되고 가장 오래된 데이터가 만료됨(윈도우 만료).
commit_time 행이 Lakebase 온라인 스토어에 기록되었을 때.

CDF가 활성화되면 각 변경 사항이 CDF 메타데이터 열이 포함된 lb_<online_table>_history Delta 테이블에 추가됩니다. update_preimage 열(insert, update_postimage, delete 또는 _pg_change_type)은 각 변경 유형을 식별합니다.

온라인 테이블에 CDF를 활성화

Warning

생산 온라인 스토어에서 신선도를 지속적으로 모니터링하는 용도가 아니라, 예를 들어 파이프라인을 테스트하거나 구성을 조정하는 동안 종단 간 신선도를 검증하는 데 CDF를 사용하세요. CDF와 REPLICA IDENTITY FULL는 Lakebase 인스턴스에 부하를 추가하며, 주로 변경 사항을 디코딩하기 위한 CPU와 추가적인 write-ahead log 볼륨에 영향을 줍니다. 오버헤드는 동기화되는 테이블 수와 배열이나 맵과 같은 열 값의 크기가 클수록 증가합니다. 생산 트래픽을 제공하는 온라인 스토어에서 CDF를 활성화한다면, 자동 확장이 여유 용량을 확보하도록 최대 컴퓨트 유닛(CU)을 올리고, CPU 및 온라인 서비스 지연 시간을 모니터링하세요.

  1. Lakebase CDF는 업데이트를 완전한 전후 행 이미지로 캡처할 수 있도록 각 소스 테이블에서 복제 아이덴티티를 FULL로 설정해야 합니다. 온라인 테이블 위에 올려놓으세요:

    ALTER TABLE <schema>.<online_table> REPLICA IDENTITY FULL;
    
  2. 온라인 스토어에서 Lakebase CDF를 시작하고, 소스 스키마와 목적지의 Unity Catalog 카탈로그 및 스키마를 선택하세요. 설정 세부 사항은 Lakebase 변경 데이터 피드를 참조하세요.

CDF는 대상 스키마에 lb_<online_table>_history를 생성합니다.

변경 사항 캡처를 중단하려면 Lakebase CDF 비활성화를 참조하세요. CDF를 비활성화하면 프로젝트 내 모든 스키마의 피드가 중단됩니다. CDF를 비활성화한 후에는 온라인 테이블의 REPLICA IDENTITY를 초기화하여 추가된 선행 기록 로그 볼륨을 제거할 수 있습니다:

ALTER TABLE <schema>.<online_table> REPLICA IDENTITY DEFAULT;

신선도 계산

신선성은 데이터 기반 행과 윈도우 만료 행 모두에 대한 것입니다commit_time - event_time is_timer를 포함하여 두 방출 유형을 비교할 수 있고, 쿼리를 측정하려는 기간에 바인딩하세요.

SELECT
  event_time,
  commit_time,
  is_timer,
  (unix_micros(commit_time) - unix_micros(event_time)) / 1000 AS feature_freshness_ms
FROM <dest_catalog>.<dest_schema>.lb_<online_table>_history
WHERE _pg_change_type IN ('insert', 'update_postimage')
  AND commit_time >= (
    SELECT max(commit_time) - INTERVAL 1 DAY
    FROM <dest_catalog>.<dest_schema>.lb_<online_table>_history
  );

feature_freshness_ms 이벤트 시간부터 온라인 스토어 쓰기까지의 지연(밀리초 단위)입니다. 이는 제공에 사용할 수 있는 값의 최신성입니다.

메모

이미 행이 있는 온라인 테이블에서 CDF를 활성화하면, 초기 스냅샷은 각 기존 행을 히스토리 테이블에 insert로 복사합니다. 복사된 각 행은 해당 엔티티의 마지막 쓰기의 commit_time 및 event_time를 유지하므로 신선성 값은 정확하지만, 스냅샷은 각 엔티티당 정확히 하나의 샘플만 제공합니다. 피드에 캡처된 쓰기만 측정하려면, Lakebase CDF 탭에서 테이블 상태가 Streaming에서 Snapshotting로 바뀔 때까지 기다렸다가 시간을 기록한 뒤, 이 시간을 max(commit_time) - INTERVAL 1 DAY 대신 하한으로 사용하세요. 온라인 테이블의 스키마 변경이 또 다른 전체 스냅샷을 트리거하며, 이 스냅샷은 피드가 이미 캡처한 쓰기를 다시 반복합니다. 모든 insert 행을 걸러내지 마세요. 각 새 엔티티에 대한 첫 번째 쓰기 역시 insert이기도 합니다.

결과 해석

  • p50과 p99 feature_freshness_ms를 모두 추적하고, 데이터 기반 (is_timer = false) 행과 윈도 만료 (is_timer = true) 행을 비교합니다.
  • 파이프라인이 체크포인트와 커밋을 위해 잠시 멈추는 실시간 모드 배치 경계(기본값은 5분)에서 소폭 주기적 급증이 예상됩니다. 기본 간격에서는 보통 무시할 수 있습니다.
  • 드물게 긴 꼬리(최대 현상, p99 이후)를 모니터링하세요. 이는 안정 상태라기보다 파이프라인 캐치업을 반영하며, 특히 유지보수 재시작과 같은 재시작 후 파이프라인이 버퍼링된 이벤트를 처리할 때 가장 두드러지게 나타납니다. 재시작을 제외한 창 동안 정상 상태 신선도를 측정하고, 재시작 급증을 별도로 평가하세요.

제한점

일괄 기능

  • 일괄 처리 구체화 파이프라인은 서버리스 Lakeflow 파이프라인으로 실행됩니다.
  • 배치 롤링 윈도우 특징값은 Last에 설명된 온라인 전용 특수 사례를 제외하고는 머티리얼라이즈할 수 없습니다. 오프라인 훈련 또는 배치 추론의 경우, 각 시점 조회마다 원본 데이터로부터 롤링 윈도우 특징을 계산합니다.
  • ColumnSelection 기능은 온라인 스토어에만 구체화할 수 있습니다.
  • RequestSource, , FeatureViewSource그리고 CustomUDF 특징은 실현될 수 없다. 온디맨드 기능 및 구체화를 참조하세요.
  • 구체화된 기능은 생성된 작업 영역에서만 삭제할 수 있습니다.
  • 기능이나 그 모 스키마에 대한 Unity 카탈로그 권한과 관계없이 물질화된 기능을 만든 사용자만이 삭제할 수 있습니다.
  • 구체화된 집계 기능의 경우 온라인 구체화된 기능을 직접 삭제할 수 없습니다. 쌍을 이루는 오프라인 구체화된 기능을 삭제하면 변경 내용이 둘 다로 전파됩니다.
  • 2026년 4월 20일 이전에 만들어진 구체화된 집계 기능의 경우 구체화 파이프라인은 파이프라인의 구체화된 모든 기능이 삭제될 때까지 계속해서 새 기능 값을 생성하여 리소스 정리를 트리거합니다. 기능별 삭제를 지원하는 업데이트된 파이프라인을 만들려면 기능을 삭제하고 다시 구체화합니다.
  • 구체화된 ColumnSelection 기능의 경우 구체화 파이프라인은 파이프라인의 구체화된 모든 기능이 삭제될 때까지 계속해서 새 기능 값을 생성하여 리소스 정리를 트리거합니다.

스트리밍 기능

  • 스트리밍 기능은 온라인 스토어로만 구체화할 수 있습니다. 학습 시 스트리밍 기능은 밀리초 수준의 정확도를 제공하기 위해 데이터 요소당 기록 이벤트에서 다시 계산되도록 설계되었으므로 오프라인 구체화가 필요하지 않습니다.
  • 스트리밍 기능은 단일 materialize_features 호출에서 일괄 처리 기능과 혼합할 수 없습니다.
  • compute_features 는 스트리밍 기능을 지원하지 않습니다.
  • 작업 영역은 Lakebase 인스턴스를 지원하는 지역에 있어야 합니다.
  • Kafka 메시지는 JSON, Avro, 또는 Protobuf를 사용할 수 있습니다. 스키마 요구사항 및 스키마 레지스트리 제한에 대해서는 스키마 레지스트리를 참조하세요.
  • 스트리밍 집계 기능에는 RollingWindow 및 SawtoothWindow만 지원됩니다. TumblingWindow 및 SlidingWindow는 일괄 처리 기능과 함께 사용해야 합니다. 스트리밍 기능의 시간 창을(를) 참조하세요.
  • 스트리밍 기능에는 Avg, StddevPop, Max, FirstN, Last, LastDistinct, Sum, FirstDistinct, Min, LastN, First 및 Count 집계 함수만 지원됩니다.
  • 스트리밍 원본의 열 선택 기능은 순서가 다른 메시지를 처리하지 않습니다. Timeseries 열 값이 이전에 받은 이벤트보다 이전인 경우에도 Kafka 스트림의 최신 이벤트가 표시됩니다.
  • 스트리밍 파이프라인은 일주일에 두 번 다시 시작됩니다. 다시 시작할 때마다 처리 지연 및 시작 시간이 최대 1분까지 발생할 수 있습니다. 재시작을 제외하면 p99 최신성은 200ms입니다.
  • 스트리밍 기능은 backfill_features로 백필할 수 없습니다. 학습용 스트림에 과거 데이터를 추가하려면 스트림에 백필 소스 를 설정하세요.
  • 온라인 스토어의 RollingWindow 기능은 머티리얼라이제이션이 시작된 이후에 발생하는 이벤트만 포함하므로, 그 값은 전체 window_duration 기간이 완전히 지난 후에야 완전해집니다. Feature는 SawtoothWindow 머티리얼라이제이션이 시작될 때 스트림의 인제스션 테이블에서 과거 값을 계산합니다. 구체화는 나중에 인제스션 테이블에서 데이터를 수정해도 그 값을 다시 계산하지 않습니다.
  • Databricks Online 기능 저장소만 지원됩니다.
  • 스트리밍 머티리얼라이제이션 파이프라인은 서버리스 Lakeflow 파이프라인으로 실행됩니다.