복붙노트

[HADOOP] Spark Executor 노드에 Python 의존성을 설치하는 가장 쉬운 방법은 무엇입니까?

HADOOP

Spark Executor 노드에 Python 의존성을 설치하는 가장 쉬운 방법은 무엇입니까?

개인 파일을 파이썬 스파크 프로그램과의 종속물로 보낼 수 있다는 것을 알고 있습니다. 하지만 본격적인 라이브러리 (예 : numpy)는 어떻게됩니까?

Spark은 제공된 패키지 관리자 (예 : pip)를 사용하여 라이브러리 의존성을 설치하는 방법이 있습니까? 또는 Spark 프로그램을 실행하기 전에 수동으로 수행해야합니까?

대답이 수동이면 많은 수의 분산 노드에서 라이브러리 (설치 경로, 버전 등)를 동기화하는 "모범 사례"접근법은 무엇입니까?

해결법

  1. ==============================

    1.실제로 그것을 실제로 시도한 결과, 필자가 주석으로 게시 한 링크가 당신이 의존성을 가지고 원하는 것을 정확하게 수행하지 못한다고 생각합니다. 당신이 상당히 합리적으로 요구하는 것은 스파크가 의존성을 설치하는 것과 관련하여 setuptools와 pip로 훌륭히 놀 수있는 방법입니다. 이것은 Spark에서 더 잘 지원되지 않는다는 내 마음을 불어 넣습니다. 써드 파티 종속성 문제는 범용 Python에서 주로 해결되지만 Spark에서는 수동 종속성 관리 또는 다른 것으로 돌아갈 것이라는 가정이 있습니다.

    실제로 그것을 실제로 시도한 결과, 필자가 주석으로 게시 한 링크가 당신이 의존성을 가지고 원하는 것을 정확하게 수행하지 못한다고 생각합니다. 당신이 상당히 합리적으로 요구하는 것은 스파크가 의존성을 설치하는 것과 관련하여 setuptools와 pip로 훌륭히 놀 수있는 방법입니다. 이것은 Spark에서 더 잘 지원되지 않는다는 내 마음을 불어 넣습니다. 써드 파티 종속성 문제는 범용 Python에서 주로 해결되지만 Spark에서는 수동 종속성 관리 또는 다른 것으로 돌아갈 것이라는 가정이 있습니다.

    나는 virtualenv에 기반을 둔 불완전하지만 기능적인 파이프 라인을 사용 해왔다. 기본 아이디어는

    물론이 프로세스를 관리하기 위해 일부 도우미 스크립트를 작성하는 것이 좋습니다. 다음은 내가 사용 해본 헬퍼 스크립트이다. 의심 할 여지없이 많이 개선 될 수있다.

    #!/usr/bin/env bash
    # helper script to fulfil Spark's python packaging requirements.
    # Installs everything in a designated virtualenv, then zips up the virtualenv for using as an the value of
    # supplied to --py-files argument of `pyspark` or `spark-submit`
    # First argument should be the top-level virtualenv
    # Second argument is the zipfile which will be created, and
    #   which you can subsequently supply as the --py-files argument to 
    #   spark-submit
    # Subsequent arguments are all the private packages you wish to install
    # If these are set up with setuptools, their dependencies will be installed
    
    VENV=$1; shift
    ZIPFILE=$1; shift
    PACKAGES=$*
    
    . $VENV/bin/activate
    for pkg in $PACKAGES; do
      pip install --upgrade $pkg
    done
    TMPZIP="$TMPDIR/$RANDOM.zip" # abs path. Use random number to avoid clashes with other processes
    ( cd "$VENV/lib/python2.7/site-packages" && zip -q -r $TMPZIP . )
    mv $TMPZIP $ZIPFILE
    

    스파크 작업을 제출하기 위해 실행되는 다른 간단한 래퍼 스크립트 모음이 있습니다. 이 스크립트를 먼저 프로세스의 일부로 호출하고 spark-submit을 실행할 때 (주석에 설명 된대로) 두 번째 인수 (zip 파일 이름)가 --py-files 인수로 전달되는지 확인하기 만하면됩니다. 나는 항상이 스크립트를 실행하므로 실수로 오래된 코드가 실행되는 일은 결코 없습니다. Spark 오버 헤드에 비해, 소규모 프로젝트의 경우 패키징 오버 헤드가 최소화됩니다.

    새로운 zip 파일을 생성 할 때 똑똑하고, 두 개의 zip 파일로 분할하고, 자주 변경되는 개인 패키지를 포함하고, 거의 변경되지 않는 종속성을 포함하는 하나의 파일을 분할하는 등 많은 개선이 이루어질 수 있습니다. 자주 재건된다. zip을 재구성하기 전에 파일 변경 사항을 확인하는 것이 더 똑똑 할 수 있습니다. 인수의 타당성을 확인하는 것도 좋은 생각입니다. 그러나 지금은 내 목적으로는 충분합니다.

    솔루션은 NumPy와 같은 대규모 의존성을 위해 특별히 설계된 것은 아닙니다. 또한 C 기반 확장을 빌드하고 드라이버 노드가 클러스터 노드와 다른 아키텍처를 사용하는 경우에는 작동하지 않습니다.

    NumPy (및 다른 많은 패키지)가 이미 포함되어 있으므로 다른 노드에서 Anaconda와 같은 Python 배포판을 실행하는 것이 좋습니다. NumPy와 다른 C 기반 확장을 얻는 더 좋은 방법 일 수 있습니다. 어쨌든 아나콘다가 우리가 원하는 버전의 PyPI 패키지를 제공한다고 항상 기대할 수는 없으며 또한 아나콘다를 넣을 수있는 스파크 환경을 제어 할 수 없을 수도 있습니다. 따라서이 가상 기반 기반 접근법은 여전히 ​​도움이됩니다.

  2. from https://stackoverflow.com/questions/29495435/easiest-way-to-install-python-dependencies-on-spark-executor-nodes by cc-by-sa and MIT license