DynamoDB에서 Amazon EMR 작업 성능 최적화
DynamoDB 테이블에서 Amazon EMR 작업은 읽기 작업으로 간주되어 테이블의 프로비저닝 처리량 설정이 적용됩니다. Amazon EMR은 자체 로직을 구현하여 에 따릅니다. 테이블에 대한 로드 밸런스를 맞춤으로써 프로비저닝 처리량을 초과할 가능성을 최소화합니다. 각 Hive 쿼리가 끝날 때마다 Amazon EMR이 프로비저닝 처리량의 초과 횟수를 포함해 쿼리 처리에 사용된 클러스터 정보를 반환합니다. 이 정보는 DynamoDB 처리량에 대한 CloudWatch 지표와 함께 후속 요청에서 DynamoDB 테이블에 대한 로드를 효과적으로 관리하는 데 사용됩니다.
다음은 DynamoDB 테이블 작업 시 Hive 쿼리 성능에 영향을 미치는 요인입니다.
프로비저닝된 읽기 용량 유닛
DynamoDB 테이블에 대해 Hive 쿼리를 실행하는 경우 충분한 양의 읽기 용량 유닛을 프로비저닝했는지 확인해야 합니다.
예를 들어 DynamoDB 테이블에 읽기 용량 단위를 100개 프로비저닝하였다고 가정하겠습니다. 그러면 초당 100회의 읽기(또는 409,600바이트)를 수행할 수 있습니다. 테이블에 20GB의 데이터(21,474,836,480바이트)가 포함되어 있고 Hive 쿼리에서 전체 테이블 스캔을 수행하는 경우 쿼리를 실행하는 데 걸리는 시간을 추산할 수 있습니다.
21,474,836,480 / 409,600 = 52,429초 = 14.56시간
필요한 시간을 줄일 수 있는 유일한 방법은 원본 DynamoDB 테이블에서 읽기 용량 유닛을 조정하는 것입니다. 노드를 Amazon EMR 클러스터에 더 추가하더라도 효과가 없습니다.
Hive 출력에서 하나 이상의 매퍼 프로세스가 완료되면 진행률이 업데이트됩니다. 하지만 대용량 DynamoDB 테이블에서 프로비저닝된 읽기 용량이 낮게 설정된 경우에는 진행률 출력이 오랫동안 업데이트되지 않을 수도 있습니다. 위 경우에는 작업 진행률이 몇 시간 0%로 표시됩니다. 작업 진행률에 대한 자세한 상태를 보려면 Amazon EMR 콘솔로 이동하여 개별 매퍼 작업 상태와 데이터 읽기에 대한 통계를 볼 수 있습니다.
마스터 노드에서 하둡 인터페이스에 로그온하여 하둡 통계를 볼 수도 있습니다. 여기에는 개별 맵 작업 상태와 일부 데이터 읽기 통계가 표시됩니다. 자세한 내용은 Amazon EMR 관리 안내서에서 프라이머리 노드에 호스팅된 웹 인터페이스를 참조하세요.
읽기 비율 설정
기본적으로 Amazon EMR은 현재 프로비저닝된 처리량에 따라 DynamoDB 테이블에 대한 요청 로드를 관리합니다. 하지만 Amazon EMR이 반환하는 작업 정보에 프로비저닝된 처리량을 초과하는 높은 응답 수가 포함된 경우 Hive 테이블을 설정하면서 dynamodb.throughput.read.percent
파라미터를 사용해 기본 읽기 비율을 조정할 수 있습니다. 읽기 비율 파라미터 설정에 대한 자세한 내용은 Hive 옵션 단원을 참조하십시오.
쓰기 비율 설정
기본적으로 Amazon EMR은 현재 프로비저닝된 처리량에 따라 DynamoDB 테이블에 대한 요청 로드를 관리합니다. 하지만 Amazon EMR이 반환하는 작업 정보에 프로비저닝된 처리량을 초과하는 높은 응답 수가 포함된 경우 Hive 테이블을 설정하면서 dynamodb.throughput.write.percent
파라미터를 사용해 기본 쓰기 비율을 조정할 수 있습니다. 쓰기 비율 파라미터 설정에 대한 자세한 내용은 Hive 옵션 단원을 참조하십시오.
재시도 지속 시간 설정
기본적으로 Amazon EMR은 기본 재시도 주기인 2분 내에 결과를 반환하지 않으면 Hive 쿼리를 다시 실행합니다. 이 주기는 Hive 쿼리 실행 시 dynamodb.retry.duration
파라미터를 설정하면 조정 가능합니다. 쓰기 비율 파라미터 설정에 대한 자세한 내용은 Hive 옵션 단원을 참조하십시오.
맵 작업 수
DynamoDB에 저장된 데이터 내보내기 및 쿼리 요청을 처리할 목적으로 Hadoop에서 실행하는 매퍼 대몬(daemon)은 최대 읽기 비율이 초당 1MiB이기 때문에 사용할 수 있는 읽기 용량도 제한됩니다. 이때 DynamoDB에서 사용할 수 있는 프로비저닝된 처리량을 추가하면 매퍼 대몬(daemon) 수를 늘려 Hive 내보내기 및 쿼리 작업 성능을 높일 수 있습니다. 이를 위해 클러스터에 속한 EC2 인스턴스 수를 늘릴 수 있습니다. 또는 각 EC2 인스턴스에서 실행되는 매퍼 대몬(daemon) 수를 늘릴 수 있습니다.
클러스터의 EC2 인스턴스 수를 늘리려면 현재 클러스터를 중단하고 EC2 인스턴스 수를 늘려 재실행하면 됩니다. Amazon EMR 콘솔을 사용해 클러스터를 시작한 경우에는 EC2 인스턴스 구성 대화 상자에서 EC2 인스턴스 수를 지정합니다. 또는 CLI에서 클러스터를 시작한 경우에는 ‑‑num-instances
옵션을 통해 EC2 인스턴스 수를 지정합니다.
인스턴스에서 실행되는 맵 작업 수는 EC2 인스턴스 유형에 따라 다릅니다. 지원되는 EC2 인스턴스 유형과 각 인스턴스가 제공하는 매퍼 수에 대한 자세한 내용은 작업 구성 단원을 참조하십시오. 여기에서 "작업 구성(Task Configuration)" 단원을 보면 각각 지원되는 구성을 알 수 있습니다.
매퍼 데몬의 수를 늘리는 또 한 가지 방법은 하둡의 mapreduce.tasktracker.map.tasks.maximum
구성 파라미터 값을 높이는 것입니다. 이 방법은 EC2 인스턴스 수나 크기를 늘리지 않고 매퍼를 추가함으로써 비용을 절감한다는 점에서 이점이 있습니다. 반면에 이 값을 너무 높게 설정하면 클러스터에 속한 EC2 인스턴스의 메모리가 부족할 수도 있다는 것이 단점입니다. mapreduce.tasktracker.map.tasks.maximum
을 설정하려면 클러스터를 시작하고 mapred-site 구성 분류의 속성으로 mapreduce.tasktracker.map.tasks.maximum
의 값을 지정합니다. 방법은 다음 예제와 같습니다. 자세한 내용은 애플리케이션 구성 단원을 참조하십시오.
{ "configurations": [ { "classification": "mapred-site", "properties": { "mapred.tasktracker.map.tasks.maximum": "10" } } ] }
병렬 데이터 요청
한 명 이상의 사용자 또는 하나 이상의 애플리케이션에서 단일 테이블로 데이터 요청이 다수 이루어지면 읽기 프로비저닝 처리량이 한 번에 소모되어 성능이 느려질 수 있습니다.
프로세스 기간
DynamoDB의 데이터 일관성은 각 노드의 읽기 및 쓰기 작업 순서에 따라 달라집니다. Hive 쿼리가 진행 중일 때는 다른 애플리케이션이 새로운 데이터를 DynamoDB 테이블에 로드하거나 기존 데이터를 변경 또는 삭제하기도 합니다. 이 경우 쿼리 실행 중 데이터 변경 사항은 Hive 쿼리 결과에 반영되지 않습니다.
처리량 초과 주의
DynamoDB에 대해 Hive 쿼리를 실행할 때는 프로비저닝된 처리량을 초과하지 않도록 주의해야 합니다. 그렇지 않으면 애플리케이션이 DynamoDB::Get
을 직접 호출하는 데 필요한 용량이 고갈되기 때문입니다. 이러한 용량 고갈을 방지하려면 Amazon CloudWatch의 로그를 점검하고 메트릭을 관찰하여 DynamoDB::Get
애플리케이션 호출에 따른 읽기 볼륨 및 병목 현상을 정기적으로 모니터링해야 합니다.
요청 시간
DynamoDB 테이블에 대한 수요가 낮은 시간에 Hive 쿼리가 DynamoDB 테이블에 액세스하도록 일정을 조정하면 성능이 향상됩니다. 예를 들어 애플리케이션 사용자 대부분이 샌프란시스코에 거주한다면 대다수가 잠드는 시간인 새벽 4시(PST)에 DynamoDB 데이터베이스의 레코드 업데이트 없이 일일 데이터를 내보내도록 선택할 수 있습니다.
시간 기반 테이블
데이터가 1일 1개 테이블처럼 시간 기반 DynamoDB 테이블의 형태로 구성되는 경우에는 테이블이 활성 상태가 아닐 때 데이터를 내보낼 수 있습니다. 이 기술은 데이터를 Amazon S3에 지속적으로 백업할 때 사용됩니다.
아카이브된 데이터
DynamoDB에 저장된 데이터에 대해 Hive 쿼리를 여러 차례 실행할 계획이면서 애플리케이션이 데이터 아카이브를 허용하는 경우에는 데이터를 HDFS 또는 Amazon S3로 내보내서 DynamoDB가 아닌 데이터 사본에 대해 Hive 쿼리를 실행할 수 있습니다. 그러면 읽기 작업과 프로비저닝 처리량이 절약됩니다.