Dataproc Python 환경 구성

Dataproc의 PySpark 작업은 클러스터에서 Python 인터프리터에 의해 실행됩니다. 작업 코드는 런타임 시 Python 인터프리터 버전 및 종속 항목과 호환되어야 합니다.

인터프리터 버전 및 모듈 확인

다음 check_python_env.py 샘플 프로그램은 작업을 실행하는 Linux 사용자, Python 인터프리터, 사용 가능한 모듈을 확인합니다.

import getpass
import sys
import imp

print('This job is running as "{}".'.format(getpass.getuser()))
print(sys.executable, sys.version_info)
for package in sys.argv[1:]:
  print(imp.find_module(package))

프로그램 실행

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    -- pandas scipy

샘플 출력

This job is running as "root".
('/usr/bin/python', sys.version_info(major=2, minor=7, micro=13, releaselevel='final', serial=0))
(None, '/usr/local/lib/python2.7/dist-packages/pandas', ('', '', 5))
(None, '/usr/local/lib/python2.7/dist-packages/scipy', ('', '', 5))

Dataproc 이미지 Python 환경

다음 섹션에서는 다양한 Dataproc 이미지 버전 클러스터의 Python 환경을 설명합니다.

Dataproc 이미지 버전 1.5

Miniconda3는 Dataproc 1.5 클러스터에 설치됩니다. 기본 인터프리터는 각각 /opt/conda/miniconda3/bin/python3.7의 VM 인스턴스에 있는 Python 3.7입니다. Python 2.7은 /usr/bin/python2.7에서 사용할 수도 있습니다.

base 환경에 condapip 패키지를 설치하거나, conda 관련 클러스터 속성을 사용하여 클러스터에 자체 conda 환경을 설정할 수 있습니다.

1.5 클러스터에서 Python 2.7을 기본 인터프리터로 사용하려면 클러스터를 만들 때 Anaconda 선택적 구성요소를 사용하지 마세요. 대신 Conda 초기화 작업을 사용하여 Miniconda2를 설치하고 Conda 관련 클러스터 속성을 사용하여 base 환경에 condapip 패키지를 설치하거나 클러스터에 자체 conda 환경을 설정합니다.

예시

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=1.5 \
    --region=${REGION} \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --initialization-actions=gs://goog-dataproc-initialization-actions-${REGION}/conda/bootstrap-conda.sh \
    --properties=^#^dataproc:conda.packages='pytorch==1.0.1,visions==0.7.1'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

Dataproc 이미지 버전 2.x

conda는 Dataproc 2.x 클러스터에 설치됩니다. 기본 Python3 인터프리터는 /opt/conda/default/bin 아래의 VM 인스턴스에 있습니다. 다음 페이지에는 Dataproc 이미지 버전에 포함된 Python 버전이 나와 있습니다.

OS의 기본이 아닌 Python 인터프리터는 /usr/bin/ 아래에서 사용할 수 있습니다.

base 환경에 condapip 패키지를 설치하거나, conda 관련 클러스터 속성을 사용하여 클러스터에 자체 conda 환경을 설정할 수 있습니다.

예시

REGION=region
gcloud dataproc clusters create my-cluster \
    --image-version=2.0 \
    --region=${REGION} \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.5.0'

참고: Anaconda는 Dataproc 2.0 클러스터에서 사용할 수 없습니다.

작업의 Python 인터프리터 선택

여러 Python 인터프리터가 클러스터에 설치되어 있으면 시스템이 /etc/profile.d/effective-python.sh를 실행합니다. 이는 PYSPARK_PYTHON 환경 변수를 내보내서 PySpark 작업에 대한 기본 Python 인터프리터를 선택합니다. PySpark 작업에 기본값이 아닌 Python 인터프리터가 필요한 경우 클러스터에 작업을 제출할 때 spark.pyspark.pythonspark.pyspark.driver.python 속성을 필요한 Python 버전 번호(예: 'python2.7' 또는 'python3.6')로 설정합니다.

예시

REGION=region
gcloud dataproc jobs submit pyspark check_python_env.py \
    --cluster=my-cluster \
    --region=${REGION} \
    --properties="spark.pyspark.python=python2.7,spark.pyspark.driver.python=python2.7"

sudo를 사용한 Python

SSH를 통해 Miniconda 또는 Anaconda가 설치된 클러스터 노드에 연결하는 경우, sudo python --version을 실행하면 표시된 Python 버전이 python --version에 표시된 버전과 다를 수 있습니다. sudo는 기본 시스템 Python /usr/bin/python을 사용하고, /etc/profile.d/effective-python.sh를 실행하여 Python 환경을 초기화하지 않으므로 이 버전 차이가 발생할 수 있습니다. sudo 사용 시 일관성 있는 환경을 제공하려면 /etc/profile.d/effective-python.sh에 설정된 Python 경로를 찾은 다음 env 명령어를 실행하여 PATH를 이 Python 경로에 설정합니다. 다음은 1.5 클러스터의 예시입니다.

sudo env PATH=/opt/conda/default/bin:${PATH} python --version

conda 관련 클러스터 속성을 사용하여 클러스터를 만드는 동안 conda 환경을 맞춤설정할 수 있습니다.

Dataproc 클러스터를 만들 때 conda 환경을 맞춤설정할 수 있는 상호 배타적인 두 가지 방법이 있습니다.

  1. dataproc:conda.env.config.uri 클러스터 속성을 사용하여 클러스터에 새 conda 환경을 만들고 활성화합니다. 또는

  2. dataproc:conda.packagesdataproc:pip.packages 클러스터 속성을 사용하여 클러스터의 conda base 환경에 condapip 패키지를 각각 추가합니다.

  • dataproc:conda.env.config.uri: Cloud Storage에 있는 conda 환경 YAML 구성 파일의 절대 경로입니다. 이 파일은 클러스터에 새 conda 환경을 만들고 활성화하는 데 사용됩니다.

    예:

    1. conda environment.yaml 구성 파일을 가져오거나 만듭니다. 아래와 같이 수동으로 파일을 생성하거나, 기존 파일을 사용하거나, environment.yaml 파일에 기존 conda 환경 내보내기할 수 있습니다.

      conda env export --name=env-name > environment.yaml
      

    2. 구성 파일을 Cloud Storage 버킷에 복사합니다.

      gcloud storage cp environment.yaml gs://bucket-name/environment.yaml
      

    3. 클러스터를 만들고 Cloud Storage의 환경 구성 파일을 가리킵니다.

      REGION=region
      gcloud dataproc clusters create cluster-name \
          --region=${REGION} \
          --properties='dataproc:conda.env.config.uri=gs://bucket-name/environment.yaml' \
          ... other flags ...
      

  • dataproc:conda.packages: 기본 환경에 설치될 특정 버전의 conda 패키지 목록으로 pkg1==v1,pkg2==v2... 형식입니다. conda가 기본 환경의 기존 패키지와 충돌하는 문제를 해결하지 못하면 충돌하는 패키지는 설치되지 않습니다.

    참고:

    • dataproc:conda.packagesdataproc:pip.packages 클러스터 속성은 dataproc:conda.env.config.uri 클러스터 속성과 함께 사용할 수 없습니다.

    • 여러 패키지를 쉼표로 구분하여 지정할 때는 대체 구분 기호 문자를 지정해야 합니다(클러스터 속성 형식 참조). 다음 예시에서는 쉼표로 구분된 여러 패키지 이름을 dataproc:conda.packages 속성에 전달하는 구분 기호 문자로 '#'를 지정합니다.

    예:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:conda.packages=pytorch==1.7.1,coverage==5.5' \
    ... other flags ...

  • dataproc:pip.packages: 기본 환경에 설치될 특정 버전의 pip 패키지 목록으로 pkg1==v1,pkg2==v2... 형식입니다. pip는 필요한 경우에만 기존 종속 항목을 업그레이드합니다. 충돌로 인해 환경이 일관되지 않을 수 있습니다.

    참고:

    • dataproc:pip.packagesdataproc:conda.packages 클러스터 속성은 dataproc:conda.env.config.uri 클러스터 속성과 함께 사용할 수 없습니다.

    • 여러 패키지를 쉼표로 구분하여 지정할 때는 대체 구분 기호 문자를 지정해야 합니다(클러스터 속성 형식 참조). 다음 예시에서는 쉼표로 구분된 여러 패키지 이름을 dataproc:pip.packages 속성에 전달하는 구분 기호 문자로 '#'를 지정합니다.

    예:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --properties='^#^dataproc:pip.packages=tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...
  • 클러스터를 만들 때 dataproc:conda.packagesdataproc:pip.packages를 모두 사용할 수 있습니다.

    예:

REGION=region
gcloud dataproc clusters create cluster-name \
    --region=${REGION} \
    --image-version=1.5 \
    --metadata='MINICONDA_VARIANT=2' \
    --metadata='MINICONDA_VERSION=latest' \
    --properties=^#^dataproc:conda.packages='pytorch==1.7.1,coverage==5.5'#dataproc:pip.packages='tokenizers==0.10.1,datasets==1.4.1' \
    ... other flags ...