2012-04-25 2 views
0

저는 Apache와 Yahoo의 DistributedCache 튜토리얼을 읽었습니다. 나는 아직도 혼란 스럽다. 모든 데이터 노드에 복사 할 파일이 있다고 가정합니다. 따라서 작업 동인에 DistributedCache.addCacheFile(new URI(hdfsPath),job)을 사용하여 파일을 사용 가능하게 만듭니다. 그런 다음 내 맵퍼에 DistributedCache.getLocalCacheFiles(job)이라고 부릅니다.Hadoop DistributedCache

이제 map()이 실행될 때마다 배열의 요소에 액세스 할 수 있도록이 파일의 내용을 기반으로 데이터 노드에 배열을 만들고 싶습니다. 내가 할 수 있을까? 캐시 된 파일을 읽고 Mapper 클래스 내에서 배열을 만들면 매퍼별로 한 번만 입력하는 대신 매퍼에 대한 각 새 입력에 대한 배열을 만드는 것처럼 보이기 때문에 혼란 스럽습니다. 이 부분은 실제로 어떻게 작동합니까 (즉, 배열을 어디에 만들어야합니까?).

+0

나는 내 자신의 질문에 대한 답을 찾은 것 같다. Mapper가 인스턴스화 될 때 configure() 메소드가 자동으로 호출되는 것처럼 보입니다. 따라서 configure()를 사용하여 배열을 작성해야합니다. 이것은 map() 메서드 외부에 있으므로 한 번만 발생합니다. 나는 그것이 옳다는 것을 희망한다! – occasionalUser

답변

2

여기에 몇 가지 개념이 혼합되어 있습니다. 데이터 노드는 DistributedCache와 직접 관련이 없습니다. 그것은 MapReduce 레이어의 개념입니다.
매퍼간에 캐시 된 파일에서 동일한 파생물을 재사용하려는 욕구는 MR 패러다임의 기능적 특성과 모순되는 경우가 있습니다. 맵퍼는 논리적으로 독립적이어야합니다.
맵퍼 용 캐시 파일의 전처리가 비교적 비쌉니다. 최적화 된 일종의 도구입니다.
전처리 된 데이터를 일부 정적 변수에 저장하고 지연 평가하고 설정하여 어느 정도 수행 할 수 있습니다 태스크간에 가상 머신을 재사용하기위한 hadoop. "MR"정신 솔루션이 아니지만 작동해야합니다.
더 나은 솔루션은 캐시 된 파일을 양식으로 사전 처리하는 것입니다. 여기서 매퍼의 사용량은 저렴합니다.
모든 아이디어가 일종의 최적화라고 가정합니다. 그렇지 않으면 각 매핑에 대해 파일을 읽고 처리하는 것이 좋습니다.
각 매퍼의 파일을 준비하는 것이 맵 처리보다 훨씬 저렴하거나 매퍼 실행 오버 헤드보다 훨씬 저렴하다고 말할 수 있습니다.
형식은 파일의 형식을 의미하며, 이는 우리가 필요로하는 메모리 내 구조로 매우 효율적으로 변환 될 수 있습니다. 예를 들어 데이터에서 일부 검색이 필요한 경우 이미 정렬 된 데이터를 저장할 수 있습니다. 그것은 매번 디스크를 순차적으로 읽는 것보다 훨씬 더 비싸다. 매번 정렬하는 시간을 절약 할 수있다.
당신의 경우에는 약간의 수의 속성이다. (수천이라고하자.) 읽기와 초기화가 중요하지 않다고 생각할 수있다. 단일 매퍼에

+0

나는 Mappers를 독립적으로 만들고 싶습니다. 각 사용자에게 동일한 데이터 사본이 있어야합니다 (예 : 입력의 userID가 키로 전달되고 액세스하려는 파일에 저장된 사용자의 일부 속성이 있음). 매번 입력의 일부로 속성을 전달하는 대신 각 노드의 단일 파일에 모든 사용자에 대해 한 번만 나열하는 것이 더 나을 것이라고 생각했습니다. "캐시 된 파일을 양식에 사전 처리"한다는 의미를 이해하고 있는지 확신 할 수 없습니다. 여기서 양식의 의미를 설명 할 수 있습니까? – occasionalUser

+0

답변에 대한 설명을 추가했습니다. –

+0

추가 설명을 제공해 주셔서 감사합니다. – occasionalUser

관련 문제