Google의 친구와 이야기 한 후 내 데이터 집합을 업데이트하기 위해 일종의 Job/Worker 모델을 구현하고 싶습니다.이 작업을 위해 MapReduce 또는 다른 유형의 병렬화를 배우고 사용해야합니까?
이 데이터 세트는 타사 서비스의 데이터를 반영하므로 업데이트를 수행하려면 해당 API에 대해 여러 번의 원격 호출이 필요합니다. 이 제 3 자 서비스의 응답을 기다리는 데 많은 시간을 할애 할 것입니다. 필자는 개인의 반응을 기다리면서 이러한 요청을 병렬 처리하고 동시에 많은 사람들을 열어 놓아서 업무 시간을 단축하고 계산 시간을보다 효율적으로 활용하고자합니다.
내 특정 데이터 집합을 설명하고 문제에 들어가기 전에, 내가 무엇을 찾고 있어요 답변 명확히하고 싶습니다 :
- 이 맵리 듀스와 병렬화에 적합 할 것 흐름인가?
- 예 인 경우 아마존의 mapreduce 모듈 (시간당 청구서가 발행되며 작업이 완료되면 1 시간 전)에서 실행하는 것이 비용 효율적일까요? (정확하게 "직업"으로 간주되는 것이 확실하지 않으므로 정확하게 청구 할 방법을 모르겠습니다.)
- 아니요 인 경우 사용해야하는 다른 시스템/패턴이 있습니까? 및 파이썬에서이 작업을 수행하는 데 도움이되는 라이브러리가 있습니까 (AWS, EC2 + EBS 사용)?
- 이 작업 흐름을 설계 한 방식에 문제가 있습니까?
:
데이터 집합은 다른 사용자에 따라 좋아하는 항목이있는 사용자로 구성되어 있습니다. 목표는 각 사용자의 대기열을 업데이트 할 수 있도록하는 것입니다. 사용자 대기열은 내가 팔로우하는 사용자가 볼 수있는 항목 목록으로, 관심 사용자의 즐겨 찾기 항목을 기반으로합니다. 그러나 데이터를 정리하고 사용자 대기열을 업데이트하기 전에 API 호출 전화가 오는 최신 데이터가 있는지 확인해야합니다.
내가 할 수있는 두 가지 호출이 있습니다 - 모든 사용자가 요청 된 사용자에 의해 미행 당하고 반환하고,
- 는 사용자을 이어 받기 요청 된 사용자의 모든 즐겨 찾기 항목을 반환합니다.
내가 GET는 사용자가 업데이트되는 위해 사용자에게을 따라 전화 후, 나는 따르고 각 사용자의 즐겨 찾기 항목을 업데이트해야합니다. 관심있는 모든 사용자에 대해 즐겨 찾기가 모두 반환 된 경우에만 해당 원래 사용자의 큐 처리를 시작할 수 있습니다. 프로세스 개막을 사용자가 업데이트되고 다음에 사용자를 가져 오는으로 -
- 시작을 사용자에 대한 대기열 업데이트 :
채용이 흐름에
은 다음과 같습니다 :이 흐름은 같다 저장 한 다음 만들기 각 사용자에 대한 즐겨 찾기 작업 가져 오기. - 즐겨 찾기 가져 오기 사용자 - 타사 서비스에서 지정된 사용자의 즐겨 찾기 목록을 요청하고 저장합니다.
- 사용자에 대해 새 대기열 계산 - 이제 모든 데이터가 반입되었으므로 새 대기열을 처리 한 다음 응용 프로그램 계층에서 사용하는 캐시에 결과를 저장합니다.
그래서 다시, 내 질문은 :
- 이 맵리 듀스와 병렬화에 적합 할 것 흐름인가? UserX에 대한 프로세스를 시작하고 관련 데이터를 모두 가져와 UserX의 큐를 처리 한 후에 만 처리 할 수 있는지 여부는 알 수 없습니다.
- 예 인 경우 아마존의 mapreduce 모듈 (시간당 청구서가 발행되며 작업이 완료되면 1 시간 전)에서 실행하는 것이 비용 효율적일까요? 모듈을 사용하면 공개 API 요청을 기다릴 수있는 "스레드"수에 제한이 있습니까?
- 아니요 인 경우 사용해야하는 다른 시스템/패턴이 있습니까? 및 파이썬에서이 작업을 수행하는 데 도움이되는 라이브러리가 있습니까 (AWS에서는 EC2 + EBS를 사용합니까?)?
- 이 작업 흐름을 설계 한 방식에 문제가 있습니까?
읽어 주셔서 감사합니다. JimR에 응답
편집 : 고체 회신
감사합니다. 원래의 질문을 쓴 이후의 독서에서 MapReduce 사용을 배제했습니다. 나는 이것을 어떻게 만들고 싶은지를 아직 결정하지 않았지만 MapReduce가 실제로 HTTP 요청을 병렬화하려고 할 때 컴퓨팅로드를 분산/병렬화하는 것이 더 좋다고 느끼기 시작했습니다.
가져온 데이터를 모두 가져 와서 결과로 끌어 내리는 부분 인 "감소"작업은 그다지 계산적이지 않습니다. 나는 사용자 당 2 ~ 2 번 실행되는 하나의 큰 SQL 쿼리가 될 것이라고 확신합니다.
그럼, 나는쪽으로 기울고 있어요 것은 : 파이썬 작성
- 비 맵리 듀스 작업/노동자 모델. 저의 저의 친구는 저비용이고 잘 저울 렀기 때문에 이것을 위해 파이썬을 배웠습니다.
- Amazon EC2를 컴퓨팅 계층으로 사용. 이것은 데이터베이스를 저장하기 위해 EBS 슬라이스가 필요하다는 것을 의미한다고 생각합니다.
- 아마도 Amazon의 Simple Message queue thingy를 사용합니다. 이 3 번째 아마존 위젯은 작업 대기열을 추적하고, 한 작업의 결과를 다른 작업의 입력으로 이동 시키며, 실패한 작업을 정상적으로 처리하도록 설계된 것 같습니다. 아주 싸구려. 사용자 정의 작업 큐 시스템 대신 구현할 가치가 있습니다.
고도의 병렬 요청과이 유형의 문제에 가까운 실시간 처리를 위해 Google 앱 엔진을 사용했습니다. MapReduce는 내가 찾고있는 것보다 훨씬 높은 시작 및 작업주기 오버 헤드를 가지고있었습니다. – kevpie
흥미 롭습니다. 나는 애플 리케이션 엔진이 파이썬을 사용할 수 있다는 것을 알고있다.이 파이썬은 내가이 일자리를 쓰기 위해 고향에 있었던 것이지만, GAE를 다른 용도로 사용하는 방법에 대해서는 명확하지 않다. 저는 GAE의 작동 방식이나이 문제를 어떻게 표현하는지에 익숙하지 않아 답변을 찾지 못했습니다. 여기에 조사해야 할 다른 자원이 있습니까? 팁 고마워! –
실제로 파이썬 프로세스를 작성하여 스레드와 큐를 사용하여 병렬 웹 요청과 데이터 처리를 수행했습니다. 괜찮 았지만 파이썬 프로그래밍이나 쓰레드에 "정통"하지 않아서 정말 안정적이었고 성능이 뛰어났습니다. 인터넷 검색이 많이되고 좌절감이 생기고 우선 순위가 필요한 다른 작업을 수행 한 후 작업을 포기했습니다. 나는 다시 데리러 올지 모른다. MapReduce를 사용한 작업에 관해서도 비슷한 결론을 내 렸습니다. 왜냐하면 실제로는 병렬 처리가 hadoop에 내장되어 있기 때문에 아무것도 사용하지 않았기 때문입니다. 어쨌든, 그것에 대해 더 많이 이야기하고 싶다면 접근과 해결책, lmk! –