2012-11-19 4 views
6

Hadoop에서 I/O 활동을 테스트하기 위해 디스크 집약적 인 Hadoop 응용 프로그램을 찾고 있었지만 디스크 사용률을 50 % 또는 그 이상으로 유지하는 응용 프로그램을 찾을 수 없었습니다 디스크를 실제로 사용중인 응용 프로그램. 난 randomwriter를 시도했지만 놀랍게도 디스크 입출력은 집중적이지 않습니다.Hadoop에서 HDFS로 파일 쓰기

그래서 저는 Mapper에서 파일을 만들고 그것에 텍스트를 쓰는 작은 프로그램을 작성했습니다. 이 응용 프로그램은 잘 작동하지만 이름 노드, 작업 추적자 및 슬레이브 중 하나 인 마스터 노드에서만 사용률이 높습니다. 디스크 사용률은 NIL이거나 다른 작업 추적기에서는 무시할 수 있습니다. 디스크 I/O가 작업 추적 프로그램에서 너무 낮은 이유를 이해할 수 없습니다. 누군가 내가 잘못하고 있다면 올바른 방향으로 나를 밀어 주시겠습니까? 미리 감사드립니다.

여기 내가 생각

Configuration conf = new Configuration(); 
FileSystem fs = FileSystem.get(conf); 
Path outFile; 
while (itr.hasMoreTokens()) { 
    word.set(itr.nextToken()); 
    context.write(word, one); 
    outFile = new Path("./dummy"+ context.getTaskAttemptID()); 
    FSDataOutputStream out = fs.create(outFile); 

    out.writeUTF("helloworld"); 
    out.close(); 
    fs.delete(outFile); 
    } 

파일 -
+0

I/O 벤치마킹의 경우 TestDFSIO를 볼 수도 있습니다. http://answers.oreilly.com/topic/460-how-to-benchmark-a-hadoop-cluster/ –

+0

@LorandBendig 14 개 노드로 구성된 클러스터에서 발견 된 TestDFSIO의 디스크 사용률이 2.4 %에 불과하며 평균은 약 0.07 %입니다. _iostat_ 명령으로 디스크 사용량을 측정하고 있는데 작업이 약 300 초 동안 실행되었습니다. 내가하고있는 일을 잘 모르는 뭔가가 정말 바보 같은가요? –

+0

당신은 매개 변수 (nr of files, size)로 플레이해도 좋지만 이미 그렇게했다고 생각합니다. 시도해 볼 수있는 추가 테스트가 있습니다. http://www.michael-noll.com/blog/2011/04/09/benchmarking-and-stress-testing-an-hadoop-cluster-with-terasort -testdfsio-nnbench-mrbench/ –

답변

0

확인. 나는 전에 확인하지 않았기 때문에 정말로 어리 석었을 것임에 틀림 없었다. 실제 문제는 모든 데이터 노드가 실제로 실행되고 있지 않다는 것입니다. 나는 namenode를 다시 포맷하고 모든 것이 제자리로 돌아갔습니다. WC에 나쁜 영향을주지 않는 15-20 %의 활용도를 얻었습니다. 나는 TestDFSIO를 위해 그것을 실행할 것이고 내가 디스크를 훨씬 더 활용할 수 있는지 알아볼 것이다.

1

로 만들고 UTF 문자열을 작성하는 WordCount.java 파일에 쓴 내 샘플 코드 세그먼트입니다 각 행에 셀 당 자바 객체를 생성 어떤 메커니즘, 디스크에 저장하기 전에 Java 객체의 직렬화를 수행하면 IO를 활용할 기회가 거의 없습니다.
제 경험상 직렬화는 초당 수 MB 또는 초당 100MB의 속도로 작동합니다.
출력 경로에서 hadoop 레이어를 피하는 것이 옳았습니다. 이제 HDFS 로의 쓰기 작업을 고려해보십시오. 데이터는 로컬 데이터 노드를 통해 로컬 디스크에 쓰여지고 복제 계수에 따라 네트워크의 다른 노드에 동 기적으로 기록됩니다. 이 경우 HDFS에 더 많은 데이터를 쓰고 네트워크 대역폭을 쓸 수 없습니다. 클러스터가 상대적으로 작 으면 가치가 있습니다. 3 노드 클러스터 및 3 중 복제의 경우 모든 데이터를 모든 노드로 경로 지정하므로 전체 클러스터 HDFS 쓰기 대역폭은 해당 네트워크를 보유한 경우 약 1GBit입니다.
따라서 제안 할 내용은 다음과 같습니다.
a) 복제 인수를 1로 줄이면 네트워크에 바인딩되지 않습니다.
b) 매퍼 호출 한 번에 더 큰 데이터 청크를 작성하십시오.

+0

복제 계수를 1로 변경하고 블록 크기를 각각 1KB와 1MB로 변경했습니다. 필자의 관찰은 map-reduce가 매우 천천히 실행되고 입출력이 마스터 노드에서만 높다는 것입니다. 또한 모든 단어가 발견 될 때 파일에 쓰는 위의 코드와 달리 매퍼에서 한 번만 작성하려고했습니다. 여전히 동작은 동일하게 유지되었습니다. –

+0

얼마나 많은 매퍼가 동시에 실행되고 있습니까? 관찰 한 노드 당 디스크 대역폭이란 무엇입니까? –

+0

지도 작업 시작 = 3, 작업 시작 = 1,지도 작성 실행.tasktracker.map.tasks.maximum = 2, mapred.tasktracker.reduce.tasks.maximum = 2. 3 노드의 디스크 사용률은 거의 0이고 마스터 노드의 디스크 사용률은 100 %입니다. –