주요 컨텐츠로 이동

분산 컴퓨팅 환경에서 애플리케이션의 환경을 관리하는 것은 어려울 수 있습니다. 모든 노드가 코드를 실행하는 데 필요한 환경을 갖추고 있는지 확인하고 사용자 코드의 실제 위치를 파악하는 것은 복잡한 작업입니다. 아파치 스파크는 Conda, venv, PEX와 같은 다양한 방법을 제공하며, 파이스파크에서 파이썬 종속성을 관리하는 방법과 --jars, --packages와 같은 제출 스크립트 옵션, spark.jars.*와 같은 스파크 구성도 참조하세요. 이러한 옵션을 통해 사용자는 클러스터에서 종속성을 원활하게 처리할 수 있습니다.

그러나 현재 Apache Spark에서 종속성 관리를 지원하는 데는 한계가 있습니다. 종속성은 정적으로만 추가할 수 있으며 런타임 중에는 변경할 수 없습니다. 즉, 드라이버를 시작하기 전에 항상 종속성을 설정해야 합니다. 이 문제를 해결하기 위해 Apache Spark 3.5.0부터 Spark Connect에 세션 기반 종속성 관리 지원을 도입했습니다. 이 새로운 기능을 사용하면 런타임 중에 파이썬 종속성을 동적으로 업데이트할 수 있습니다. 이 블로그 게시물에서는 Apache Spark에서 Spark Connect를 사용하여 런타임 중에 Python 종속성을 제어하는 포괄적인 접근 방식에 대해 설명합니다.

스파크 커넥트의 세션 기반 아티팩트

Spark Context
One environment for each Spark Context

스파크 커넥트 없이 스파크 드라이버를 사용하는 경우, 스파크 컨텍스트는 아카이브(사용자 환경)를 추가하고 나중에 노드에 자동으로 압축을 풀어서 모든 노드가 작업을 실행하는 데 필요한 종속성을 갖도록 보장합니다. 이 기능은 분산 컴퓨팅 환경에서 종속성 관리를 간소화하여 환경 오염의 위험을 최소화하고 모든 노드가 의도한 실행 환경을 갖출 수 있도록 보장합니다. 하지만 이 기능은 Spark 컨텍스트 및 드라이버를 시작하기 전에 정적으로 한 번만 설정할 수 있어 유연성이 제한됩니다.

Spark Session
Separate environment for each Spark Session

Spark Connect를 사용하면 연결 서버의 수명이 길어지고 각각 고유한 Python 버전, 종속성 및 환경을 가진 여러 세션과 클라이언트가 존재할 수 있기 때문에 종속성 관리가 더욱 복잡해집니다. 제안된 해결책은 세션 기반 아카이브를 도입하는 것입니다. 이 접근 방식에서는 각 세션마다 모든 관련 Python 파일과 아카이브가 저장되는 전용 디렉터리가 있습니다. Python 워커가 시작되면 현재 작업 디렉터리가 이 전용 디렉터리로 설정됩니다. 이렇게 하면 각 세션이 특정 종속성 및 환경 집합에 액세스할 수 있으므로 잠재적인 충돌을 효과적으로 완화할 수 있습니다.

Conda 사용

Conda는 많은 사람들이 사용하는 매우 인기 있는 Python 패키지 관리 시스템입니다. PySpark 사용자는 Conda 환경을 직접 활용하여 타사 Python 패키지를 패키징할 수 있습니다. 이는 재배치 가능한 Conda 환경을 생성하도록 설계된 라이브러리인 conda-pack을 활용하여 달성할 수 있습니다.

다음 예제에서는 세션 기반 종속성 관리를 위해 나중에 드라이버와 실행기 모두에서 패키징된 Conda 환경을 생성하는 방법을 보여줍니다. 이 환경은 아카이브 파일에 패키징되어 Python 인터프리터와 모든 관련 종속성을 캡처합니다.

import conda_pack
import os

# Pack the current environment ('pyspark_conda_env') to 'pyspark_conda_env.tar.gz'.
# Or you can run 'conda pack' in your shell.

conda_pack.pack()
spark.addArtifact(
    f"{os.environ.get('CONDA_DEFAULT_ENV')}.tar.gz#environment",
    archive=True)
spark.conf.set(
    "spark.sql.execution.pyspark.python", "environment/bin/python")

# From now on, Python workers on executors use the `pyspark_conda_env` Conda 
# environment.

PEX 사용하기

스파크 커넥트는 파이썬 패키지를 함께 번들로 묶는 PEX 사용을 지원합니다. PEX는 독립된 Python 환경을 생성하는 도구입니다. Conda 또는 virtualenv와 유사하게 작동하지만 .pex 파일은 그 자체로 실행 파일입니다.

다음 예제에서는 드라이버와 실행기 모두 각 세션에서 사용할 수 있도록 .pex 파일을 생성합니다. 이 파일은 pex 명령을 통해 제공된 지정된 Python 종속성을 통합합니다.

# Pack the current env to pyspark_pex_env.pex'.
pex $(pip freeze) -o pyspark_pex_env.pex

.pex 파일을 생성한 후에는 이제 세션 기반 환경으로 전송하여 세션에서 격리된 .pex 파일을 사용하도록 할 수 있습니다.

spark.addArtifact("pyspark_pex_env.pex",file=True)
spark.conf.set(
    "spark.sql.execution.pyspark.python", "pyspark_pex.env.pex")

# From now on, Python workers on executors use the `pyspark_conda_env` venv environment.

Virtualenv 사용하기

Virtualenv는 격리된 파이썬 환경을 생성하기 위한 파이썬 도구입니다. 파이썬 3.3.0부터, 그 기능의 일부가 venv 모듈 아래의 표준 라이브러리로 파이썬에 통합되었습니다. venv 모듈은 conda-pack과 유사한 방식으로 venv-pack을 사용하여 Python 종속 요소에 활용할 수 있습니다. 아래 예시는 venv를 사용한 세션 기반 종속성 관리를 보여줍니다.

import venv_pack
import os

# Pack the current venv to 'pyspark_conda_env.tar.gz'.
# Or you can run 'venv-pack' in your shell.

venv_pack.pack(output='pyspark_venv.tar.gz')
spark.addArtifact(
    "pyspark_venv.tar.gz#environment",
    archive=True)
spark.conf.set(
    "spark.sql.execution.pyspark.python", "environment/bin/python")

# From now on, Python workers on executors use your venv environment.

결론

아파치 스파크는 정적 파이썬 종속성 관리의 한계를 극복하기 위해 아파치 스파크 3.5.0에서 런타임 중에 스파크 커넥트로 파이썬 종속성을 동적으로 배포하고 관리할 수 있도록 Conda, virtualenv, and PEX 등 다양한 옵션을 제공합니다.

데이터브릭스 노트북의 경우, 이 문제를 해결하기 위해 Python 종속성을 위한 사용자 친화적인 인터페이스를 갖춘 보다 우아한 솔루션을 제공합니다. 또한, 사용자는 파이썬 종속성 관리를 위해 pip와 Conda를 직접 활용할 수 있습니다. 지금 바로 데이터브릭스 무료 평가판을 통해 이러한 기능을 활용해 보세요.

Databricks 무료로 시작하기

관련 포스트

모든 엔지니어링 블로그 포스트 보기