입력 스트림 병렬화를 통한 처리량 증대 - Amazon Kinesis Data Analytics for SQL 애플리케이션 개발자 안내서

새 프로젝트의 경우 SQL 애플리케이션용 Kinesis Data Analytics보다 Apache Flink Studio용 새로운 관리형 서비스를 사용하는 것이 좋습니다. Apache Flink Studio용 관리형 서비스는 사용 편의성과 고급 분석 기능을 결합하여 정교한 스트림 처리 애플리케이션을 몇 분 만에 구축할 수 있도록 합니다.

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

입력 스트림 병렬화를 통한 처리량 증대

참고

2023년 9월 12일 이후에는 Kinesis Data Analytics for SQL의 기존 사용자가 아닌 경우, Kinesis Data Firehose를 소스로 사용하여 새 애플리케이션을 생성할 수 없습니다. 자세한 설명은 한도를 참조하세요.

Amazon Kinesis Data Analytics 애플리케이션은 복수의 애플리케이션 내 입력 스트림을 지원하여 애플리케이션의 용량을 단일 애플리케이션 내 입력 스트림의 처리량 이상으로 확장할 수 있습니다. 애플리케이션 내 입력 스트림에 대한 자세한 설명은 Amazon Kinesis Data Analytics for SQL 애플리케이션: 작동 방식 섹션을 참조하십시오.

Amazon Kinesis Data Analytics는 거의 모든 경우에 애플리케이션에 공급되는 Kinesis 스트림 또는 Firehose 소스 스트림의 용량을 처리하도록 애플리케이션을 확장합니다. 그러나 소스 스트림의 처리량이 단일 애플리케이션 내 입력 스트림의 처리량을 초과하는 경우 애플리케이션이 사용하는 애플리케이션 내 입력 스트림의 수를 명시적으로 늘릴 수 있습니다. InputParallelism 파라미터를 사용하여 그렇게 합니다.

InputParallelism 파라미터가 1보다 클 경우 Amazon Kinesis Data Analytics는 소스 스트림의 파티션을 애플리케이션 내 스트림 간에 균등하게 분할합니다. 예를 들어, 소스 스트림의 샤드 수가 50개이고 InputParallelism2로 설정한 경우, 각각의 애플리케이션 내 입력 스트림은 25개의 소스 스트림 샤드로부터 입력을 수신합니다.

애플리케이션 내 수를 늘릴 경우 애플리케이션이 각 스트림에서 데이터에 명시적으로 액세스해야 합니다. 코드에서 복수의 애플리케이션 내 스트림에 액세스하는 것에 대한 정보는 Amazon Kinesis Data Analytics 애플리케이션에서 별도의 애플리케이션 내 스트림에 액세스하는 방법 을 참조하십시오.

Kinesis Data Streams와 Firehose 스트림 샤드는 같은 방식으로 애플리케이션 내 스트림으로 구분되지만 애플리케이션에 표시되는 방식이 다릅니다.

  • Kinesis 데이터 스트림의 레코드에는 레코드의 소스 샤드를 식별하는 데 사용 가능한 shard_id 필드가 포함됩니다.

  • Firehose 전송 스트림의 레코드에는 레코드의 소스 샤드 또는 파티션을 식별하는 필드가 포함되지 않습니다. 이는 Firehose가 이 정보를 애플리케이션에서 분리하기 때문입니다.

애플리케이션 내 입력 스트림 수를 증대해야 할지 여부에 대한 평가

대부분의 경우 단일 애플리케이션 내 입력 스트림은 입력 스트림의 복잡성 및 데이터 크기에 따라 단일 소스 스트림의 처리량을 처리할 수 있습니다. CloudWatchAmazon에서 InputBytesMillisBehindLatest 지표를 모니터링하여 애플리케이션 내 입력 스트림 수를 늘려야 하는지 판단할 수 있습니다.

InputBytes 지표가 100MB/초보다 큰 경우 (또는 커질 것으로 예상하는 경우) MillisBehindLatest가 증가하고 애플리케이션 문제의 영향이 증가할 수 있습니다. 이를 해결하기 위해 애플리케이션에 대한 다음의 언어 선택을 권장합니다.

  • 100MB/초 이상으로 애플리케이션 규모 조정이 필요한 경우 복수의 스트림과 Kinesis Data Analytics for SQL 애플리케이션를 사용하십시오.

  • 단일 스트림과 애플리케이션을 사용하려는 경우 Java 애플리케이션용 Kinesis Data Analytics를 사용하십시오.

MillisBehindLatest 지표가 다음 특성 중 하나라도 가지고 있을 경우 애플리케이션의 InputParallelism 설정을 늘려야 합니다.

  • MillisBehindLatest 지표가 점진적으로 증가하여 애플리케이션이 스트림에서의 최신 데이터보다 뒤쳐지고 있음을 나타냅니다.

  • MillisBehindLatest 지표가 지속적으로 1000(1초)을 초과합니다.

다음에 해당하는 경우 애플리케이션의 InputParallelism 설정을 늘릴 필요가 없습니다.

  • MillisBehindLatest 지표가 점진적으로 감소하여 애플리케이션이 스트림에서의 최신 데이터를 따라잡고 있음을 나타냅니다.

  • MillisBehindLatest 지표가 1000(1초) 아래입니다.

사용에 대한 자세한 내용은 사용 CloudWatch CloudWatch 설명서를 참조하십시오.

복수의 애플리케이션 내 입력 스트림 구현

애플리케이션을 생성할 때 CreateApplication을 사용하여 애플리케이션 내 입력 스트림의 수를 설정할 수 있습니다. 애플리케이션을 생성한 후에 UpdateApplication을 사용하여 이 수를 설정합니다.

참고

Amazon Kinesis Data Analytics API 또는 AWS CLI를 사용해서만 InputParallelism 설정값을 설정할 수 있습니다. 를 사용하여 이 설정을 지정할 수 없습니다 AWS Management Console. 설정에 대한 자세한 내용은 AWS CLI을 참조하십시오2단계: AWS Command Line Interface(AWS CLI) 설정.

새 애플리케이션의 입력 스트림 수 설정

다음 예는 CreateApplication API 작업을 사용하여 새 애플리케이션의 입력 스트림 수를 2로 설정하는 방법을 보여줍니다.

CreateApplication에 대한 자세한 정보는을 잠조하세요CreateApplication.

{ "ApplicationCode": "<The SQL code the new application will run on the input stream>", "ApplicationDescription": "<A friendly description for the new application>", "ApplicationName": "<The name for the new application>", "Inputs": [ { "InputId": "ID for the new input stream", "InputParallelism": { "Count": 2 }], "Outputs": [ ... ], }] }

기존 애플리케이션의 입력 스트림 수 설정

다음 예는 UpdateApplication API 작업을 사용하여 기존 애플리케이션의 입력 스트림 수를 2로 설정하는 방법을 보여 줍니다.

Update_Application에 대한 자세한 정보는을 잠조하세요UpdateApplication.

{ "InputUpdates": [ { "InputId": "yourInputId", "InputParallelismUpdate": { "CountUpdate": 2 } } ], }

Amazon Kinesis Data Analytics 애플리케이션에서 별도의 애플리케이션 내 스트림에 액세스하는 방법

애플리케이션에서 복수의 애플리케이션 내 입력 스트림을 사용하려면 각기 다른 스트림에서 명시적으로 선택해야 합니다. 다음의 코드 예는 시작하기 자습서에서 생성한 애플리케이션에서 복수의 입력 스트림을 쿼리하는 방법을 보여 줍니다.

다음 예에서는 각 소스 스트림은 를 사용하여 우선 집계된 후 in_application_stream001라는 단일 애플리케이션 내 스트림으로 결합됩니다. 소스 스트림을 미리 집계하면 결합된 애플리케이션 내 스트림이 과부하 없이 복수의 스트림에서 발생하는 트래픽을 처리하는 데 도움이 됩니다.

참고

이 예를 실행하여 두 애플리케이션 내 입력 스트림으로부터 결과를 얻으려면 소스 스트림에 있는 샤드의 수와 애플리케이션의 InputParallelism 파라미터를 둘 다 업데이트합니다.

CREATE OR REPLACE STREAM in_application_stream_001 ( ticker VARCHAR(64), ticker_count INTEGER ); CREATE OR REPLACE PUMP pump001 AS INSERT INTO in_application_stream_001 SELECT STREAM ticker_symbol, COUNT(ticker_symbol) FROM source_sql_stream_001 GROUP BY STEP(source_sql_stream_001.rowtime BY INTERVAL '60' SECOND), ticker_symbol; CREATE OR REPLACE PUMP pump002 AS INSERT INTO in_application_stream_001 SELECT STREAM ticker_symbol, COUNT(ticker_symbol) FROM source_sql_stream_002 GROUP BY STEP(source_sql_stream_002.rowtime BY INTERVAL '60' SECOND), ticker_symbol;

위의 코드 예는 다음과 비슷한 결과를 in_application_stream001에 출력합니다:

추가 고려 사항

복수의 입력 스트림을 사용하는 경우 다음에 유의해야 합니다.

  • 애플리케이션 내 입력 스트림의 최대 수는 64입니다.

  • 애플리케이션 내 입력 스트림은 애플리케이션 입력 스트림의 샤드 간에 균등하게 분배됩니다.

  • 애플리케이션 내 스트림 추가에 따른 성능상 이득은 선형적으로 증가하지 않습니다. 즉, 애플리케이션 내 스트림을 두 배로 늘린다고 처리량이 두 배가 되지는 않습니다. 행 크기가 일반적인 경우, 각 애플리케이션 내 스트림은 초당 약 5,000~15,000개의 행을 처리할 수 있습니다. 애플리케이션 내 스트림 수를 10으로 늘리면 초당 20,000~30,000 정도의 처리량을 확보할 수 있습니다. 처리 속도는 입력 스트림 필드의 수, 데이터 유형 및 데이터 크기에 좌우됩니다.

  • 일부 집계 함수(예: AVG)는 여러 샤드에 분할된 입력 스트림에 적용할 경우 예상치 못한 결과를 산출할 수 있습니다. 샤드를 집계 스트림에 결합하기 전에 개별 샤드에 대한 집계 작업을 실행해야 하기 때문에 결과를 레코드가 더 많이 포함된 것에 대해 가감해야 할 수 있습니다.

  • 입력 스트림 수를 늘린 후에도 계속해서 성능 저하가 일어나면 (MillisBehindLatest의 지표가 높게) Kinesis 처리 단위(KPU)의 한도에 이른 것일 수도 있습니다. 자세한 설명은 처리량 증가를 위해 애플리케이션 용량을 자동으로 확장 또는 축소 섹션을 참조하세요.