2009-06-24 2 views
2

다른 JVM (아마도 다른 시스템)에서 실행중인 여러 JAVA 프로세스로 작업을 분배해야하는 상황이 여기에 있습니다.자바에서 작업량 분포/병렬 실행

내가 1에서 1000까지의 레코드를 가진 테이블을 가지고 있다고 가정 해 봅시다. 나는 수집되고 배포 될 작업을 찾고 있습니다. 10 세트입니다. workerOne에 레코드 1-10을 말합니다. 그런 다음 workerThree에 11-20을 기록합니다. 등등. 말할 필요도없이 workerOne은 worker의 작업을 수행하지 않습니다 .2 번 작업자가 그 작업을 수행 할 수 없을 때까지.

이 예제는 순수하게 데이터베이스를 기반으로하지만 모든 시스템으로 확장 될 수 있으며 파일 처리, 전자 메일 처리 등으로 생각됩니다.

나는 주인/작업자 접근법에 대한 즉각적인 대응이 필요하다는 작은 느낌이 있습니다. 그러나 여기서 우리는 다른 JVM에 대해 이야기하고 있습니다. 하나의 JVM이 다운 되더라도 다른 JVM은 계속해서 작업을 수행해야합니다.

지금 백만 달러의 질문이 있습니다.이 작업을 수행 할 수있는 좋은 프레임 워크 (생산 준비)가 있습니까? 데이터베이스 레코드, 파일 처리, 전자 메일 처리 및 그와 유사한 특정 요구 사항의 구체적인 구현이있는 경우에도 마찬가지입니다.

Java 병렬 실행 프레임 워크를 보았지만 여러 JVM에 사용할 수 있는지, 그리고 다른 JVM으로 사용할 수 있는지 확실하지 않습니다. 다른 JVM이 계속 사용되는 것은 확실하지 않습니다. 저는 Workers가 여러 JVM에있을 수 있다고 믿습니다. 주인님?

추가 정보 1 : JDK 1.6 요구 사항 때문에 Hadoop이 문제가 될 수 있습니다. 그게 너무 많아.

덕분에, 프랭클린

답변

1

메시지 대기열을 사용할 수도 있습니다. 작업 목록을 생성하고 멋진 작은 덩어리로 패키지하는 프로세스를 하나 만듭니다. 그런 다음 해당 청크를 대기열에 넣습니다. 각 노동자는 대기열에서 무엇인가 나타나기를 기다리고 있습니다. 작업자가 대기열에서 청크를 당겨 처리합니다. 한 프로세스가 중단되면 다른 프로세스가 느슨해집니다. 단순하고 사람들은 오랫동안 그렇게 해왔으므로 그물에 관한 많은 정보가 있습니다.

+0

+1 JMS 솔루션 – akarnokd

0

단일 데이터베이스에서 레코드를 작업하는 경우, 사용하여 데이터베이스 자체 내에서 작업을 수행하는 것이 좋습니다 저장 프로 시저. 다른 기계에서 레코드를 처리하기위한 이득은 데이터베이스와 컴퓨팅 노드간에 작업을 검색하고 전송하는 비용으로 인해 무효화 될 수 있습니다.

파일 처리의 경우 비슷한 경우 일 수 있습니다. (공유 된) 파일 시스템에서 파일을 작업하면 OS에 큰 I/O 압력이 발생할 수 있습니다.

그리고 여러 머신에서 여러 JVM을 유지 관리하는 데 따르는 비용이 과도 할 수 있습니다.

질문 : 일부 분산 시뮬레이션을 수행하기 위해 JADE (Java Agent Development Environment)을 사용했습니다. 그것의 다 기계 지원과 메시지 전달 특성은 당신을 도울지도 모른다.

1

테라코타가이 작업을 수행 할 수 있다고 생각합니다. 웹 페이지를 다루는 경우 JBoss를 클러스터링 할 수 있습니다.

이 작업을 직접 수행하려면 작업 할 작업, 진행중인 작업 및 수행하지 않은 작업을 일정이 잡히는 작업 관리자가 필요합니다. 그 다음에 노동자들은 할 일을 물어보고, 결과를 보내고, 더 묻습니다.

당신이하고 싶은 일을 정교하게 쓰고 싶을 수도 있습니다.

1

앞서 설명한 문제는 마스터/작업자 패턴을 사용하여 가장 잘 해결되었습니다.

JavaSpaces (Jini 프레임 워크의 일부)를 살펴 봐야합니다. 실제로 이런 종류의 작업에 적합합니다. 기본적으로 Command 개체 내부에서 수행 할 각 작업을 캡슐화하고 필요에 따라 하위 클래스로 분류하려고합니다. 이것들을 JavaSpace에 덤프하여 작업자가 한 번에 하나씩 잡아서 처리 한 다음 완료되면 다시 어셈블 할 수 있습니다.

물론 성능 향상은 레코드 집합을 처리하는 데 걸리는 시간에 달려 있지만 JavaSpaces는 여러 컴퓨터에 분산 되어도 문제가 발생하지 않습니다.

+0

JavaSpaces의 구현이 성숙한 것 같지 않습니다 (오픈 소스 의미). 어떤 일이 일어 났는지 알려 주시면 알려 드리겠습니다. 고마워. 그러나 JavaSpaces는 큰 비중을 차지하고 있습니다. 나는 그들이 꽤 성숙했으면 좋겠다. 적어도 아파치 강 !! – Franklin

+0

JavaSpaces 자체는 여전히 사용할 수 있어야합니다 (Jini의 일부로 - http://www.jini.org/wiki/Category:Getting_Started). GigaSpaces는 분명히 성숙한 제품이며 무료 버전을 사용할 수 있습니다. 그러나 나는 그것에 대한 경험이 없었다. 오픈 소스가 필요한 경우 블리츠 (http://www.dancres.org/blitz/)를 살펴보십시오. – akatkinson

+0

SemiSpace도 OSS입니다. http://www.semispace.org/semispace/ –

0

나는 그것을 위해 Jgroups를 사용할 것을 고려할 것이다. jvms를 클러스터링 할 수 있으며 노드 중 하나를 마스터로 선택한 다음 네트워크를 통해 메시지를 보내 다른 노드에 작업을 분산시킬 수 있습니다. 또는 작업 항목을 이미 분할 한 다음 마스터 노드에서 partion-1과 같은 파티션 배포를 관리하면 JVM-4로 이동하고 partion-2는 JVM-3으로 이동하고 partion-3은 JVM-2로 이동하는 등의 작업을 수행 할 수 있습니다. . 그리고 JVM-4가 다운되면 마스터 노드에 의해 실현되고 마스터 노드는 다른 노드 중 하나에게 파티션 1을 시작하도록 지시합니다. 사용하기 쉬운 또 다른 대안은 redis pub sub support입니다. http://redis.io/topics/pubsub. 하지만 당신은 내가 좋아하지 않는 redis 서버를 유지해야 할 것입니다.