기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
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는 작업을 실행하는 데 필요한 리소스를 프로비저닝, 구성 및 확장합니다. 사용하는 리소스에 대해서만 비용을 지불합니다.
사전 조건 및 제한 사항
사전 조건
제품 버전
Python 3.9
AWS CLI 버전 2
제한 사항
트리거당 최대 AWS Glue 작업 수는 50개입니다. 자세한 내용은 AWS Glue 엔드포인트 및 할당량 을 참조하세요.
아키텍처
다음 다이어그램은 S3 버킷에 출력(즉, 샘플 파일)을 기록하는 AWS Glue 작업을 중심으로 한 예제 아키텍처를 보여줍니다.
이 다이어그램은 다음 워크플로우를 포함합니다.
CLI, AWS 관리 콘솔 또는 AWS 를 사용하여 AWS Glue 작업을 API 시작합니다. AWS CLI 또는 를 API 사용하면 호출된 작업의 병렬화를 자동화하고 샘플 파일 생성 런타임을 줄일 수 있습니다.
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 버킷을 만듭니다. | 참고: 이 패턴은 데모용으로 | 앱 개발자 |
IAM 역할을 생성하고 구성합니다. | AWS Glue 작업이 S3 버킷에 쓸 때 사용할 수 있는 IAM 역할을 생성해야 합니다.
| 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
AWS Glue 작업을 생성합니다. | 콘텐츠를 생성하고 S3 버킷에 저장하는 AWS Glue 작업을 생성해야 합니다. AWS Glue 작업 을 생성한 다음 다음 단계를 완료하여 작업을 구성합니다.
| 앱 개발자 |
작업 코드를 업데이트합니다. |
| 앱 개발자 |
작업 | 설명 | 필요한 기술 |
---|---|---|
명령줄에서 AWS Glue 작업을 실행합니다. | 에서 AWS Glue 작업을 실행하려면 값을 사용하여 다음 명령을 AWS CLI 실행합니다.
참고: AWS 관리 콘솔에서 AWS Glue 작업을 실행하는 방법에 대한 지침은 이 패턴의 AWS 관리 콘솔 스토리에서 AWS Glue 작업 실행을 참조하세요. 팁 : 위 예제AWSCLI와 같이 여러 파라미터로 한 번에 여러 실행을 실행하려면 를 사용하여 AWS Glue 작업을 실행하는 것이 좋습니다. 특정 병렬화 인수를 사용하여 정의된 수의 파일을 생성하는 데 필요한 모든 AWS CLI 명령을 생성하려면 다음 bash 코드를 실행합니다(값 사용).
위 스크립트를 사용하는 경우 다음 사항을 고려합니다.
참고: 위 스크립트의 출력 예를 보려면 이 패턴의 추가 정보 섹션에서 쉘 스크립트 출력을 참조하세요. | 앱 개발자 |
AWS 관리 콘솔에서 AWS Glue 작업을 실행합니다. |
| 앱 개발자 |
AWS Glue 작업의 상태를 확인합니다. |
| 앱 개발자 |
관련 리소스
참조
가이드 및 패턴
추가 정보
벤치마킹 테스트
이 패턴은 벤치마킹 테스트의 일환으로 다양한 병렬화 파라미터를 사용하여 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 버킷에 있는 객체에 대한 읽기 및 쓰기 액세스 권한 허용을 참조하세요.