AWS Glue에서 Python 셸 작업 - AWS Glue

AWS Glue에서 Python 셸 작업

AWS Glue에서 Python 셸 작업을 사용하여 Python 스크립트를 셸로 실행할 수 있습니다. Python 셸 작업을 사용하면 Python 2.7, Python 3.6 또는 Python 3.9와 호환되는 스크립트를 실행할 수 있습니다.

Python 셸 작업에는 작업 북마크를 사용할 수 없습니다.

Python 셸 작업 출력에 대한 Amazon CloudWatch Logs 그룹은 /aws-glue/python-jobs/output입니다. 오류의 경우 로그 그룹 /aws-glue/python-jobs/errors를 확인합니다.

Python 셸 작업에 대한 작업 속성 정의

이 섹션에서는 AWS Glue Studio에서 또는 AWS CLI를 사용하여 작업 속성을 정의하는 것을 설명합니다.

AWS Glue Studio

AWS Glue Studio에서 Python 셸 작업을 정의할 때 다음 속성 중 일부를 입력합니다.

IAM 역할

사용된 리소스에 대한 권한 부여에 사용되는 AWS Identity and Access Management(IAM) 역할을 지정하여 작업을 실행하고 데이터 스토어에 액세스합니다. AWS Glue 작업을 실행하는 권한에 대한 자세한 내용은 AWS Glue 리소스에 대한 액세스 권한 관리 단원을 참조하십시오.

유형

Python shell(Python 셸)을 선택하여 pythonshell 작업 명령으로 Python 스크립트를 실행합니다.

Python 버전

Python 버전을 선택합니다. 기본값은 Python 3.6입니다. 유효한 버전은 Python 3.6과 Python 3.9입니다.

공통 분석 라이브러리 로드(권장)

Python 셸에 Python 3.9용 공통 라이브러리를 포함하려면 이 옵션을 선택합니다.

라이브러리가 사용자 지정 라이브러리이거나 사전 설치된 라이브러리와 충돌하는 경우 공통 라이브러리를 설치하지 않을 수 있습니다. 하지만 공통 라이브러리 외에 추가 라이브러리를 설치할 수 있습니다.

이 옵션을 선택하는 경우 library-set 옵션이 analytics로 설정됩니다. 이 옵션을 선택 취소하는 경우 library-set 옵션이 none으로 설정됩니다.

스크립트 파일 이름 및 스크립트 경로

스크립트의 코드는 작업 절차 논리를 정의합니다. Amazon Simple Storage Service(Amazon S3)에서 스크립트 이름과 위치를 제공합니다. 경로의 스크립트 디렉터리와 동일한 이름의 파일이 없다는 것을 확인합니다. 스크립트 사용에 대한 자세한 내용은 AWS Glue 콘솔에서 Spark 스크립트 편집 단원을 참조하십시오.

Script

스크립트의 코드는 작업 절차 논리를 정의합니다. Python 3.6 또는 Python 3.9에서 스크립트를 코딩할 수 있습니다. AWS Glue Studio에서 스크립트를 편집할 수 있습니다.

데이터 처리 단위

이 작업이 실행될 때 할당할 수 있는 AWS Glue 데이터 처리 단위(DPU)의 최대 수입니다. DPU는 4 vCPU의 컴퓨팅 파워와 16GB 메모리로 구성된 프로세싱 파워의 상대적 측정값입니다. 자세한 내용은 AWS Glue 요금을 참조하세요.

값을 0.0625 또는 1로 설정할 수 있습니다. 기본값은 0.0625입니다.

CLI

다음 예와 같이 AWS CLI를 사용하여 [Python 셸(Python shell)] 작업을 생성할 수도 있습니다.

aws glue create-job --name python-job-cli --role Glue_DefaultRole --command '{"Name" : "pythonshell", "PythonVersion": "3.9", "ScriptLocation" : "s3://aws-glue-scripts-123456789012-us-east-1/Admin/python-job-cli.py"}' --max-capacity 0.0625

AWS CLI를 사용하여 생성된 작업은 Python 3으로 기본 설정됩니다. 유효한 파이썬 버전은 3(3.6에 해당)과 3.9입니다. Python 3.6을 지정하려면 이 튜플을 --command 파라미터 "PythonVersion":"3"에 추가합니다.

Python 3.9를 지정하려면 이 튜플을 --command 파라미터 "PythonVersion":"3.9"에 추가합니다.

Python 셸 작업에서 사용하는 최대 용량을 설정하려면 --max-capacity 파라미터를 제공합니다. Python 셸 작업에서 --allocated-capacity 파라미터는 사용할 수 없습니다.

Python 셸 작업에 지원되는 라이브러리

Python 3.9를 사용하는 Python 셸에서 필요에 따라 사전 패키징된 라이브러리 세트를 사용하도록 라이브러리 세트를 선택할 수 있습니다. library-set 옵션을 사용하여 라이브러리 세트를 선택할 수 있습니다. 유효한 값은 analyticsnone입니다.

Python 셸 작업의 실행 환경은 다음 라이브러리를 지원합니다.

Python 버전 Python 3.6 Python 3.9
라이브러리 세트 해당 사항 없음 분석 none
avro 1.11.0
awscli 116.242 1.23.5 1.23.5
awswrangler 2.15.1
botocore 1.12.232 1.23.5 1.23.5
boto3 1.9.203 1.22.5
elasticsearch 8.2.0
numpy 1.16.2 1.22.3
pandas 0.24.2 1.4.2
psycopg2 2.9.3
pyathena 2.5.3
PyGreSQL 5.0.6
PyMySQL 1.0.2
pyodbc 4.0.32
pyorc 0.6.0
redshift-connector 2.0.907
요청 건 2.22.0 2.27.1
Scikit-learn 0.20.3 1.0.2
scipy 1.2.1 1.8.0
SQLAlchemy 1.4.36
s3fs 2022.3.0

NumPy 라이브러리는 공학용 컴퓨팅의 Python 셸 작업에서 사용할 수 있습니다. 자세한 내용은 NumPy를 참조하십시오. 다음 예제는 Python 셸 작업에 사용할 수 있는 NumPy 스크립트를 보여줍니다. 이 스크립트는 "Hello world" 및 몇 가지 수학적 계산 결과를 프린트합니다.

import numpy as np print("Hello world") a = np.array([20,30,40,50]) print(a) b = np.arange( 4 ) print(b) c = a-b print(c) d = b**2 print(d)

제한 사항

Python 라이브러리 패키징에 대한 다음 제한 사항에 유의하십시오.

  • .egg 파일 추가는 Python 3.9에서 지원되지 않습니다.

자체 Python 라이브러리 제공

PIP 사용

Python 3.9를 사용하는 Python 셸을 사용하면 작업 수준에서 추가 Python 모듈 또는 다른 버전을 제공할 수도 있습니다. --additional-python-modules 옵션을 쉼표로 구분된 Python 모듈 목록과 함께 사용하여 새 모듈을 추가하거나 기존 모듈의 버전을 변경할 수 있습니다.

예를 들어 새 scikit-learn 모듈을 업데이트하거나 추가하려면 키/값 "--additional-python-modules", "scikit-learn==0.21.3"을 사용합니다.

또한 --additional-python-modules 옵션 내에서 Python 휠 모듈에 대한 Amazon S3 경로를 지정할 수 있습니다. 예:

--additional-python-modules s3://aws-glue-native-spark/tests/j4.2/fbprophet-0.6-py3-none-any.whl,scikit-learn==0.21.3

AWS Glue는 Python 패키지 설치 프로그램(pip3)을 사용하여 추가 모듈을 설치합니다. 모듈 설치를 위해 python-modules-installer-option으로 지정된 추가 옵션을 pip3에 전달할 수 있습니다. pip3의 비호환성 또는 제한 사항이 적용됩니다.

참고

향후 발생할 수 있는 비호환성을 방지하려면 Python 3.9용으로 빌드된 라이브러리를 사용하는 것이 좋습니다.

Egg 또는 Whl 파일 사용

이미 하나 이상의 .egg 또는 .whl 파일로 패키징된 하나 이상의 Python 라이브러리가 있을 수 있습니다. 그렇다면 다음 예와 같이 AWS Command Line Interface(AWS CLI)를 사용하여 "—extra-py-files" 플래그 하에서 작업에 이를 지정할 수 있습니다.

aws glue create-job --name python-redshift-test-cli --role role --command '{"Name" : "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' --connections Connections=connection-name --default-arguments '{"--extra-py-files" : ["s3://MyBucket/python/library/redshift_module-0.1-py2.7.egg", "s3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl"]}'

Python 라이브러리에서 .egg 파일 또는 .whl 파일을 생성하는 방법을 모르는 경우 다음 단계를 따르십시오. 이 예제는 macOS, Linux 및 Windows Subsystem for Linux(WSL)에 적용됩니다.

Python .egg 또는 .whl 파일을 만들려면
  1. Virtual Private Cloud(VPC)에서 Amazon Redshift 클러스터를 생성하고 일부 데이터를 테이블에 추가합니다.

  2. 클러스터를 만드는 데 사용한 VPC-SecurityGroup-Subnet 조합에 대해 AWS Glue 연결을 만듭니다. 연결이 성공인지 테스트합니다.

  3. redshift_example이라는 디렉터리를 생성하고 setup.py라는 파일을 생성합니다. setup.py에 다음 코드를 붙여넣습니다.

    from setuptools import setup setup( name="redshift_module", version="0.1", packages=['redshift_module'] )
  4. redshift_example 디렉터리에 redshift_module 디렉터리를 만듭니다. redshift_module 디렉터리에서 __init__.pypygresql_redshift_common.py라는 파일을 만듭니다.

  5. __init__.py 파일은 비워둡니다. pygresql_redshift_common.py에 다음 코드를 붙여넣습니다. port, db_name, userpassword_for_user를 Amazon Redshift 클러스터에 해당하는 세부 정보로 바꿉니다. table_name을 Amazon Redshift의 테이블 이름으로 바꿉니다.

    import pg def get_connection(host): rs_conn_string = "host=%s port=%s dbname=%s user=%s password=%s" % ( host, port, db_name, user, password_for_user) rs_conn = pg.connect(dbname=rs_conn_string) rs_conn.query("set statement_timeout = 1200000") return rs_conn def query(con): statement = "Select * from table_name;" res = con.query(statement) return res
  6. 아직 이동하지 않은 경우 redshift_example 디렉터리로 변경합니다.

  7. 다음 중 하나를 수행하세요.

    • .egg 파일을 생성하려면 다음 명령을 실행합니다.

      python setup.py bdist_egg
    • .whl 파일을 생성하려면 다음 명령을 실행합니다.

      python setup.py bdist_wheel
  8. 이전 명령에 필요한 종속성을 설치합니다.

  9. 해당 명령은 dist 디렉터리에서 파일을 생성합니다.

    • egg 파일을 만든 경우, 이름은 redshift_module-0.1-py2.7.egg입니다.

    • wheel 파일을 만든 경우, 이름은 redshift_module-0.1-py2.7-none-any.whl입니다.

    이 파일을 Amazon S3에 업로드합니다.

    이 예에서 업로드된 파일 경로는 s3://MyBucket/python/library/redshift_module-0.1-py2.7.egg 또는 s3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl입니다.

  10. AWS Glue 작업의 스크립트로 사용할 Python 파일을 생성하고 다음 코드를 파일에 추가합니다.

    from redshift_module import pygresql_redshift_common as rs_common con1 = rs_common.get_connection(redshift_endpoint) res = rs_common.query(con1) print "Rows in the table cities are: " print res
  11. 이전 파일을 Amazon S3에 업로드합니다. 이 예에서 업로드된 파일 경로는 s3://MyBucket/python/library/redshift_test.py입니다.

  12. 이 스크립트를 사용하여 Python 셸 작업을 생성합니다. AWS Glue 콘솔의 [작업 속성(Job properties)] 페이지에서 Python 라이브러리 경로(Python library path) 상자에 .egg/.whl 파일의 경로를 지정합니다. .egg/.whl 파일이 여러 개 있으면 이 상자에 쉼표로 구분된 목록을 제공합니다.

    .egg 파일을 수정하거나 이름을 바꿀 때 파일 이름은 “python setup.py bdist_egg” 명령으로 생성된 기본 이름을 사용하거나 Python 모듈 명명 규칙을 준수해야 합니다. 자세한 내용은 Python 코드 스타일 가이드를 참조하십시오.

    AWS CLI를 사용하여 다음 예와 같이 명령으로 작업을 생성하십시오.

    aws glue create-job --name python-redshift-test-cli --role Role --command '{"Name" : "pythonshell", "ScriptLocation" : "s3://MyBucket/python/library/redshift_test.py"}' --connections Connections="connection-name" --default-arguments '{"--extra-py-files" : ["s3://MyBucket/python/library/redshift_module-0.1-py2.7.egg", "s3://MyBucket/python/library/redshift_module-0.1-py2.7-none-any.whl"]}'

    작업이 실행되면 스크립트는 Amazon Redshift 클러스터의 table_name 테이블에 생성된 행을 인쇄합니다.