AWS Glue 작업 및 Python을 사용하여 테스트 데이터 생성 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Glue 작업 및 Python을 사용하여 테스트 데이터 생성

작성자: Moinul Al-Mamun(AWS)

환경: 프로덕션

기술: 분석, CloudNative데이터 레이크 DevelopmentAndTesting, 서버리스, 빅 데이터

AWS 서비스: AWS Glue, Amazon S3

요약

이 패턴은 Python으로 작성된 AWS Glue 작업을 생성하여 수백만 개의 샘플 파일을 동시에 빠르고 쉽게 생성하는 방법을 보여줍니다. 샘플 파일은 Amazon Simple Storage Service(S3) 버킷에 저장됩니다. AWS 클라우드에서 서비스를 테스트하거나 평가하려면 많은 수의 샘플 파일을 빠르게 생성하는 기능이 중요합니다. 예를 들어 Amazon S3 접두사에서 수백만 개의 작은 파일에 대한 데이터 분석을 수행하여 AWS AWSGlue Studio 또는 Glue DataBrew 작업의 성능을 테스트할 수 있습니다.

다른 AWS 서비스를 사용하여 샘플 데이터 세트를 생성할 수 있지만 AWS Glue를 사용하는 것이 좋습니다. AWS Glue는 서버리스 데이터 처리 서비스이므로 인프라를 관리할 필요가 없습니다. 코드를 가져와AWS서 Glue 클러스터에서 실행할 수 있습니다. 또한 AWS Glue는 작업을 실행하는 데 필요한 리소스를 프로비저닝, 구성 및 확장합니다. 사용하는 리소스에 대해서만 비용을 지불합니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정

  • AWS AWS 계정과 함께 작동하도록 설치구성된 명령줄 인터페이스(AWS CLI)

제품 버전

  • Python 3.9

  • AWS CLI 버전 2

제한 사항

트리거당 최대 AWS Glue 작업 수는 50개입니다. 자세한 내용은 AWS Glue 엔드포인트 및 할당량 을 참조하세요.

아키텍처

다음 다이어그램은 S3 버킷에 출력(즉, 샘플 파일)을 기록하는 AWS Glue 작업을 중심으로 한 예제 아키텍처를 보여줍니다.

워크플로는 S3 버킷에 출력을 쓰는 AWS Glue 작업을 AWS CLI 시작합니다.

이 다이어그램은 다음 워크플로우를 포함합니다.

  1. CLI, AWS 관리 콘솔 또는 AWS 를 사용하여 AWS Glue 작업을 API 시작합니다. AWS CLI 또는 를 API 사용하면 호출된 작업의 병렬화를 자동화하고 샘플 파일 생성 런타임을 줄일 수 있습니다.

  2. AWS Glue 작업은 파일 콘텐츠를 무작위로 생성하고, 콘텐츠를 CSV 형식으로 변환한 다음, 공통 접두사 아래에 콘텐츠를 Amazon S3 객체로 저장합니다. 각 파일은 1킬로바이트 미만입니다. AWS Glue 작업에는 START_RANGE 및 의 두 가지 사용자 정의 작업 파라미터가 허용됩니다END_RANGE. 이러한 파라미터를 사용하여 각 작업 실행에 의해 Amazon S3에서 생성되는 파일 이름과 파일 수를 설정할 수 있습니다. 이 작업의 여러 인스턴스를 병렬로 실행할 수 있습니다(예: 인스턴스 100개).

도구

  • Amazon Simple Storage Service(S3)는 원하는 양의 데이터를 저장, 보호 및 검색하는 데 도움이 되는 클라우드 기반 객체 스토리지 서비스입니다.

  • AWS 명령줄 인터페이스(AWS CLI)는 명령줄 쉘의 명령을 통해 AWS 서비스와 상호 작용하는 데 도움이 되는 오픈 소스 도구입니다.

  • AWS Glue는 완전 관리형 추출, 변환 및 로드(ETL) 서비스입니다. 이를 통해 데이터 스토어와 데이터 스트림 간에 데이터를 안정적으로 분류, 정리, 보강하고 이동할 수 있습니다.

  • AWS Identity and Access Management(IAM)는 AWS 리소스에 대한 액세스를 인증하고 사용할 수 있는 권한을 부여받은 사용자를 제어하여 리소스에 대한 액세스를 안전하게 관리하는 데 도움이 됩니다.

모범 사례

이 패턴을 구현할 때 다음 AWS Glue 모범 사례를 고려하세요.

  • 올바른 AWS Glue 워커 유형을 사용하여 비용을 절감하세요. 작업자 유형의 다양한 속성을 이해한 다음 CPU 및 메모리 요구 사항에 따라 워크로드에 적합한 작업자 유형을 선택하는 것이 좋습니다. 이 패턴의 경우 Python 쉘 작업을 작업 유형으로 사용하여 비용을 최소화DPU하고 줄이는 것이 좋습니다. 자세한 내용은 AWS Glue 개발자 안내서의 Glue에서 작업 추가를 참조하세요. AWS

  • 적절한 동시성 한도를 사용하여 작업을 확장합니다. 시간 요구 사항과 필요한 파일 수를 기준으로 AWS Glue 작업의 최대 동시성을 설정하는 것이 좋습니다.

  • 처음에는 적은 수의 파일을 생성하기 시작합니다. AWS Glue 작업을 빌드할 때 비용을 절감하고 시간을 절약하려면 적은 수의 파일(예: 1,000개)로 시작합니다. 이렇게 하면 문제 해결이 더 쉬워질 수 있습니다. 적은 수의 파일을 생성하는 데 성공하면 더 많은 파일로 확장할 수 있습니다.

  • 먼저 로컬에서 실행합니다. AWS Glue 작업을 빌드할 때 비용을 절감하고 시간을 절약하려면 로컬에서 개발을 시작하고 코드를 테스트하세요. 쉘 및 통합 개발 환경()에서 Glue 추출, 변환 및 로드(ETL) 작업을 작성하는 데 도움이 AWS 될 수 있는 Docker 컨테이너를 설정하는 방법에 대한 지침은 AWS 빅 데이터 블로그의 컨테이너 게시물을 사용하여 로컬에서 AWS Glue ETL 작업 개발을 IDE참조하세요.

Glue 모범 사례에 대한 자세한 내용은 AWS AWSGlue 설명서의 모범 사례를 참조하세요.

에픽

작업설명필요한 기술

파일을 저장할 S3 버킷을 만듭니다.

S3 버킷과 그 안에 접두사를 생성합니다.

참고: 이 패턴은 데모용으로 s3://{your-s3-bucket-name}/small-files/ 위치를 사용합니다.

앱 개발자

IAM 역할을 생성하고 구성합니다.

AWS Glue 작업이 S3 버킷에 쓸 때 사용할 수 있는 IAM 역할을 생성해야 합니다.

  1. IAM 역할(예: )을 생성합니다"AWSGlueServiceRole-smallfiles".

  2. 정책의 신뢰할 수 있는 엔터티로 AWS Glue를 선택합니다.

  3. 라는 AWS 관리형 정책을 "AWSGlueServiceRole" 역할에 연결합니다.

  4. 다음 구성을 기반으로 "s3-small-file-access"라고 부르는 인라인 정책 또는 고객 관리형 정책을 생성합니다. "{bucket}"을 버킷의 이름으로 바꿉니다.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::{bucket}/small-files/input/*" ] } ] }
  5. 역할에 "s3-small-file-access" 정책을 연결합니다.

앱 개발자
작업설명필요한 기술

AWS Glue 작업을 생성합니다.

콘텐츠를 생성하고 S3 버킷에 저장하는 AWS Glue 작업을 생성해야 합니다.

AWS Glue 작업 을 생성한 다음 다음 단계를 완료하여 작업을 구성합니다.

  1. AWS 관리 콘솔에 로그인하고 AWS Glue 콘솔을 엽니다.

  2. 탐색 창의 데이터 통합 및 ETL에서 작업을 선택합니다.

  3. 작업 생성 섹션에서 Python 쉘 스크립트 편집기를 선택합니다.

  4. 옵션 섹션에서 보일러플레이트 코드로 새 스크립트 만들기를 선택한 다음 만들기를 선택합니다.

  5. 세부 정보 보기를 선택합니다.

  6. 이름create_small_files를 입력합니다.

  7. IAM 역할 에서 이전에 생성한 IAM 역할을 선택합니다.

  8. 이 작업 실행 섹션에서 직접 작성할 새 스크립트를 선택합니다.

  9. 고급 속성을 선택합니다.

  10. 최대 동시성에 대해서는 데모용으로 100을 입력합니다. 참고: 최대 동시성은 병렬로 실행할 수 있는 작업 인스턴스 수를 정의합니다.

  11. 저장(Save)을 선택합니다.

앱 개발자

작업 코드를 업데이트합니다.

  1. AWS Glue 콘솔 을 엽니다.

  2. 탐색 창에서, 작업을 선택합니다.

  3. 내 작업 섹션에서 이전에 생성한 작업을 선택합니다.

  4. 스크립트 탭을 선택한 다음 아래의 코드에 따라 스크립트를 업데이트합니다. BUCKET_NAME, PREFIX, text_str 변수를 원하는 값으로 업데이트합니다.

    from awsglue.utils import getResolvedOptions import sys import boto3 from random import randrange # Two arguments args = getResolvedOptions(sys.argv, ['START_RANGE', 'END_RANGE']) START_RANGE = int(args['START_RANGE']) END_RANGE = int(args['END_RANGE']) BUCKET_NAME = '{BUCKET_NAME}' PREFIX = 'small-files/input/' s3 = boto3.resource('s3') for x in range(START_RANGE, END_RANGE): # generate file name file_name = f"input_{x}.txt" # generate text text_str = str(randrange(100000))+","+str(randrange(100000))+", " + str(randrange(10000000)) + "," + str(randrange(10000)) # write in s3 s3.Object(BUCKET_NAME, PREFIX + file_name).put(Body=text_str)
  5. 저장을 선택합니다.

앱 개발자
작업설명필요한 기술

명령줄에서 AWS Glue 작업을 실행합니다.

에서 AWS Glue 작업을 실행하려면 값을 사용하여 다음 명령을 AWS CLI 실행합니다.

cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"1000000"}' cmd:~$ aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000000","--END_RANGE":"2000000"}'

참고: AWS 관리 콘솔에서 AWS Glue 작업을 실행하는 방법에 대한 지침은 이 패턴의 AWS 관리 콘솔 스토리에서 AWS Glue 작업 실행을 참조하세요.

: 위 예제AWSCLI와 같이 여러 파라미터로 한 번에 여러 실행을 실행하려면 를 사용하여 AWS Glue 작업을 실행하는 것이 좋습니다.

특정 병렬화 인수를 사용하여 정의된 수의 파일을 생성하는 데 필요한 모든 AWS CLI 명령을 생성하려면 다음 bash 코드를 실행합니다(값 사용).

# define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i-1) + _SB))'","--END_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) * (i)))'"}'"'"; _SB=1; done

위 스크립트를 사용하는 경우 다음 사항을 고려합니다.

  • 이 스크립트는 소규모 파일을 대규모로 호출 및 생성하는 것을 단순화합니다.

  • 해당 값을 사용하여 NUMBER_OF_FILESPARALLELIZATION을 업데이트합니다.

  • 위 스크립트는 실행해야 하는 명령 목록을 인쇄합니다. 해당 출력 명령을 복사한 다음 터미널에서 실행합니다.

  • 스크립트 내에서 명령을 직접 실행하려면 11번째 줄에서 echo 명령문을 제거합니다.

참고: 위 스크립트의 출력 예를 보려면 이 패턴의 추가 정보 섹션에서 쉘 스크립트 출력을 참조하세요.

앱 개발자

AWS 관리 콘솔에서 AWS Glue 작업을 실행합니다.

  1. AWS 관리 콘솔에 로그인하고 AWS Glue 콘솔을 엽니다.

  2. 탐색 창의 데이터 통합 및 ETL에서 작업 을 선택합니다.

  3. 내 작업 섹션에서 작업을 선택합니다.

  4. 파라미터 (선택 사항) 섹션에서 파라미터를 업데이트합니다.

  5. 작업을 선택한 후 작업 실행을 선택합니다.

  6. 필요한 만큼 3에서 5단계를 반복합니다. 예를 들어, 천만 개의 파일을 만들려면 이 프로세스를 10번 반복합니다.

앱 개발자

AWS Glue 작업의 상태를 확인합니다.

  1. AWS Glue 콘솔 을 엽니다.

  2. 탐색 창에서, 작업을 선택합니다.

  3. 내 작업 섹션에서 이전에 생성한 작업(즉,create_small_files)을 선택합니다.

  4. 파일의 진행 상황 및 생성을 자세히 알아보려면 실행 ID, 실행 상태 및 기타 열을 검토합니다.

앱 개발자

관련 리소스

참조

가이드 및 패턴

추가 정보

벤치마킹 테스트

이 패턴은 벤치마킹 테스트의 일환으로 다양한 병렬화 파라미터를 사용하여 1천만 개의 파일을 생성하는 데 사용되었습니다. 다음 표는 테스트 결과를 보여줍니다.

병렬화

작업 실행으로 생성된 파일 수

작업 기간

Speed(속도)

10

1,000,000

6시간 40분

매우 느림

50

200,000

80분

보통

100

100,000건

40분

빠른

프로세스를 더 빠르게 진행하려면 작업 구성에서 더 많은 동시 실행을 구성할 수 있습니다. 요구 사항에 따라 작업 구성을 쉽게 조정할 수 있지만 AWSGlue 서비스 할당량 제한이 있다는 점에 유의하세요. 자세한 내용은 AWS Glue 엔드포인트 및 할당량 을 참조하세요.

쉘 스크립트 출력

다음 예제는 이 패턴의 명령줄 스토리에서 AWS Glue 작업 실행의 쉘 스크립트 출력을 보여줍니다.

user@MUC-1234567890 MINGW64 ~ $ # define parameters NUMBER_OF_FILES=10000000; PARALLELIZATION=50; # initialize _SB=0; # generate commands for i in $(seq 1 $PARALLELIZATION); do echo aws glue start-job-run --job-name create_small_files --arguments "'"'{"--START_RANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i-1) + SB))'","--ENDRANGE":"'$(((NUMBER_OF_FILES/PARALLELIZATION) (i)))'"}'"'"; _SB=1; done aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"0","--END_RANGE":"200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"200001","--END_RANGE":"400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"400001","--END_RANGE":"600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"600001","--END_RANGE":"800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"800001","--END_RANGE":"1000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1000001","--END_RANGE":"1200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1200001","--END_RANGE":"1400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1400001","--END_RANGE":"1600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1600001","--END_RANGE":"1800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"1800001","--END_RANGE":"2000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2000001","--END_RANGE":"2200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2200001","--END_RANGE":"2400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2400001","--END_RANGE":"2600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2600001","--END_RANGE":"2800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"2800001","--END_RANGE":"3000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3000001","--END_RANGE":"3200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3200001","--END_RANGE":"3400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3400001","--END_RANGE":"3600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3600001","--END_RANGE":"3800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"3800001","--END_RANGE":"4000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4000001","--END_RANGE":"4200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4200001","--END_RANGE":"4400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4400001","--END_RANGE":"4600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4600001","--END_RANGE":"4800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"4800001","--END_RANGE":"5000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5000001","--END_RANGE":"5200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5200001","--END_RANGE":"5400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5400001","--END_RANGE":"5600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5600001","--END_RANGE":"5800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"5800001","--END_RANGE":"6000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6000001","--END_RANGE":"6200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6200001","--END_RANGE":"6400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6400001","--END_RANGE":"6600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6600001","--END_RANGE":"6800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"6800001","--END_RANGE":"7000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7000001","--END_RANGE":"7200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7200001","--END_RANGE":"7400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7400001","--END_RANGE":"7600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7600001","--END_RANGE":"7800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"7800001","--END_RANGE":"8000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8000001","--END_RANGE":"8200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8200001","--END_RANGE":"8400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8400001","--END_RANGE":"8600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8600001","--END_RANGE":"8800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"8800001","--END_RANGE":"9000000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9000001","--END_RANGE":"9200000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9200001","--END_RANGE":"9400000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9400001","--END_RANGE":"9600000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9600001","--END_RANGE":"9800000"}' aws glue start-job-run --job-name create_small_files --arguments '{"--START_RANGE":"9800001","--END_RANGE":"10000000"}' user@MUC-1234567890 MINGW64 ~

FAQ

동시 실행 또는 병렬 작업은 몇 개나 사용해야 할까요?

동시 실행 및 병렬 작업 수는 필요한 시간 및 원하는 테스트 파일 수에 따라 달라집니다. 만들고 있는 파일의 크기를 확인하는 것이 좋습니다. 먼저 AWS Glue 작업이 원하는 파일 수를 생성하는 데 걸리는 시간을 확인합니다. 그런 다음, 적절한 수의 동시 실행을 사용하여 목표를 달성합니다. 예를 들어 100,000개의 파일이 실행을 완료하는 데 40분이 걸리지만 목표 시간이 30분이라고 가정하면 AWS Glue 작업의 동시성 설정을 늘려야 합니다.

이 패턴을 사용하여 어떤 유형의 콘텐츠를 생성할 수 있나요?

구분 기호가 다른 텍스트 파일(예: , PIPE JSON또는 )과 같은 모든 유형의 콘텐츠를 생성할 수 있습니다CSV. 이 패턴은 Boto3를 사용하여 파일에 쓴 다음 파일을 S3 버킷에 저장합니다.

S3 버킷에는 어떤 수준의 IAM 권한이 필요합니까?

S3 버킷에 있는 객체에 대한 Write 액세스를 허용하는 ID 기반 정책이 있어야 합니다. 자세한 내용은 Amazon S3 설명서의 Amazon S3: S3 버킷에 있는 객체에 대한 읽기 및 쓰기 액세스 권한 허용을 참조하세요.