Snowpark로 Clean Rooms 사용하기¶
소개¶
대규모 데이터를 쿼리하거나 처리해야 할 때 Snowflake Data Clean Rooms는 Snowpark와 함께 작동하여 Clean Rooms에 향상된 컴퓨팅 성능을 제공할 수 있습니다.
Clean Rooms는 두 가지 방법으로 Snowpark를 사용할 수 있습니다.
Snowpark UDF: Clean Room 코드에 Snowpark API 를 사용하여 Snowpark 확장 및 처리 능력을 활용하는 Snowpark UDF를 생성합니다.
Snowpark Container Services: Snowpark 환경을 보다 강력하게 제어하고 싶거나 Snowpark API 에서 사용할 수 없는 라이브러리를 사용하려는 경우, Clean Room 내에서 컨테이너를 구성하고 호스팅할 수 있습니다. 이를 통해 특정 컴퓨팅 및 저장소 요구 사항에 맞게 환경을 구성하고 환경에 사용 가능한 라이브러리를 사용자 지정할 수 있습니다.
메모리 용량을 초과하는 대규모 데이터를 로드해야 하는 경우, to_pandas_batches()
를 사용하여 반복 처리합니다. 예:
df_iter = session.table(intermediary_table_name).to_pandas_batches() for df in df_iter: ...
복잡한 사용 흐름의 일반적인 설계¶
하나의 템플릿을 호출하여 데이터를 생성하고 모두 표시할 수도 있지만, 대부분의 경우 데이터 생성 단계와 결과 보기 단계를 분리하는 것이 좋습니다. 이렇게 하면 컨슈머는 매번 재계산을 트리거하지 않고도 결과를 여러 번 보거나 프로세스의 다양한 지점에서 데이터를 볼 수 있습니다. 흐름을 사용자가 액세스할 수 있는 여러 스테이지로 나누려면 데이터 생성 또는 처리 트리거와 저장된 결과 보기를 위한 별도의 템플릿을 만드십시오. 복잡한 사용 흐름 설계에 대해 자세히 알아보십시오.
Clean Room에서 Snowpark UDF 사용하기¶
업로드한 Python 코드에 Snowpark API 를 사용하면 대용량 데이터 로딩 처리 속도를 높일 수 있습니다. Clean Rooms는 Snowpark Python API 만 지원합니다. 공급자와 컨슈머 모두 업로드한 Python 코드에서 Snowpark Python API 를 사용할 수 있습니다.
전제 조건¶
Snowpark UDF를 실행하는 Clean Rooms는 반드시 Clean Rooms API 에서 실행해야 하며, Clean Rooms UI 에서는 실행할 수 없습니다.
다음 주제를 이해해야 합니다.
내부 테이블에 대해 이해하려면 다단계 흐름 설계하기 섹션을 참조하십시오.
Clean Room에서 Snowpark API 사용하기¶
Clean Room Python 코드에서 Snowpark API 를 사용하는 것은 snowflake-snowpark-python
라이브러리에 연결해야 한다는 점을 제외하고는 다른 Python UDF 를 업로드하고 실행하는 것과 동일합니다.
Snowpark 데코레이터를 사용하는 대신 cleanroom
스키마의 session.sql
을 사용하여 SQL 을 실행하여 UDF, UDTF 및 프로시저를 생성합니다. 예:
session.sql("CREATE OR REPLACE FUNCTION cleanroom.udf(...")
기본 단계¶
다음은 Clean Room에서 UDF 또는 UDTF 를 통해 Snowpark API 를 사용하는 기본 단계입니다.
공급자
Clean Room을 만들고, 기본 릴리스 지시문을 설정하고, 표준 방식으로 데이터를 연결합니다.
코드에 매우 구체적인 사용 사례가 설계되어 있을 가능성이 높으므로 Clean Room에 조인 또는 열 정책을 추가할 필요는 없지만, 추가할 수는 있습니다.
provider.load_python_into_cleanroom
을 호출하여 사용자 지정 Snowpark 처리기 코드를 Clean Room에 로딩합니다. 코드는 최소한snowflake-snowpark-python
패키지와 필요한 다른 패키지를 로딩해야 합니다. UDF는 데이터를 한 줄씩 처리하고 반환할 수 있지만, Snowpark 사용 사례는 일반적으로 별도의 결과 템플릿을 호출하여 읽는 출력 테이블을 생성합니다.기본 릴리스 지시문을 업데이트합니다(코드를 추가하면 새 패치 버전이 생성되므로).
사용자 지정 템플릿 을 생성하고 업로드하여 Snowpark 코드를 실행합니다. UDF 를 실행하는 유일한 방법은 UDF 를 호출하는 템플릿에서 트리거하는 것입니다. UDF 호출 템플릿에 대한 자세한 내용입니다.
provider.load_python_into_cleanroom
에서 지정한 별칭과 매개 변수를 사용하여 함수를 호출해야 합니다. 템플릿은 함수의 별칭을 호출할 때cleanroom
네임스페이스를 사용해야 합니다.UDF 에서 Clean Room의 테이블에 결과를 쓰고 각 실행마다 테이블 이름이 다른 경우, 결과 생성 템플릿은 결과 테이블의 이름을 반환해야 하며, 결과 템플릿은 사용자의 테이블 이름을 인자로 받아야 합니다.
사용자 지정 SQL 템플릿을 업로드하여 Snowpark UDF 에서 생성한 결과 테이블에 액세스합니다(중간 결과 테이블을 생성한 경우). 하드코딩된 결과 테이블 이름을 사용하거나 사용자가 코드에서 생성하고 결과 생성 템플릿에서 반환한 테이블 이름을 입력하도록 하십시오.
공동 작업자를 추가하고 표준 방식으로 Clean Room을 게시합니다.
컨슈머
컨슈머는 Clean Room을 설치하고 표준 방식으로 분석을 실행합니다. 데이터 생성 및 결과 읽기가 별도의 템플릿으로 나뉘어져 있는 경우, 컨슈머는 각 템플릿을 시퀀스별로 호출해야 합니다.
코드 예시¶
다음 예제 코드는 ‘노출 수에 따른 도달 수’의 선형 회귀를 업로드하고 실행하여 기울기를 추정하는 방법을 보여줍니다.
컨슈머는 먼저 공급자 UDF 를 실행하는
prod_calculate_regression
템플릿을 실행하여 결과를 생성합니다. 공급자 UDF 는 다음 작업을 수행합니다.노출 데이터를 전처리합니다. 공급자의 노출 데이터를 컨슈머의 데이터에 조인하는 동적 SQL 이 생성되고, 날짜별 고유 노출 수와 도달 범위를 계산한 다음, Clean Room 내부의 중간 테이블에 결과를 저장합니다. 컨슈머가 테이블을 제공하지 않으면 공급자의 전체 노출 테이블에 대해 코드가 실행됩니다.
중간 테이블을 로딩합니다. 중간 테이블은 Snowpark 프로시저에 pandas DataFrame 으로 로딩됩니다.
회귀를 수행합니다. 회귀는
statsmodels
라이브러리를 사용하여 계산되며 결과를 pandas DataFrame 으로 반환합니다.결과를 내부 Clean Room 테이블에 기록합니다. 결과는 Clean Room 내부의 결과 테이블에 기록되며, 테이블 이름의 접미사 ID 가 컨슈머에게 반환됩니다. Snowpark 프로시저는 Clean Room 내부에서 실행되기 때문에 컨슈머 계정으로 데이터를 활성화하는 기능이 제한되어 있습니다. 대신 결과의 보안을 강화하기 위해 Clean Room 내부의 테이블에 기록하고, 컨슈머는 다른 템플릿을 실행하여 결과 데이터를 읽습니다.
중간 테이블을 제거합니다. Clean Room 내부에서 계산하는 동안 생성되어 더 이상 필요 없는 중간 테이블은 Snowpark 프로시저가 완료되기 전에 삭제됩니다.
결과 테이블의 이름을 반환합니다. 이전 실행의 모든 결과가 유지되므로 템플릿을 실행하여 결과를 가져올 때 컨슈머에게 반환되는 이름을 지정해야 합니다.
그런 다음 컨슈머는
get_results
템플릿을 실행하여 첫 번째 템플릿에서 반환한 결과 테이블 접미사를 전달하여 결과를 확인합니다.
아래 예제를 실행하려면 (클라우드 간 자동 복제 를 구현하지 않은 경우) 동일한 웹 호스팅 리전에 공급자용 계정과 컨슈머용 계정 등 두 개의 계정이 필요합니다.
예제 코드는 추가 Snowpark 구성 없이 Snowflake 워크시트에서 실행되어야 합니다. 다른 환경에서 실행하는 경우, Snowpark Python API 를 설치하고 구성해야 할 수 있습니다.
자세한 정보¶
Clean Room에서 Snowpark Container Services 사용하기¶
Python 코드를 실행하는 환경을 보다 강력하게 제어하고 싶다면 Clean Room 내에서 Snowpark Container Service를 실행할 수 있습니다. 이를 통해 코드의 실행 환경을 세밀하게 제어할 수 있으며, 성능을 극대화하고 비용을 최소화하기 위해 특수 컴퓨팅, 저장소 또는 기타 리소스가 필요하거나 사용자 지정 패키지 또는 기타 환경 기능을 가져와야 하는 사용 사례에 이상적입니다.
Clean Room에서 컨테이너 서비스를 호스팅하는 경우 템플릿과 사용자 지정 Python 코드는 서비스에서 노출된 함수를 호출할 수 있습니다. Snowpark Container Services를 사용하는 것은 UDF를 사용하는 것과 유사하지만, UDF가 템플릿이 호출할 수 있는 HTTP 엔드포인트로 노출된다는 점을 예외로 합니다. 서비스 및 엔드포인트를 정의하고 Clean Room에 업로드합니다.
내부 호스팅 엔드포인트는 Clean Room 내의 템플릿으로만 액세스할 수 있으며, Clean Room 공동 작업자가 직접 호출할 수 없습니다.
전제 조건¶
Clean Room에서 Snowpark Container Services를 사용하려면 다음 항목을 이해해야 합니다.
Snowpark Python API (이 API 를 사용하는 경우).
데이터를 처리하고 결과를 별도의 단계로 노출하는 방법은 복잡한 사용 흐름 설계하기 섹션을 참조하십시오.
기본 단계¶
공급자
서비스 사양, 코드 및 처리 요청을 처리하는 엔드포인트를 생성합니다.
이미지 리포지토리를 만들고 해당 리포지토리에 SAMOOHA_APP_ROLE 에 대한 액세스 권한을 부여합니다.
다음 단계를 위해 URL 리포지토리를 캡처합니다.
이미지를 빌드하여 리포지토리 URL 에 업로드합니다.
표준 방식으로 Clean Room을 만들고, 데이터를 연결하고, 조인 정책을 추가하고, 컨슈머를 추가합니다.
서비스 포인트를 호출하는 템플릿을 정의하고 Clean Room에 업로드합니다. (
cleanroom
에서 생성 및 호출되는 UDF와는 달리) 서비스 함수는 네임스페이스service_functions
에서 생성 및 호출됩니다.-- Template to call an SPCS function named train. SELECT service_functions.train( {{ source_table[0] }}, {{ provider_join_col }}, {{ my_table[0] }}, {{ consumer_join_col }}, {{ dimensions | sqlsafe }},
provider.load_service_into_cleanroom
을 호출하여 Clean Room에 서비스 세부 정보를 업로드합니다. 이것은 이미지 URL, 엔드포인트) AS train_result;
provider.load_service_into_cleanroom
을 호출하여 Clean Room에 서비스 세부 정보를 업로드합니다. 이것은 URL, 엔드포인트 및 기타 서비스 옵션을 정의합니다. 여기에 정의된 엔드포인트 이름은 서비스 사양과 일치해야 하며 템플릿에서 함수를 호출하는 데 사용하는 이름입니다.CALL samooha_by_snowflake_local_db.provider.load_service_into_cleanroom( $cleanroom_name, $$ spec: containers: - name: lal image: /dcr_spcs/repos/lal_example/lal_service_image:latest env: SERVER_PORT: 8000 endpoints: - name: lalendpoint port: 8000 public: false $$, $$ functions: - name: train args: PROVIDER_TABLE VARCHAR, PROVIDER_JOIN_COL VARCHAR, CONSUMER_TABLE VARCHAR, CONSUMER_JOIN_COL VARCHAR, DIMENSIONS ARRAY, FILTER VARCHAR returns: VARCHAR endpoint: lalendpoint path: /train $$);
Clean Room에 대한 기본 릴리스 지시문을 설정합니다. 서비스를 업로드하거나 수정할 때마다 새 패치 버전이 만들어집니다.
Clean Room을 게시합니다.
이미지, 함수 또는 코드를 변경할 때 귀하와 컨슈머는 인스턴스를 업데이트해야 합니다.
컨슈머¶
Clean Room을 설치하고 표준 방식으로 필요한 모든 데이터를 연결합니다.
컴퓨팅 풀을 만들고 Clean Room에 대한 액세스 권한을 부여합니다.
쿼리를 실행할 경우(거의 대부분 실행할 것임) 사용 중인 웨어하우스에 있는 Clean Room에 USAGE 권한도 부여해야 합니다.
samooha_by_snowflake_local_db.consumer.start_or_update_service
를 호출하여 Clean Room 이름, 컴퓨팅 풀 이름, 웨어하우스 이름(웨어하우스를 사용하는 경우)을 전달하여 서비스를 시작합니다.SHOW ENDPOINTS IN SERVICE SAMOOHA_CLEANROOM_APP_clean_room_name.services.service;
를 실행하여 서비스에 사용 가능한 엔드포인트를 검사합니다.서비스가 실행되면 표준 방식으로
consumer.run_analysis
를 호출하여 서비스 엔드포인트에 액세스하는 모든 Clean Room 템플릿을 실행할 수 있습니다.
컴퓨팅 풀 만들기¶
풀을 소유하고 구성하는 주체에 따라 공급자가 Clean Room 내부에 컴퓨팅 풀을 생성하거나, 컨슈머가 Clean Room 외부에 컴퓨팅 풀을 생성할 수 있습니다.
컴퓨팅 풀이 Clean Room 외부에서 생성된 경우, 아래와 같이 풀에 액세스하고 서비스를 생성하려면 Clean Room에 적절한 권한을 부여해야 합니다.
-- Grant access to a warehouse to run queries. Needed only if the service queries Snowflake accounts.
USE ROLE ACCOUNTADMIN;
GRANT USAGE ON WAREHOUSE APP_WH TO APPLICATION SAMOOHA_CLEANROOM_APP_<CLEANROOM_NAME>;
-- Grant SAMOOHA_APP_ROLE privileges to create compute pools and create services
GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE SAMOOHA_APP_ROLE WITH GRANT OPTION;
GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE SAMOOHA_APP_ROLE WITH GRANT OPTION;
USE ROLE SAMOOHA_APP_ROLE;
-- Create the compute pool
CREATE COMPUTE POOL DCR_LAL_POOL
FOR APPLICATION SAMOOHA_CLEANROOM_APP_<CLEANROOM_NAME>
min_nodes = 1 max_nodes = 1
instance_family = highmem_x64_l
auto_resume = true;
-- Grant the clean room the privileges to access a pool running outside the clean room.
-- Grant the clean room access to the compute pool
GRANT USAGE ON COMPUTE POOL DCR_LAL_POOL TO APPLICATION SAMOOHA_CLEANROOM_<CLEANROOM_NAME>;
-- Allow the clean room to create the service
GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO APPLICATION SAMOOHA_CLEANROOM_APP_<CLEANROOM_NAME>;
서비스 코드 또는 구성 업데이트하기¶
공급자가 이미지, 서비스 사양, 서비스 엔드포인트 이름 또는 원본 코드를 업데이트하는 경우 공급자와 컨슈머 모두 다음 단계를 수행해야 합니다.
1. 공급자:
필요에 따라 이미지 또는 원본 코드를 업데이트합니다.
provider.load_service_into_cleanroom
을 호출하면 새 패치 번호가 반환됩니다.새 패치 번호와 함께
provider.set_default_release_directive
를 호출합니다.
2. 컨슈머:
consumer.start_or_update_service
를 호출합니다.
서비스 모니터링하기¶
기본적으로 컨슈머는 자신의 서비스를 모니터링할 수 있습니다. 이 동작은 provider.load_service_into_cleanroom
의 service_config
인자에서 allow_monitoring
값을 사용하여 변경할 수 있습니다.
컨슈머 모니터링이 활성화된 경우, 컨슈머는 다음과 같이 지정된 Clean Room 서비스(SAMOOHA_CLEANROOM_APP_SPCS_cleanroom_name.services.service
형식), 서비스 ID, 컨테이너에 대한 모니터링 로그에 액세스할 수 있습니다.
SELECT VALUE AS log_line
FROM TABLE(
SPLIT_TO_TABLE(SYSTEM$GET_SERVICE_LOGS(
'SAMOOHA_CLEANROOM_APP_SPCS_Lookalike_Demo.services.service', 0, 'lal'), '\n')
);
컨슈머는 다음과 같이 DESCRIBE SERVICE 명령을 사용하여 서비스 상태를 확인할 수도 있습니다.
-- See the state of the service.
DESCRIBE SERVICE SAMOOHA_CLEANROOM_APP_SPCS_Lookalike_Demo.services.service;
SHOW ENDPOINTS IN SERVICE SAMOOHA_CLEANROOM_APP_clean_room_name.services.service;
를 실행하여 서비스 엔드포인트를 확인할 수 있습니다. 예:
SHOW ENDPOINTS IN SERVICE SAMOOHA_CLEANROOM_APP_SPCS_Lookalike_Demo.services.service;
코드 예시¶
다음 노트북과 zip 파일은 Clean Room에서 Snowflake 컨테이너 서비스를 사용하는 방법을 보여줍니다. Clean Rooms가 설치된 두 개의 계정이 필요합니다. 하나는 공급자용이고 다른 하나는 컨슈머용입니다. 동일한 클라우드 호스팅 리전에 있어야 합니다. 압축된 구성 파일을 사용하여 서비스를 정의합니다.