Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

데이터셋과 스트림 내보내기

Data Connection은 Foundry 데이터셋과 스트림을 외부 시스템으로 내보냅니다. 정제한 데이터를 웨어하우스나 데이터 레이크에 전달하고, 배치 모델 추론 결과 또는 업무 애플리케이션에서 수집한 운영 데이터를 다른 시스템에서 사용할 수 있습니다.

내보내면 데이터를 접근하고 보관하며 공유할 수 있는 위치가 늘어납니다. 대상 시스템과 수신자가 승인된 목적에 맞는지 확인하고, 필요한 열만 선택하며 외부 접근 권한도 제한합니다. 내보내기 기능은 모든 소스에서 지원하지 않습니다. 소스의 연결 기능에 File export, Streaming export, Table export 또는 기존 Export task가 있는지 확인합니다.

2025년 6월부터 새로 내보낼 파일이나 행이 없는 실행은 success로 표시됩니다. 이전의 failed 상태에 의존하던 자동화나 경보는 이 동작을 반영해야 합니다. 성공 상태만으로 새 데이터가 전달되었다고 판단하지 않습니다.

내보내기 유형

유형입력과 목적지
File export데이터셋의 원시 파일을 정해진 일정에 따라 스키마 없는 외부 저장소에 복사합니다.
Streaming exportFoundry 스트림의 레코드를 스트리밍 목적지로 계속 보냅니다.
Table export스키마가 맞는 데이터셋 행을 외부 테이블에 지정한 모드로 삽입합니다.

예를 들어 Amazon S3는 파일 내보내기를 지원합니다. BigQuery처럼 기존 내보내기 작업을 사용하는 소스도 있습니다. 새 유형을 지원하는 소스에는 기존 Export task보다 현행 내보내기 기능을 권장합니다.

파일 내보내기

선택한 데이터셋의 파일을 목적지에 씁니다. 기본적으로 이전에 성공적으로 내보낸 업스트림 트랜잭션 이후 변경된 파일만 전송합니다. 특정 트랜잭션에서 바뀌지 않은 파일은 다음 예약 실행이나 수동 실행에서 다시 전송하지 않습니다.

전체 데이터셋을 다시 내보내려면 같은 소스에 새 내보내기를 만들거나, 업스트림 변환에서 다시 보낼 모든 파일을 덮어씁니다. 단순히 기존 내보내기를 다시 실행하는 것과 전체 파일 재전송은 다릅니다.

목적지에 같은 이름의 파일이 있으면 기본적으로 내보낸 파일로 덮어씁니다. 세부 동작은 소스 유형에 따라 달라질 수 있습니다. 다른 외부 데이터를 덮어쓰지 않도록 Foundry 내보내기 전용 하위 폴더를 사용합니다.

스트리밍 내보내기

작업이 실행되는 동안 목적지로 레코드를 보냅니다. 중지 후 다시 시작하면 이전에 처리한 위치부터 이어갑니다. 지원하는 소스 유형은 다음과 같습니다.

Kafka 내보내기에서는 스트림 레코드의 Base64 디코딩을 켤 수 있습니다. 인증, 목적지 및 레코드 형식은 해당 커넥터의 설정을 따릅니다.

스트림 재생 시 선택

처리 로직을 호환되지 않는 방식으로 바꾸면 Foundry 스트림을 재생하여 이전 레코드를 새 로직으로 다시 처리할 수 있습니다. 내보내기를 설정할 때 이 재생에 어떻게 대응할지 선택합니다.

설정결과
Export replayed records재생된 레코드를 모두 다시 보냅니다. 이미 내보낸 레코드도 재전송되므로 외부 시스템이 중복을 처리해야 합니다.
Do not export replayed records재생된 위치가 내보내기 작업의 가장 최근 오프셋과 맞을 때까지 전송을 멈춥니다. 재생 전후 오프셋이 일치한다는 보장이 없어 일부 레코드가 영구적으로 전송되지 않을 수 있습니다.

두 번째 선택은 중복 없는 전체 전달을 보장하는 옵션이 아닙니다. 재전송과 누락 중 어떤 위험을 다룰지 외부 처리 방식에 맞춰 결정합니다.

테이블 내보내기

테이블 내보내기는 2024년 6월부터 정식 제공되지만 모든 소스 유형에서 사용할 수 있는 것은 아닙니다. Data Connection의 소스 화면에서 Table exports 태그를 확인합니다. 사용 가능하면 기존 Export task보다 이 방식을 권장합니다.

Foundry 데이터셋의 스키마와 외부 테이블의 스키마가 맞아야 합니다. 내보내기는 원천별 INSERT 또는 동등한 API 호출로 행을 기록하며, 모드에 따라 전체 현재 뷰 또는 아직 내보내지 않은 트랜잭션을 선택합니다.

모드보낼 데이터대상 처리와 제약
Efficiently mirror dataset to external table현재 데이터셋 뷰에서 아직 내보내지 않은 트랜잭션을 증분으로 보냅니다.권장 모드입니다. SNAPSHOT을 만나면 대상 테이블을 비웁니다. UPDATE와 DELETE 트랜잭션은 지원하지 않습니다.
Full dataset without truncation현재 데이터셋 뷰 전체를 매번 보냅니다.대상 테이블을 비우지 않으므로 대개 중복이 생깁니다. 외부 소비자가 행을 처리 후 제거하거나 기존 행을 다시 보내야 할 때 사용할 수 있습니다.
Full dataset with truncation현재 데이터셋 뷰 전체를 매번 보냅니다.대상 내용을 먼저 비웁니다. 효율적 미러링보다 더 많은 데이터를 다시 쓰지만, 내보내기 사이에 외부에서 수정한 내용도 덮어쓸 수 있습니다.
Export incrementally현재 뷰의 미전송 트랜잭션만 보냅니다.대상 내용을 비우지 않습니다. UPDATE와 DELETE는 미지원입니다. APPEND만 있는 흐름에는 적합하지만 SNAPSHOT이 생기면 이전 행이 다시 전송되어 중복될 수 있습니다.
Export incrementally with truncation현재 뷰의 미전송 트랜잭션만 보냅니다.대상을 먼저 비웁니다. 외부 작업이 행을 소비하는 메시지 큐처럼 사용할 때 적합합니다. UPDATE와 DELETE는 미지원입니다.
Export incrementally and fail if not APPEND현재 뷰의 미전송 트랜잭션만 보냅니다.첫 실행 이후 SNAPSHOT, UPDATE 또는 DELETE가 있으면 실패합니다. APPEND 흐름에서 SNAPSHOT 때문에 전체 데이터를 다시 보내는 상황을 방지합니다.

증분 모드가 조절하는 것은 트랜잭션의 재전송입니다. 입력 행 자체나 목적지에 이미 있는 중복을 자동 제거하지 않습니다. 효율적 미러링도 외부의 별도 수정까지 매번 되돌리는 방식은 아니므로, 내보내기 사이의 외부 변경을 모두 덮어써야 한다면 전체 뷰를 비운 뒤 다시 쓰는 모드를 검토합니다. 기존 Export task에는 이 6개 모드 선택 화면이 없습니다.

스키마, 파일과 권한 조건

  • 열 이름은 대소문자까지 같아야 하고 자료형도 일대일로 맞아야 합니다. Foundry의 COLUMN_ABC: LONG을 외부의 COLUMN_ABC: STRING으로 내보내면 실행 중 실패합니다.
  • 소스가 요구하는 DATABASE, SCHEMA, TABLE을 채웁니다. 필요한 필드가 없거나 불필요한 필드를 추가해도 실패할 수 있으므로 원천 탐색과 자동 채우기로 목적지를 선택하는 것이 권장됩니다.
  • 기반 파일은 Parquet이어야 합니다. 스키마가 있는 CSV 등 다른 파일 형식도 테이블 내보내기에는 사용할 수 없습니다.
  • 목적지 테이블은 이미 존재해야 합니다. Foundry가 자동 생성하지 않습니다.
  • 내용을 비우는 모드를 선택했다면 외부 인증 주체에 해당 테이블을 truncate할 권한이 있어야 합니다.
  • Array, Map, Struct 열은 지원하지 않습니다.
  • 에이전트 워커로 테이블 내보내기를 실행한다면 Linux 호스트가 필요합니다. Windows 에이전트는 이 경로를 지원하지 않습니다.

JDBC 자료형과 고정 SQL 문법

사용자 지정 JDBC 연결은 테이블 내보내기를 지원합니다. Oracle처럼 전용 커넥터가 있는 시스템도 이 JDBC 테이블 내보내기 기능은 사용자 지정 JDBC 소스로 연결하여 사용합니다. 직접 제공한 드라이버 JAR을 사용할 때에는 생성되는 INSERT 문법을 원천의 SQL 방언이 받아들이는지 확인합니다. 생성 SQL 문은 현재 사용자 지정할 수 없습니다.

지원되는 JDBC 자료형은 다음 11개입니다.

DECIMAL, BIGINT, BINARY, BOOLEAN, SMALLINT, DATE,
DOUBLE, FLOAT, INTEGER, VARCHAR, TIMESTAMP

ARRAY, MAP, STRUCT와 이 목록에 없는 GEOGRAPHY 등의 유형은 지원하지 않습니다. 다른 SQL 방언이나 자료형 처리가 필요하면 소스를 변환 코드에 연결하는 외부 연결 변환(External transforms)으로 해당 시스템의 클라이언트를 사용할 수 있습니다.

가상 예제로, 같은 스키마의 target_table과 다음 데이터셋을 가정합니다.

column1column2column3
value1value2value3
value4value5value6
value7value8value9

한 행의 INSERT는 다음 형태입니다.

INSERT INTO target_table (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');

Snowflake처럼 배치 INSERT 경로를 지원하면 여러 행을 한 문장에 넣을 수 있습니다.

INSERT INTO target_table (column1, column2, column3)
VALUES ('value1', 'value2', 'value3'),
       ('value4', 'value5', 'value6'),
       ('value7', 'value8', 'value9');

Apache Hive의 제한된 배치 삽입 경로처럼 행별로 실행하는 경우에는 다음과 같이 나뉩니다.

INSERT INTO target_table (column1, column2, column3) VALUES ('value1', 'value2', 'value3');
INSERT INTO target_table (column1, column2, column3) VALUES ('value4', 'value5', 'value6');
INSERT INTO target_table (column1, column2, column3) VALUES ('value7', 'value8', 'value9');

Truncation 모드는 대상 테이블의 내용을 비운 뒤 삽입합니다. 테이블 자체를 새로 만드는 절차가 아닙니다.

TRUNCATE TABLE target_table;
INSERT INTO target_table (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');

멀티스레드 내보내기

일부 소스는 멀티스레드 테이블 내보내기를 지원합니다. 이 경우 Foundry는 외부 시스템에 임시 스테이징 테이블을 만들고 병렬로 기록한 뒤, 완료 시 최종 테이블로 데이터를 복사하여 원자성을 유지합니다. 완료 후 임시 테이블은 자동 삭제됩니다.

이 경로를 사용하는 인증 정보에는 대상 시스템의 테이블에 대한 CREATE, READ, UPDATE, DELETE 작업 권한이 필요합니다. 소스별 지원과 권한을 확인합니다.

내보내기 전에 데이터 준비

일반적으로 내보내기 작업 자체에서 데이터를 변환하지 않습니다. 열 필터, 이름 변경, 파일 재분할과 목적지 파일 형식은 Pipeline Builder 또는 Code Repositories에서 미리 구성합니다.

정형 데이터셋의 기반 파일은 기본적으로 spark/ 아래에 저장됩니다. 날짜별 디렉터리 같은 목적지 구조가 필요하면 Python 변환에서 파일 경로를 미리 바꿀 수 있습니다. 다음은 가상 예제 경로를 사용하는 완전한 변환입니다. 두 경로는 실제 입력 데이터셋과 생성할 출력 위치로 변경합니다.

import datetime
import shutil
from transforms.api import Input, Output, transform

INPUT_DATASET = "/Examples/exports/prepared-input"
OUTPUT_DATASET = "/Examples/exports/date-partitioned-output"


@transform(
    output_dataset=Output(OUTPUT_DATASET),
    input_dataset=Input(INPUT_DATASET),
)
def compute(input_dataset, output_dataset):
    date_prefix = datetime.date.today().strftime("data_dt=%Y%m%d/")
    input_fs = input_dataset.filesystem()
    output_fs = output_dataset.filesystem()
    for file_status in input_fs.ls():
        path = file_status.path
        relative_path = path[len("spark/"):] if path.startswith("spark/") else path
        with input_fs.open(path, "rb") as source_file:
            with output_fs.open(date_prefix + relative_path, "wb") as destination_file:
                shutil.copyfileobj(source_file, destination_file)

이 변환은 실행 환경의 현재 날짜를 사용합니다. 예를 들어 spark/part-00000-example.parquet는 data_dt=20240101/part-00000-example.parquet 같은 경로가 됩니다. 파일 내보내기에는 이 변환의 출력 데이터셋을 선택합니다. 첫 빌드 후 데이터셋에서 Apply schema를 선택하면 정형 데이터로 볼 수 있습니다.

소스의 반출 허용 설정

소스 Connection settings의 Export configuration에서 내보내기를 활성화합니다. 기본 역할의 권한 조건은 다음과 같습니다.

작업필요한 권한
Enable exports to this source 켜기 또는 끄기소스의 Owner와 플랫폼 인스턴스의 Information Security Officer 역할
반출 가능한 보안 표지 추가소스 Owner와 해당 표지의 Apply marking, Remove marking 권한
반출 가능한 조직 추가소스 Owner와 해당 조직의 Expand access 권한. 자신의 조직이면 Expand access 예외가 적용됩니다.

Information Security Officer 역할은 Control Panel의 Enrollment permissions에서 관리합니다. 반출 보안 표지나 조직을 추가하는 작업 자체에는 이 역할이 필요하지 않습니다. 각 행에 기재한 소스 및 표지 또는 조직 권한은 충족해야 합니다.

데이터에 붙은 보안 표지(Marking)나 조직이 소스 반출 설정에 없으면 내보낼 수 없습니다. 가상 예로 Palantir 조직의 Sensitive 표지가 붙은 데이터셋이라면 두 항목을 모두 허용해야 합니다. 모니터링 뷰의 Slack 알림에 나타날 수 있는 리소스 이름 등 메타데이터에도 반출 가능한 표지 설정이 영향을 줍니다.

일부 대화형 워크플로는 반출할 모든 데이터를 추론할 수 없어 표지 검증을 수행하지 못합니다. 함수에서 웹훅을 사용하는 경로 등이 여기에 해당하며, 필요한 경우 Enable exports to this source without markings validations를 별도로 허용해야 합니다. 일반 반출 허용과 표지 검증 없는 반출 허용을 구분합니다.

외부 인증 주체에는 목적지 쓰기 권한도 있어야 합니다. S3에는 s3:PutObject가 필요하고, 파일 목적지에 폴더가 없다면 디렉터리 생성 권한이 필요할 수 있습니다. 테이블을 비우는 모드와 멀티스레드 모드는 앞에서 설명한 추가 권한을 요구합니다.

생성과 실행

소스 Overview에서 Create export를 선택합니다.

내보낼 데이터셋 또는 스트림을 선택하고 소스별 목적지 설정을 입력합니다. 데이터셋에 여러 브랜치가 있더라도 내보내는 데이터는 master 브랜치의 값입니다.

저장 후 관리 화면에서 수동 실행, 일정 추가, 이력 조회와 설정 변경을 수행할 수 있습니다. 일부 옵션은 생성 후 변경할 수 없습니다. 그러한 옵션을 바꾸려면 내보내기를 삭제하고 다시 생성해야 합니다.

스트리밍 내보내기는 Run 대신 시작 및 중지 버튼을 사용하며 주기적 일정이 필요하지 않습니다. 일정을 설정한 경우 트리거 시 작업이 중지되어 있으면 자동으로 다시 시작하고, 이미 실행 중이면 계속 실행합니다.

일정과 이력

배치 내보내기는 Overview > Add schedule에서 Data Lineage를 열고 Create new schedule로 일정을 구성합니다. 이미 연결된 일정은 내보내기의 Overview에서 확인합니다.

내보내기는 Foundry 빌드 시스템의 작업으로 실행됩니다. History에서 실행 이력을 열고 Job details 오른쪽 위의 View build report로 Builds의 상세 보고서를 볼 수 있습니다. 스트리밍 이력에는 작업이 실행 중인지 중지되었는지도 표시됩니다.

기존 Export task에서 이전

Export tasks는 Sunset 단계이며 소스와 플랫폼 인스턴스에 따라 계속 지원될 수 있습니다. 기존 작업을 현행 내보내기로 옮기는 과정은 수동입니다. 새 내보내기의 결과가 요구사항에 맞는지 확인한 다음 기존 작업을 삭제합니다. 필요한 기능이 새 옵션에 없다면 외부 연결 변환에서 사용자 지정 로직을 구현합니다.

기존 Task 옵션새 내보내기 지원적용 방식
parallelize: boolean소스별로 다름소스가 제공하는 병렬화 설정이 있을 때 사용할 수 있습니다.
preSql미지원SQL 전처리가 필요하면 외부 연결 변환을 사용합니다.
stagingSql미지원스테이징 단계의 사용자 지정 SQL은 외부 연결 변환으로 구성합니다.
afterSql미지원SQL 후처리가 필요하면 외부 연결 변환을 사용합니다.
manualTransactionManagement: boolean미지원직접 트랜잭션을 관리해야 하면 외부 연결 변환을 사용합니다.
transactionIsolation: READ_COMMITTED내보내기에서 설정 불가해당 소스가 격리 수준 설정을 제공하면 소스에 구성한 값이 적용됩니다.
datasetRid지원내보낼 데이터셋 또는 스트림을 선택합니다.
branchId설정 불가항상 master 브랜치에서 내보냅니다.
table.database, table.schema, table.table지원JDBC 테이블 내보내기의 목적지 식별값입니다. database와 schema의 필요 여부는 소스에 따릅니다.
writeDirectly: boolean설정 불가이전 옵션의 writeDirectly: true에 해당하는 방식으로 동작합니다. 소스별 멀티스레드 내보내기의 내부 스테이징 동작과 구분합니다.
copyMode: insert 또는 directCopy설정 불가새 내보내기는 copyMode: insert에 해당합니다.
batchSize: integer소스별로 다름JDBC 소스는 배치 크기를 지원하지만 다른 소스에도 같은 설정이 있는 것은 아닙니다.
writeMode: ErrorIfExists, Append, Overwrite, AppendIfPossible와 incrementalType: snapshot, incremental모드 선택으로 지원두 옵션의 유효한 조합은 테이블 내보내기의 6개 모드에 대응합니다. 이전 작업에서 모든 조합이 유효한 것은 아닙니다.
exporterThreads: integer미지원세부 스레드 제어가 필요하면 외부 연결 변환을 사용합니다.
quoteIdentifiers: boolean미지원이전 작업의 테이블 생성에 관련된 옵션입니다. 새 내보내기는 미리 존재하는 테이블을 사용합니다.
exportTransactionIsolation: READ_UNCOMMITTED설정 불가소스가 해당 격리 수준 설정을 제공하고 구성되어 있으면 그 값이 적용됩니다.