2010-04-27 4 views
2

에 결합갖는 두 세트는 내가 예와 함께 제시하려고합니다 비교적 간단한 하둡 질문이 하둡

는 문자열 목록 및 큰 파일이 있고이 과정 각 매퍼 싶은 말 한 파일과 grep 같은 문자열의 문자열.

어떻게해야합니까? mappers의 수는 inputSplits가 생성 한 결과라고 생각합니다. 나는 각 문자열에 대해 하나씩 후속 작업을 실행할 수 있지만 다소 복잡해 보입니다.

편집 : 실제로 grep map reduce 버전을 빌드하려고하지 않습니다. 나는 이것을 매퍼 (mapper)에 2 개의 서로 다른 입력을 갖는 예제로 사용했다. 목록 A와 B를 나열하고 매퍼가 목록 A의 요소 1 개와 목록 B의 요소 1 개를 작업한다고 가정 해 보겠습니다.

따라서 체인에 대한 필요성을 초래할 수있는 데이터 종속성이없는 경우 작업은 모든 매퍼에서 모든 목록 A를 어떻게 든 공유 한 다음 목록 B의 1 개 요소를 각 매퍼에 입력하는 유일한 방법입니까?

내가하려는 일은 내 데이터에 대한 접두사가있는 룩업 구조의 일부 유형을 구축하는 것입니다. 그래서 거대한 텍스트와 문자열이 있습니다. 이 프로세스는 강력한 메모리 병목 현상을 가지고 있으므로 매퍼마다 1 줄의 텍스트/1 줄을 사용했습니다.

+1

grep과 같이하고 싶습니까? 그렇다면 원하는 모든 패턴을 매퍼에 보관 한 다음 각 패턴에 대해 각 데이터 행을 테스트하는 것이 더 효율적일 수 있습니다. – Bkkbrad

+0

은 각 매퍼가 해당 텍스트의 모든 문자열을 반복해야 함을 의미합니다. 나는 그것에 대해 생각해 봤지만 병렬성을 방해하지 않겠는가? – aeolist

답변

1

매퍼는 독립적이고 W/O 부작용없이 작동 할 수 있어야합니다. 병렬 처리는 매퍼가 모든 패턴과 라인을 일치 시키려고 시도 할 수 있습니다. 각 입력은 한 번만 처리됩니다!

그렇지 않으면 각 입력 행에 패턴 수를 곱할 수 있습니다. 단일 패턴으로 각 라인을 처리하십시오. 나중에 감속기를 가동하십시오. A ChainMapper은 여기에서 선택한 솔루션입니다. 하지만 기억하십시오 : 두 패턴과 일치하면 라인이 두 번 나타납니다. 너가 원하는게 그거야?

제 생각에는 첫 번째 시나리오를 선호하는 것입니다. 각 매퍼는 선을 독립적으로 처리하고 알려진 모든 패턴과 비교하여 검사합니다.

힌트 : DistributedCache 기능을 사용하여 패턴을 모든 매퍼에게 배포 할 수 있습니다! ;-) 입력은 InputLineFormat으로 분할되어야합니다

+0

대답 해 주셔서 감사합니다. 제 질문을 편집하여 실제로 내가 무엇을하고 있는지 명확히하려고합니다. – aeolist

+0

아, 제 잘못, ChainMapper에 대해 언급 해주십시오. 그 후에 문제를 모델링하는 방법이 분명하지 않습니다. 그때. "각 입력 줄에 패턴의 수를 곱하십시오. 각 줄을 단일 패턴으로 처리하십시오"라는 메시지는 나에게 다소 모호합니다. 어쨌든 나는 그 접근법을 시도 할 것이다. – aeolist

0

편집 관련 : 일반적으로 매퍼는 한 번에 2 개의 요소를 처리하는 데 사용되지 않습니다. 그는 한 번에 하나의 요소 만 처리해야합니다. 작업은 각각의 입력 레코드에 대한 매퍼가있을 수 있고 올바르게 실행될 수있는 방식으로 으로 디자인되어야합니다.

물론 매퍼는 입력을 처리하기 위해 지원 정보가 필요합니다. 이 정보는 작업 구성 (예 : Configuration.setString())을 사용하여 무시할 수 있습니다. 더 큰 데이터 세트는 분산 캐시를 통해 전달됩니다.

이 옵션 중 하나를 사용 했습니까? 내가 완전히 문제를 이해하는 경우 나는 그 BTW ;-)

일을한다면 그래서 직접 확인하시기 바랍니다 확실하지 않다 : 내도에 대한 절상 투표 조사 이전의 대답은 좋은 것입니다 ;-)

+0

당신은 옳습니다, 투표는 순서에 있습니다. 내가 n * m 매퍼가 필요하다고 말했기 때문에 위의 대답 이외에 다른 방법이 있습니까? 모든 매퍼 프로세스가 각각의 분할에 대한 모든 문자열을 갖는 것은 나쁜 시나리오입니다. 제 처리가 너무 무거워요. – aeolist

0

좋은 친구가 큰 영향을주었습니다. 2 명의 매퍼를 연결하는 것은 어떨까요?

을 주로 실행하면 매퍼를 실행하는 작업 (감속기 없음)을 실행합니다. 입력은 문자열 목록이며 각 매퍼가 하나의 문자열 만 가져올 수 있도록 배열 할 수 있습니다.

차례로 첫 번째 매퍼가 새 작업을 시작합니다. 여기서 입력은 텍스트입니다. 컨텍스트에서 변수를 설정하여 문자열을 전달할 수 있습니다.

+0

글쎄, 컨텍스트를 통해 ChainMappers 및 Passing 변수가 내게 새로운 것으로 보이지는 않습니다 ... 어쨌든 : 새로운 작업을 시작하는 각 매퍼는 저에게 끔찍한 소리를냅니다! n 개의 문자열이 있으면 n 개의 작업이 필요합니다. * urgs * :-(모든 매퍼는 모든 문자열을 한 번에 레코드로 처리해야합니다. 내 말 들어보십시오 ;-) –

+0

정말 필요한 것 같습니다. 내 매퍼는 데이터 구조를 생성하는 분할 크기의 10 배가 될 것입니다. 나는 캐시 등으로 가고 싶지 않다. 또 다른 제안 된 아이디어는 데이터 자체에 대해 이것을 수행하는 것이다. 모든 것을 입력 폴더에서 선험적으로 결합하는 것이다. 300 개의 문자열과 10GB의 입력 시퀀스가 ​​있다고 상상해보십시오. 네, 그 아이디어는 300 * 10GB 입력을 포함합니다 ... 추한 – aeolist

+0

그래서 많은 데이터를 다루는 적은 수의 작업 또는 적은 수의 데이터를 다루는 많은 수의 작업입니까? 나는 두 번째와 함께 갈거야. btw chainmapper는 실제로 도움이되지 않습니다. 왜냐하면 저는 다음과 같은 라인을 생각하고 있습니다. 작업을 시작하고 감속기를 사용하지 말고 input_strings을 가리 키십시오. 이 매퍼는 새로운 작업을 시작하고 문자열을 설정하는 for 루프를 가지고 있습니다. – aeolist