Prefect Architecture

생각하는 마리오네트·2024년 4월 21일
0

Prefect

목록 보기
1/1

What is prefect??

Prefect는 데이터 파이프라인을 구축하고 관리하기 위한 오픈 소스 자동화 도구입니다. 이 도구는 데이터 엔지니어링 작업을 쉽게 할 수 있도록 설계되었습니다. 몇 가지 핵심 특징은 다음과 같습니다

  1. 선언적 파이썬 구문: Prefect는 파이썬으로 작성되었으며, 사용자가 데이터 파이프라인을 구축할 때 선언적인 구문을 사용합니다. 이는 파이프라인의 의도를 명확하게 하고, 코드의 가독성을 높여줍니다.

  2. 유연한 스케줄링 및 실행: Prefect는 다양한 스케줄링 옵션을 지원하며, 사용자가 편리하게 파이프라인 실행을 관리할 수 있습니다. 로컬, 분산, 및 서버리스 환경에서의 실행이 가능합니다.

  3. 모듈화 및 재사용성: Prefect는 모듈화된 디자인을 채택하여 코드를 구성하고 재사용하기 쉽도록 합니다. 작은 조각으로 파이프라인을 구성할 수 있고, 필요한 경우 재사용할 수 있습니다.

  4. 상태 관리 및 모니터링: Prefect는 파이프라인의 실행 상태를 관리하고 모니터링할 수 있는 다양한 도구를 제공합니다. 이를 통해 사용자는 실행 중인 작업의 상태를 실시간으로 추적하고 문제를 식별할 수 있습니다.

  5. 간편한 디버깅: Prefect는 파이프라인의 디버깅을 지원하여 사용자가 코드를 분석하고 문제를 해결할 수 있도록 합니다. 실행 중에 발생하는 오류를 식별하고 처리할 수 있습니다.

요약하면, Prefect는 데이터 파이프라인을 구축하고 실행하는 프로세스를 단순화하고 자동화하는 데 도움을 주는 강력한 도구입니다. 데이터 과학자와 데이터 엔지니어가 데이터 작업에 집중할 수 있도록 하며, 코드의 가독성과 유지 보수성을 향상시킵니다.

Prefect Cloud Simple Architecture

Prefect Cloud는 간단하게 위와 같은 구조를 가지고있습니다.
먼저 Prefect를 이해하기 위해서는 몇가지 용어들을 알아야 합니다.

1. Task

데이터 파이프라인에서 실제로 수행되는 작업의 단위를 말하며, Task간의 의존성을 가지는 경우가 많습니다.

from prefect import flow, task

@task
def my_task():
	print('Hello, I'm a task')

@task
def my_task_2():
	pirnt('let me introduce prefect')

@flow
def my_flow():
	my_task()
    my_task_2()

위 코드에서 @task로 감싸고 있는 함수들이 task입니다. 말그대로 @task를 함수에 붙여주면 task로 인식이됩니다. 간단하게 문자열을 출력하는 두개의 task가 벌써 완성이 되었습니다.

추가로 task에는 아래와 같이 여러가지 parameter를 지정해줄 수 있습니다.

import httpx

from prefect import flow, task


@task(retries=2, retry_delay_seconds=5)
def get_data_task(
    url: str = "https://api.brittle-service.com/endpoint"
) -> dict:
    response = httpx.get(url)

    # If the response status code is anything but a 2xx, httpx will raise
    # an exception. This task doesn't handle the exception, so Prefect will
    # catch the exception and will consider the task run failed.
    response.raise_for_status()

    return response.json()


@flow
def get_data_flow():
    get_data_task()

2. Flow

Prefect에서 Flow는 데이터 파이프라인의 핵심 구성 요소입니다. Flow는 작업(Task)들의 그래프로, 데이터 처리 과정을 정의하고 구성합니다. 이러한 Flow는 선언적인 파이썬 구문을 사용하여 정의되며, 작업 간의 의존성을 명시적으로 정의할 수 있습니다. (Airflow의 DAG과 비슷합니다 => 단일 task 또는 여러 task로 구성될 수 있습니다.)

from prefect import flow, task

@task
def my_task():
	print('Hello, I'm a task')

@task
def my_task_2():
	pirnt('let me introduce prefect')
기
@flow
def my_flow():
	my_task()
    my_task_2()

Task를 설명할때 사용했던 파일을 다시 불러와봅니다.
@flow로 감싸져 있는데 함수 my_flow를 보시면 됩니다. 역시나 @flow로 감싸주게되면 flow로 인식하게 되며,
task들의 실행 순서에 맞게 함수를 완성해 주시면 됩니다.

flow의 parameter 확인하기

3. Deployment

Deployment는 Flow를 캡슐화 하는 개념이며, Flow 코드가 저장되는 위치와 실행 방법에 대한 meta data를 저장합니다.

이러한 특성 때문에 Deployment를 사용하게 되면 Flow를 쉽게 실행하고 관리할 수 있으며, 코드 변경이나 업데이트를 쉽게 반영할 수 있게됩니다.

Prefect의 워크플로우에 대한 배포 생성의 경우 Prefect API를 통해서 관리하며, Prefect의 Agent에서 원격으로 실행 가능하도록 워크플로우에 대한 코드, 설정 및 인프라 구성을 패키징하는것을 의미합니다.

Deplyment를 배포하는 방법은 여러방법이 있을것 같지만 현재는 Deployment.build_from_flow를 통해서 실행시키는 수동배포를 하고있습니다.. 더 편하고 적절한 방법을 찾게되면 Deplyment배포를 따로 다루려고합니다.

4. Prefect UI SERVER

UI SERVER에서 알아야 할것은 어떤 역할을 하고 어떤것을 관여하지 않는지 구분하는 것입니다.

UI SERVER에서 하는 일

  • Flow Schedule
  • Managed Log
  • GUI
  • Meta Info

UI SERVER에서 하지 않는 일

  • flow실행(-> flow를 실행하는것은 agent에서 담당하며 실행 할때는 flow code가 필요한데 이때 code는 code storage에 보관됩니다, 예를들어 gitlab)

5. Agent

Prefect코드의 실질적인 실행은 Agent에서 담당합니다. Agent는 직접 띄워야 하며 다양한 종류의 agent가 있습니다.

  • Local Agent :LocalAgent는 Prefect Flow를 로컬 환경에서 실행하는 데 사용됩니다. 이 에이전트는 로컬 컴퓨터나 로컬 서버에서 Flow를 실행하고 모니터링할 수 있습니다.

    	- 장점1 : 간단하고 로컬 환경에서 쉽게 설정할 수 있습니다.
    	- 장점2 : 로컬 머신 자원을 사용하여 실행하므로 비용이 발생하지 않습니다.
    	- 단점1 : 확장성이 제한적이며, 여러 머신에서의 분산 실행을 지원하지 않습니다.
    	- 단점2 : 머신의 자원 한계에 따라 처리할 수 있는 작업의 양이 제한될 수 있습니다.
  • Docker Agent : DockerAgent는 Prefect Flow를 도커 컨테이너 내에서 실행하는 데 사용됩니다. 이 에이전트는 Flow를 도커 이미지로 패키징하고, 컨테이너 내에서 실행하여 이식성을 높이고 환경을 격리할 수 있습니다.

    	- 장점1 : 도커 컨테이너를 사용하여 애플리케이션을 격리하고 이식성을 높입니다.
    	- 장점2 : 다양한 환경에서 일관된 실행 환경을 제공합니다.
    	- 단점1 : 호스트 머신에서 도커를 실행해야 하므로 일부 추가 설정이 필요합니다.
    	- 단점2 : 도커 이미지의 생성 및 관리에 대한 추가 작업이 필요할 수 있습니다.
  • Kubernates Agent : KubernetesAgent는 Prefect Flow를 Kubernetes 클러스터 내에서 실행하는 데 사용됩니다. 이 에이전트는 Kubernetes에 Flow를 배포하고, 클러스터 내에서 파드(Pod)로 실행하여 자동 확장과 고가용성을 제공할 수 있습니다.

    	- 장점1 : Kubernetes 클러스터를 활용하여 자동 확장과 고가용성을 제공합니다.
    	- 장점2 : 다양한 클라우드 환경에서 일관된 실행 환경을 제공합니다.
    	- 단점1 : Kubernetes 클러스터를 설정하고 관리하는 데 추가적인 노력이 필요합니다.
    	- 단점2 : 초기 설정 및 관리에 대한 학습 곡선이 있을 수 있습니다.
  • Cloud Agent : CloudAgent는 클라우드 서비스에서 Prefect Flow를 실행하는 데 사용됩니다. 예를 들어, AWS, Google Cloud Platform, Microsoft Azure 등의 클라우드 환경에서 Prefect Flow를 실행할 수 있습니다. Prefect Cloud와 같은 관리형 서비스에서도 CloudAgent를 사용하여 Flow를 실행할 수 있습니다.

    	- 장점1 : 클라우드 서비스에서 제공하는 관리형 서비스를 활용하여 간편하게 실행할 수 있습니다.
    	- 장점2 : 클라우드 제공 업체의 확장성 및 신뢰성을 활용할 수 있습니다.
    	- 단점1 : 클라우드 서비스 사용에 따른 비용이 발생할 수 있습니다.
    	- 단점2 : 클라우드 공급자에 종속적일 수 있습니다.
  • Custom Agent : CustomAgent는 사용자가 직접 구현한 에이전트를 나타냅니다. 사용자가 특정 환경에 맞게 에이전트를 구현하고 Prefect와 통합하여 사용할 수 있습니다.

    	- 장점1 : 사용자가 자체적으로 환경을 구성하고 제어할 수 있습니다.
    	- 장점2 : 특정 환경이나 요구 사항에 맞게 커스터마이징할 수 있습니다.
    	- 단점1 : 사용자가 직접 에이전트를 구현해야 하므로 추가적인 개발 및 유지 관리 노력이 필요합니다.
    	- 단점2 : Prefect의 공식 지원 및 문서화가 부족할 수 있습니다.

6. Worker

Flow를 실행하는데 사용되는 실행자를 뜻합니다. 스케줄러와 함께 작동하여 정의된 일정에 따라서 Flow를 실행합니다. Agent와 함께 사용되어 Agent는 Worker를 조정하고 환경설정 하는데 사용됩니다.

즉, Agent안에서 Worker가 Flow의 실행자이며 Agent는 이 Worker를 조정하며 환경설정합니다.


Data Pipeline View Example

Prefect Big Picture

profile
문제를해결하는도구로서의"데이터"

0개의 댓글

관련 채용 정보