2012-03-02 4 views
0

내 맵 함수 내에서 호출되는 쉘 함수가 있습니다. 쉘 함수는 입력 파일과 출력 파일이라는 두 개의 매개 변수를 취합니다. 이 input.txt를 파일이 HDFS에 상주하며 경우 output.txt 파일이 다시 HDFS에 기록 될 필요가 있다는이HDFS에서 쉘 함수로 직접 파일 읽기

$> unix-binary /pathin/input.txt /pathout/output.txt 

문제와 같은 뭔가가있다. 현재는 fs.copyToLocalFile으로 필요한 파일을 로컬 하드 드라이브에 복사하고 unix 바이너리를 호출 한 다음 fs.copyFromLocalFile으로 HDFS에 output.txt를 다시 작성합니다. 이 접근법의 문제점은 성능을 저하시키는 HDD에 상당한 양의 읽기 및 쓰기가 필요하기 때문에 최적이 아니라는 것입니다. 그래서, 내 질문은 어떻게 HDFS 파일을 직접 입력으로 읽고 결과를 HDFS로 직접 출력 할 수 있는가하는 것입니다. 분명히 $>unix-binary hdfs://master:53410/pathin/input.txt' hdfs://master:54310/pathout/output.txt 이 작동하지 않습니다. 주위에 다른 방법이 있습니까? 어떻게하면 HDFS 파일을 loacl 파일로 취급 할 수 있습니까? C로 작성된 유닉스 이진 소스 코드에 접근 할 수 있습니다. 소스 코드를 변경하면 도움이 될까요? 감사합니다.

답변

0

파일을 DistributedCache에 추가하고 캐시의 매퍼에서 액세스 할 수 있습니다. 로컬 파일에서 쉘 함수를 호출하고 출력 파일을 로컬 디스크에 기록한 다음 로컬 파일을 HDFS에 복사합니다.

그러나 셸 함수 호출 또는 매퍼/축소 기 내에서 읽기/쓰기와 같은 작업은 MapReduce 패러다임을 손상시킵니다. 이러한 작업을 수행해야하는 경우 MapReduce가 원하는 솔루션이 아닐 수도 있습니다. HDFS와 MapReduce는 소수의 대용량 파일에 대규모 일괄 처리를 수행하도록 설계되었습니다.

유닉스 - 바이너리 소스 코드에 액세스 할 수 있으므로, java에서 원하는 특정 기능을 구현하는 것이 가장 좋습니다. 입력 파일을 매퍼에 공급하고 HDFS/LocalFS의 파일 작업보다는 데이터의 매퍼에서 함수를 호출하십시오.

관련 문제