2016-07-04 3 views
0

저는 ECS에서 AWS를 사용하는 것이 매우 새롭습니다. 현재 S3 링크를 사용하고 해당 링크에서 데이터를 다운로드하고 데이터를 처리 한 다음 해당 데이터에 대한 정보를 출력 할 수있는 응용 프로그램을 개발했습니다. 나는이 응용 프로그램을 도커 컨테이너에 이미 패키지했으며 아마존 컨테이너 레지스트리에 상주합니다. 이제는 클러스터를 시작하고 Docker를 실행하는 각 EC2 인스턴스에 S3 링크를 보내고 모든 컨테이너 인스턴스에서 숫자를 처리 한 다음 모든 결과를 다시 단일 노드로 반환합니다. 이 시점에서 어떻게 내 신청서를 변경해야하는지 잘 모르겠습니다. 도커 컨테이너에서 내 응용 프로그램을 서비스로 실행해야합니까? 아니면 그냥 ssh를 통해 컨테이너에 명령을 보내야합니까? 그렇다면 내가 생각하기에, 클러스터와 통신하여 잠재적으로 수백 개의 S3 링크에 대한 작업을 수행하는 방법은 무엇입니까? 이상적으로, 내 응용 프로그램은 매우 집중적으로 계산하므로 EC2 인스턴스 당 하나의 컨테이너 만 실행하고 싶습니다.Amazon ECS에서 일괄 처리 작업 수행

감사합니다.

답변

3

귀하의 이야기는 많은 연구가 끝난 후에 많은 질문이 있기 때문에 대답하기가 어렵습니다.

나의 초기 생각은 완전히 무국적으로 만드는 것입니다.

S3를 통해 프로세스를 시작하고 처리하도록하면 올바르게 작동합니다. SQS 큐와 같은 것을 사용하려면 이것을 확장해야합니다. 이러한 SQS 메시지에는 S3 링크가 포함됩니다. 응용 프로그램이 시작되고 SQS에서 메시지를 가져 와서 링크를 처리하고 메시지를 삭제합니다.

다음은 모든 종류의 콘솔에 출력하지 않는 것입니다. 다른 곳에서 출력하십시오. 다른 SQS 대기열과 같거나 어딘가에 있습니다.

이렇게하면 대화 상자가 서로 통신하지 않아도됩니다. 이것은 일을 빠르게하고, 무한히 확장 할 수있게하며, 의사 소통을 돕기 위해 이상한 허풍을 제거합니다.

왜 인스턴스 당 하나의 컨테이너가 필요합니까? 50 %에서 2 스레드는 보통 100 %에서 1과 동일합니다. 이 요구 사항을 제거하면 ECS + Lambda + Cloudwatch를 사용하여 메시지 수에 따라 확장 할 수 있습니다. > 10000, 스케일 업, 그런 종류의 일. < 크기를 100 줄입니다. 즉, 수백만 개의 메시지를 SQS에 전송하고 ECS를 처리하여 처리하고 다른 곳에서 출력하도록 할 수 있습니다.

+0

저는 각 컨테이너마다 다른 ec2 인스턴스를 사용하고 싶었습니다. 왜냐하면 저는 GPRS를 활용할 생각이었고 컨테이너가 그 리소스를 위해 싸우길 원치 않았기 때문입니다. – user985030

+0

당신은 그것들을 stateless로 만들면 여전히 작동합니다. 인스턴스에 여러 코어가있는 경우 컨테이너는 코어 당 최대 1024 개까지만 사용할 수 있으므로 컨테이너와 작업 정의를 분산하는 방법은 사용자에게 달려 있습니다. 나는 그들이 의사 소통을하도록 권장하지 않습니다. –

2

나는 Marc Young에 동의하며이 상태를 유지하고 앱과 통신 레이어를 분리해야합니다.

이와 같은 응용 프로그램의 경우 S3 링크를 대기열에 넣을 수 있습니다 (rabbitMQ는 좋지만 개인적으로 SQS는 신경 쓰지 않지만 옵션이기도합니다). 그런 다음 ECS의 작업자 노드에서 대기열에서 메시지를 가져 와서 처리합니다.

처리중인 다른 앱이있는 것 같습니다. 결과에 따라 결과를 다른 처리 대기열에 넣고 동일한 모델을 사용하거나 일종의 데이터베이스 (또는 S3의 파일)에 직접 채울 수 있습니다.

Marc가 자동 크기 조정에 대해 언급 한 것 외에도 cloudwatch + spot 인스턴스를 사용하여 ECS 컨테이너 인스턴스 비용을 관리하는 것이 좋습니다. 특히 무거운 컴퓨팅 작업의 경우 큰 할인을받을 수 있습니다.