

# 로컬로 AWS Glue 작업 스크립트 개발 및 테스트
<a name="aws-glue-programming-etl-libraries"></a>

Spark용 AWS Glue 작업 스크립트를 개발하고 테스트할 때 사용할 수 있는 옵션은 여러 가지가 있습니다.
+ AWS Glue Studio 콘솔
  + Visual editor(시각적 편집기)
  + 스크립트 에디터
  + AWS Glue Studio 노트북
+ 대화형 세션
  + Jupyter Notebook
+ 도커 이미지
  + 로컬 개발
  + 원격 개발

요구 사항에 따라 위의 옵션 중 하나를 선택할 수 있습니다.

코드가 없거나 코드 경험이 적은 경우 AWS Glue Studio 시각적 편집기를 선택하는 것이 좋습니다.

대화형 노트북 환경을 선호하는 경우 AWS Glue Studio 노트북을 선택하는 것이 좋습니다. 자세한 내용은 [AWS Glue Studio 및 AWS Glue를 사용하여 노트북 사용](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html)을 참조하세요. 로컬 환경을 직접 사용하려는 경우 대화형 세션을 선택하는 것이 좋습니다. 자세한 내용은 [AWS Glue를 사용하여 대화형 세션 사용](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)을 참조하세요.

로컬/원격 개발 환경을 선호하는 경우 Docker 이미지를 사용하는 것이 좋습니다. 이를 통해 AWS Glue 비용을 들이지 않고도 원하는 곳에서 AWS Glue for Spark 작업 스크립트를 개발하고 테스트할 수 있습니다.

Docker를 사용하지 않고 로컬 개발을 선호하는 경우 AWS Glue ETL 라이브러리 디렉터리를 사용하는 것이 좋습니다.

## AWS Glue Studio를 사용한 개발
<a name="develop-using-studio"></a>

AWS Glue Studio 시각적 편집기는 AWS Glue에서 추출, 전환, 적재(ETL) 작업을 쉽게 생성, 실행, 모니터링할 수 있게 해주는 그래픽 인터페이스입니다. 데이터 변환 워크플로를 시각적으로 구성하고 AWS Glu의 Apache Spark 기반 서버리스 ETL 엔진에서 원활하게 실행할 수 있습니다. 작업의 각 단계에서 스키마 및 데이터 결과를 검사할 수 있습니다. 자세한 내용은 [AWS Glue Studio User Guide](https://docs.aws.amazon.com/glue/latest/ug/what-is-glue-studio.html)를 참조하세요.

## 대화형 세션을 사용하여 개발
<a name="develop-using-interactive-sessions"></a>

대화형 세션을 사용하면 선택한 환경에서 애플리케이션을 구축하고 테스트할 수 있습니다. 자세한 내용은 [AWS Glue를 사용하여 대화형 세션 사용](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)을 참조하세요.

# Docker 이미지를 사용하여 로컬에서 AWS Glue 작업 개발 및 테스트
<a name="develop-local-docker-image"></a>

 프로덕션 준비 데이터 플랫폼의 경우 AWS Glue에 대한 개발 프로세스 및 CI/CD 파이프라인 작업이 핵심 주제입니다. 도커 컨테이너에서 AWS Glue 작업을 유연하게 개발하고 테스트할 수 있습니다. AWS Glue는 Docker Hub에서 도커 이미지를 호스팅하여 추가 유틸리티로 개발 환경을 설정합니다. AWS Glue ETL 라이브러리를 사용하여 선호하는 IDE, 노트북 또는 REPL을 사용할 수 있습니다. 이 주제에서는 Docker 이미지를 사용하여 Docker 컨테이너에서 AWS Glue 버전 5.0 작업을 개발하고 테스트하는 방법을 설명합니다.

## 사용 가능한 Docker 이미지
<a name="develop-local-available-docker-images-ecr"></a>

 [Amazon ECR](https://gallery.ecr.aws/glue/aws-glue-libs)의 AWS Glue에 대해 다음 Docker 이미지를 사용할 수 있습니다.
+  AWS Glue 버전 5.0: `public.ecr.aws/glue/aws-glue-libs:5` 
+ AWS Glue 버전 4.0의 경우: `public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01`
+ AWS Glue 버전 3.0의 경우: `public.ecr.aws/glue/aws-glue-libs:glue_libs_3.0.0_image_01`
+ AWS Glue 버전 2.0의 경우: `public.ecr.aws/glue/aws-glue-libs:glue_libs_2.0.0_image_01`

**참고**  
 AWS Glue Docker 이미지는 x86\$164 및 arm64와 호환됩니다.

 이 예제에서는 `public.ecr.aws/glue/aws-glue-libs:5`를 사용하고 로컬 시스템(Mac, Windows, Linux)에서 컨테이너를 실행합니다. 이 컨테이너 이미지는 AWS Glue 버전 5.0 Spark 작업에 대해 테스트되었습니다. 이미지에는 다음이 포함되어 있습니다.
+  Amazon Linux 2023 
+  AWS Glue ETL 라이브러리 
+  Apache Spark 3.5.4 
+  오픈 테이블 형식 라이브러리; Apache Iceberg 1.7.1, Apache Hudi 0.15.0, Delta Lake 3.3.0 
+  AWS Glue Data Catalog 클라이언트 
+  Apache Spark용 Amazon Redshift 커넥터 
+  Apache Hadoop용 Amazon DynamoDB 커넥터 

 컨테이너를 설정하려면 ECR 퍼블릭 갤러리에서 이미지를 가져온 다음 컨테이너를 실행합니다. 이 주제에서는 요구 사항에 따라 다음 방법으로 컨테이너를 실행하는 방법을 보여줍니다.
+ `spark-submit`
+ REPL 쉘 `(pyspark)`
+ `pytest`
+ Visual Studio Code

## 사전 조건
<a name="develop-local-docker-image-prereq"></a>

시작하기 전에 Docker가 설치되어 있고 Docker 데몬이 실행 중인지 확인하세요. 설치 지침은 [Mac](https://docs.docker.com/docker-for-mac/install/) 또는 [Linux](https://docs.docker.com/engine/install/)용 도커 설명서를 참조하세요. Docker를 실행하는 시스템은 AWS Glue 컨테이너를 호스트합니다. 또한 Docker를 실행하는 호스트의 이미지를 위해 7GB 이상의 디스크 공간이 있는지 확인하세요.

 로컬에서 AWS Glue 코드 개발 시 제한에 대한 자세한 정보는 [로컬 개발 제한 사항](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html#local-dev-restrictions)을 참조하세요.

### AWS 구성
<a name="develop-local-docker-image-config-aws-credentials"></a>

컨테이너에서 AWS API 호출을 활성화하려면 다음 단계에 따라 AWS 자격 증명을 설정합니다. 다음 섹션에서는 AWS(이)라는 이름의 프로필을 사용합니다.

1.  [AWS 명명된 프로필을 생성합니다.](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html)

1.  Windows 또는 Mac/Linux의 터미널에서 `cmd`를 열고 터미널에서 다음 명령을 실행합니다.

   ```
   PROFILE_NAME="<your_profile_name>"
   ```

다음 섹션에서는 AWS 명명된 프로필을 사용합니다.

### 
<a name="develop-local-docker-pull-image-from-ecr-public"></a>

 Windows에서 Docker를 실행하는 경우 이미지를 가져오기 전에 Docker 아이콘(마우스 오른쪽 버튼 클릭)을 선택하고 **Linux 컨테이너로 전환**을 선택합니다.

ECR 퍼블릭으로부터 이미지를 로컬 시스템으로 가져오려면 다음 명령을 실행합니다.

```
docker pull public.ecr.aws/glue/aws-glue-libs:5 
```

## 컨테이너 실행
<a name="develop-local-docker-image-setup-run"></a>

이제 이 이미지를 사용하여 컨테이너를 실행할 수 있습니다. 요구 사항에 따라 다음 중 하나를 선택할 수 있습니다.

### spark-submit
<a name="develop-local-docker-image-setup-run-spark-submit"></a>

컨테이너에서 `spark-submit` 명령을 실행하여 AWS Glue 작업 스크립트를 실행할 수 있습니다.

1.  아래 예제와 같이 스크립트를 작성하고 `sample.py`로 저장한 이후 다음 명령을 사용하여 `/local_path_to_workspace/src/` 디렉터리에 저장합니다.

   ```
   $ WORKSPACE_LOCATION=/local_path_to_workspace
   $ SCRIPT_FILE_NAME=sample.py
   $ mkdir -p ${WORKSPACE_LOCATION}/src
   $ vim ${WORKSPACE_LOCATION}/src/${SCRIPT_FILE_NAME}
   ```

1.  이러한 변수는 아래의 docker run 명령에 사용됩니다. 아래의 spark-submit 명령에 사용되는 샘플 코드(sample.py://)는 이 주제의 끝에 있는 부록에 포함되어 있습니다.

    다음 명령을 실행하여 컨테이너에서 `spark-submit` 명령을 실행하여 새 Spark 애플리케이션을 제출합니다.

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home
       /hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_spark_submit \
       public.ecr.aws/glue/aws-glue-libs:5 \
       spark-submit /home/hadoop/workspace/src/$SCRIPT_FILE_NAME
   ```

1. (선택 사항) 환경에 맞게 `spark-submit`을 구성합니다. 예를 들어 `--jars` 구성을 사용하여 종속성을 전달할 수 있습니다. 자세한 내용은 Spark 설명서에서 [Spark Properties 동적 로딩](https://spark.apache.org/docs/latest/configuration.html)을 참조하세요.

### REPL 셸(Pyspark)
<a name="develop-local-docker-image-setup-run-repl-shell"></a>

 대화형 개발을 위해 REPL(`read-eval-print loops`) 쉘을 실행할 수 있습니다. 다음 명령을 실행하여 컨테이너에서 PySpark 명령을 실행하여 REPL 셸을 시작합니다.

```
$ docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pyspark \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 출력은 다음과 같습니다.

```
Python 3.11.6 (main, Jan  9 2025, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.5.4-amzn-0
      /_/

Using Python version 3.11.6 (main, Jan  9 2025 00:00:00)
Spark context Web UI available at None
Spark context available as 'sc' (master = local[*], app id = local-1740643079929).
SparkSession available as 'spark'.
>>>
```

 이 REPL 쉘을 사용하면 대화형으로 코딩 및 테스트할 수 있습니다.

### Pytest
<a name="develop-local-docker-image-setup-run-pytest"></a>

 유닛 테스트의 경우 AWS Glue Spark 작업 스크립트에 `pytest`를 사용할 수 있습니다. 준비를 위해 다음 명령을 실행합니다.

```
$ WORKSPACE_LOCATION=/local_path_to_workspace
$ SCRIPT_FILE_NAME=sample.py
$ UNIT_TEST_FILE_NAME=test_sample.py
$ mkdir -p ${WORKSPACE_LOCATION}/tests
$ vim ${WORKSPACE_LOCATION}/tests/${UNIT_TEST_FILE_NAME}
```

 다음 명령을 실행하고 `docker run`을 사용하여 `pytest`를 실행합니다.

```
$ docker run -i --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pytest \
    public.ecr.aws/glue/aws-glue-libs:5 \
    -c "python3 -m pytest --disable-warnings"
```

 `pytest`가 단위 테스트 실행을 완료하면 출력은 다음과 같습니다.

```
============================= test session starts ==============================
platform linux -- Python 3.11.6, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/hadoop/workspace
plugins: integration-mark-0.2.0
collected 1 item

tests/test_sample.py .                                                   [100%]

======================== 1 passed, 1 warning in 34.28s =========================
```

### Visual Studio Code를 사용하도록 컨테이너 설정
<a name="develop-local-docker-image-setup-visual-studio"></a>

 Visual Studio Code로 컨테이너를 설정하려면 다음 단계를 완료합니다.

1. Visual Studio Code를 설치합니다.

1. [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)을 설치합니다.

1. [Visual Studio Code Remote - Containers](https://code.visualstudio.com/docs/remote/containers)를 설치합니다.

1. Visual Studio Code에서 작업 영역 폴더를 엽니다.

1. `Ctrl+Shift+P`(Windows/Linux) 또는 `Cmd+Shift+P`(Mac)를 누릅니다.

1. 유형 `Preferences: Open Workspace Settings (JSON)`

1. 입력을 누릅니다.

1. 다음 JSON을 붙여 넣고 저장합니다.

   ```
   {
       "python.defaultInterpreterPath": "/usr/bin/python3.11",
       "python.analysis.extraPaths": [
           "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip:/usr/lib/spark/python/:/usr/lib/spark/python/lib/",
       ]
   }
   ```

 컨테이너 설정: 

1. Docker 컨테이너를 실행합니다.

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home/hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_pyspark \
       public.ecr.aws/glue/aws-glue-libs:5 \
       pyspark
   ```

1. Visual Studio Code를 시작합니다.

1.  왼쪽 메뉴에서 **Remote Explorer**를 선택하고 `amazon/aws-glue-libs:glue_libs_4.0.0_image_01`을(를) 선택합니다.

1.  마우스 오른쪽 버튼을 클릭하고 **현재 창에서 연결**을 선택합니다.  
![\[마우스 오른쪽 버튼을 클릭하면 현재 창에서 연결 옵션이 포함된 창이 표시됩니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/vs-code-other-containers.png)

1.  다음 대화 상자가 나타나면 **알겠습니다**를 선택합니다.  
![\["컨테이너에 연결하면 임의의 코드가 실행될 수 있습니다"라는 메시지가 표시되는 창 경고.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/vs-code-warning-got-it.png)

1. `/home/handoop/workspace/`를 엽니다.  
![\['워크스페이스' 옵션이 강조 표시된 창 드롭다운.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/vs-code-open-workspace.png)

1.  AWS Glue PySpark 스크립트를 만들고 **실행**을 선택합니다.

   스크립트가 성공적으로 실행됨을 확인할 수 있습니다.  
![\[스크립트가 성공적으로 실행되었습니다.\]](http://docs.aws.amazon.com/ko_kr/glue/latest/dg/images/vs-code-run-successful-script.png)

## AWS Glue 4.0과 AWS Glue 5.0 Docker 이미지 간의 변경 사항
<a name="develop-local-docker-glue4-glue5-changes"></a>

 AWS Glue 4.0과 AWS Glue 5.0 Docker 이미지 간의 주요 변경 사항: 
+  AWS Glue 5.0에는 배치 작업과 스트리밍 작업 모두에 사용하는 단일 컨테이너 이미지가 있습니다. 이와 달리 Glue 4.0은 배치 작업용 이미지와 스트리밍 작업용 이미지가 하나씩 있었습니다.
+  AWS Glue 5.0에서 컨테이너의 기본 사용자 이름은 `hadoop`입니다. AWS Glue 4.0에서 기본 사용자 이름은 `glue_user`였습니다.
+  AWS Glue 5.0에서는 JupyterLab과 Livy를 포함한 여러 추가 라이브러리가 이미지에서 제거되었습니다. 이를 수동으로 설치할 수 있습니다.
+  AWS Glue 5.0에서는 모든 Iceberg, Hudi 및 Delta 라이브러리가 기본적으로 사전 로드되며 환경 변수 `DATALAKE_FORMATS`는 더 이상 필요하지 않습니다. AWS Glue 4.0 이하의 경우 로드해야 하는 특정 테이블 형식을 지정하는 데 환경 변수 `DATALAKE_FORMATS`가 사용되었습니다.

 위 목록은 Docker 이미지에 해당됩니다. AWS Glue 5.0 업데이트를 자세히 알아보려면 [AWS Glue 5.0 for Apache Spark 소개](https://aws.amazon.com/blogs/big-data/introducing-aws-glue-5-0-for-apache-spark/) 및 [AWS Glue for Spark 작업을 AWS Glue 버전 5.0으로 마이그레이션](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html)을 참조하세요.

## 고려 사항
<a name="develop-local-docker-considerations"></a>

 AWS Glue 컨테이너 이미지를 사용하여 로컬에서 작업 스크립트를 개발할 때는 다음 기능이 지원되지 않습니다.
+  [작업 북마크](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html) 
+  AWS Glue Parquet 라이터([AWS Glue에서 Parquet 형식 사용](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-parquet-home.html)) 
+  [ FillMissingValues 변환 ](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-fillmissingvalues.html) 
+  [FindMatches 변환](https://docs.aws.amazon.com/glue/latest/dg/machine-learning.html#find-matches-transform) 
+  [ 벡터화된 SIMD CSV 리더 ](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader) 
+  Amazon S3 경로에서 JDBC 드라이버를 로드하는 데 사용되는 [ customJdbcDriverS3Path ](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc) 속성 
+  [AWS Glue 데이터 품질](https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html) 
+  [민감한 데이터 감지](https://docs.aws.amazon.com/glue/latest/dg/detect-PII.html) 
+  AWS Lake Formation 권한 기반 자격 증명 벤딩 

## 부록: JDBC 드라이버 및 Java 라이브러리 추가
<a name="develop-local-docker-image-appendix"></a>

 컨테이너에서 현재 사용할 수 없는 JDBC 드라이버를 추가하려면 필요한 JAR 파일이 포함된 새 디렉터리를 워크스페이스에 생성하고 디렉터리를 docker run 명령의 `/opt/spark/jars/`에 마운트할 수 있습니다. 컨테이너 내의 `/opt/spark/jars/`에 있는 JAR 파일은 Spark Classpath에 자동으로 추가되며 작업 실행 중에 사용할 수 있습니다.

 예를 들어 다음 docker run 명령을 사용하여 JDBC 드라이버 jar을 PySpark REPL 쉘에 추가합니다.

```
docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    -v $WORKSPACE_LOCATION/jars/:/opt/spark/jars/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_jdbc \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 **고려 사항**에서 강조하는 것처럼 `customJdbcDriverS3Path` 연결 옵션을 사용하여 AWS Glue 컨테이너 이미지의 Amazon S3에서 사용자 지정 JDBC 드라이버를 가져올 수 없습니다.