개발 환경 구성

Q·2023년 4월 18일
0

 인프라 구성

 Server 구성

ServerMasterSlave01Slave02Slave03
OSCentos7Centos7Centos7Centos7
Disk Size1000G1000G1000G1000G
Memory32G16G16G16G
Processors12121212

 플랫폼 버전

 Centos7에 python3.7 및 pip 설치

Python 및 pip 설치


 내부 모듈 생성

실행서버 : Master

내부 모듈은 zip 파일로 만들어서 사용할 것이다

**폴더 구조**

Credit /
|-- 스크립트 실행 Main.py
|-- packages/ (내부 패키지)
|   |-- __init__.py
|   |-- module1.py
|   |-- module2.py
|   |-- ...
|-- venv/ (외부 패키지)
|   |-- pip installed modules

 내부 모듈 만드는 방법

  1. 위의 폴더 구조에서 packages(내부 패키지)를 zip으로 만든다
zip -r packages.zip packages 

 외부 패키지 생성

실행서버 : Master

외부 패키지는 Virtualenv로 만들어서 사용할 것이다

 외부 패키지 만드는 방법

  1. 명령어로 나만의 가상 환경을 구성한다.
python -m venv /설치할 경로/venv
  1. 가상환경 활성화
source /설치할 경로/venv/bin/activate
  1. pip로 나만의 가상환경에 패키지 설치
pip install pyarrow pandas venv-pack(이건 무조건 설치)
  1. pip로 설치한 venv-pack 으로 나만의 가상환경을 tar.gz로 압축
venv-pack -o venv.tar.gz

 spark-submit 제출

spark-submit \
--master yarn \
--deploy-mode cluster \ 
--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0 \
--py-files packages.zip \
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./venv/bin/python \
--conf spark.executorEnv.PYSPARK_PYTHON=./venv/bin/python \
--archives venv.tar.gz#venv Credit/Main.py
  1. -master yarn: Spark 애플리케이션의 마스터 URL을 설정, 이 옵션은 YARN 클러스터 관리자를 사용하여 작업을 실행하도록 지정합니다.
  2. -deploy-mode cluster: 애플리케이션의 배포 모드를 설정, cluster 모드는 드라이버 프로그램이 클러스터의 워커 노드 중 하나에서 실행되도록 합니다.
  3. -packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.0: 애플리케이션에 필요한 외부 라이브러리를 추가, 이 경우, Spark SQL Kafka 커넥터 라이브러리가 추가됩니다.
  4. -py-files packages.zip: Python 파일 또는 모듈의 ZIP 아카이브를 추가, 이 옵션을 사용하면 파이썬 코드와 함께 필요한 라이브러리를 클러스터에 배포할 수 있습니다. (여기서는 내부 모듈만 배포)
  5. -conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=./venv/bin/python: YARN 애플리케이션 마스터의 환경 변수를 설정, 이 경우, PYSPARK_PYTHON 환경 변수를 애플리케이션 마스터가 사용할 파이썬 인터프리터로 설정합니다.(아래 심볼릭 링크 지정으로 경로를 현재경로인 ./ 로 시작)
  6. -conf spark.executorEnv.PYSPARK_PYTHON=./venv/bin/python: Spark 실행자의 환경 변수를 설정, 이 경우, 실행자가 사용할 파이썬 인터프리터를 설정합니다.(아래 심볼릭 링크 지정으로 경로를 현재경로인 ./ 로 시작)
  7. -archives venv.tar.gz#venv: 애플리케이션에 필요한 압축된 아카이브를 추가하고, 심볼릭 링크를 생성, 이 경우, Python 가상 환경이 포함된 venv.tar.gz 파일이 추가되고, venv라는 심볼릭 링크가 생성됩니다. 이렇게 하면 애플리케이션에 필요한 라이브러리와 함께 가상 환경을 클러스터에 배포할 수 있으며, 심볼릭 링크를 통해 쉽게 참조할 수 있습니다.

✅ 트러블 슈팅

 외부 패키지를 ZIP으로 보냈을때 에러

시행 착오

  • 책이나 chatgpt 어디를 찾아봐도 외부 패키지를 Cluster모두에 적용시킬때 ZIP파일로 만든 뒤 py-files로 적용시키라고 한다.
  • 하지만 외부 패키지를 위한 폴더를 생성하고 pip install -t target folder 하여 target folder 을 ZIP파일로 만들어 spark-submit을 생성했을때 계속 Job이 실패하는 상황이 벌어졌다.
  • 분명 pandas나 numpy를 다 설치하고 spark-submit을 했는데 slave쪽에 로그에는 No moduled name pandasNo moduled name numpy 가 보였다.
  • 내부 모듈은 전체 클러스터에 잘 전달되어 실행되는거 같은데 외부 패키지가 적용이 안되는 것이었다.
  • 정말 별짓을 다해봤다. hdfs에 ZIP을 넣어서 그곳에 있는 ZIP 파일을 참조해서 실행 시키게도 해보았고 환경변수라던지 왠만한 짓은 다해본것 같았다. (하지만 안댐 ㅠㅠ)
  • 마지막으로 검색이란 검색을 다해보다가 databricks에서 누가 올린 블로그 글을 보았고 마지막으로 가상환경으로 만들어서 Cluster에 적용시켰을때 잘 되는것을 보고 그대로 뻗어버렸다. (새벽 5시 30)

원인 분석 및 해결방안

  • pyarrow와 NumPy와 같은 라이브러리는 C와 C++ 라이브러리에 의존하는 파이썬 라이브러리이다. 이러한 라이브러리들은 고성능의 계산이나 데이터 처리를 위해 내부적으로 C와 C++로 작성된 코드를 사용한다. 이로 인해, 이러한 라이브러리를 사용하는 Spark 애플리케이션을 실행하려면 먼저 해당 C, C++ 라이브러리와 함께 파이썬 라이브러리를 설치해야 한다.
  • 앞서 언급한 --py-files 옵션과 spark.submit.pyFiles 설정은 순수 파이썬 라이브러리를 추가하는데 유용하지만, C와 C++ 라이브러리에 의존하는 경우에는 적절하지 않을 수 있다. 이는 --py-files와 spark.submit.pyFiles 설정이 wheel 파일이나 C, C++ 라이브러리를 설치하는데 필요한 지원을 제공하지 않기 때문이다.
  • 이러한 경우에는 다음과 같은 방법을 사용하여 라이브러리를 배포할 수 있다
    1. Python 가상 환경(virtualenv)를 사용하여 필요한 라이브러리를 포함하는 가상 환경을 생성한다. 이 가상 환경에는 pyarrow, NumPy 등의 라이브러리와 그들의 C, C++ 의존성이 포함된다.
    2. 가상 환경을 압축하여 (.zip, .tar.gz 등) Spark 애플리케이션과 함께 제출한다. 이때 -archives 옵션을 사용하여 압축된 가상 환경을 클러스터에 배포할 수 있다.
    3. Spark 애플리케이션의 드라이버와 실행자에 환경 변수를 설정하여 사용할 파이썬 인터프리터를 가상 환경의 파이썬 인터프리터로 지정한다. 이를 위해 -conf spark.yarn.appMasterEnv.PYSPARK_PYTHON-conf spark.executorEnv.PYSPARK_PYTHON 옵션을 사용한다.

✅ 참고 문서

How to Manage Python Dependencies in Spark

profile
Data Engineer

0개의 댓글