2013-05-05 2 views
5

각 읽기/쓰기 작업에 걸리는 시간을 측정하여 각 데이터 노드에서 처리량을 측정하고자합니다. 백만 가지 기능을 읽고 이것이 어디에서 일어나는지 알아내는 것은 매우 혼란 스럽습니다. 누군가가 데이터 블록을 읽거나 쓰는 동안 일련의 호출을 나열 할 수 있습니까? 버전 1.0.1을 사용 중입니다. 또는 데이터 노드에서이를 측정하는 API가 이미있는 경우 해당 정보를 사용할 수 있습니다.데이터 노드에서 처리량 측정

+1

현상금 메모 : 노드를 블랙리스트에 추가하면 더 이상 클러스터에 참여하지 않으므로 처리량이 결코 복구되지 않습니다. – likeitlikeit

+0

안녕하세요 버그 포수, 아래 내 대답에 대한 생각? – Engineiro

+0

@likeitlikeit 나는 하트 비트를위한 기존 정책의 라인에서 뭔가를했다 : 세 번의 기회를주고 여전히 나쁘면 블랙리스트에 올린다. 어쨌든 실제 사용을 목적으로하지 않습니다. –

답변

1

처리량을 측정하기 위해 연구해야하는 중요한 클래스는 쓰기의 경우 FSDataOutputStream이고 읽기의 경우 FSDataInputStream입니다.

파일 읽기 :을 파일을 읽을 때 노드가 FileSystem 개체에 대한 호출 open()입니다 않는 것을 가장 먼저하는 일. 이 시점에서이 노드가 곧 읽기 시작하고이 호출이 성공적으로 반환 된 후 코드를 배치하여 측정을 준비 할 수 있음을 알 것입니다. HDFS에서 open()을 호출하면 DistributedFileSystem이 NameNode와 통신하여 블록 위치를 수집합니다 (호출 노드 근접성에 따라 정렬 됨). 마지막으로 DistributedFileSystem 개체는 DFSInputStream ("읽음 블록"을보고 실패를 처리 함)을 다시 랩하는 FSDataInputStream (파일을 읽는 것을 봅니다)을 반환합니다. 귀하의 측정 범위는 read()close()FSDataInputStream로 전화하십시오.

파일 쓰기 : 노드는 FileSystem에서 create()을 호출합니다. 이 시점에서 파일 사용 권한, 가용성 등을 포함하는 다양한 검사가 이루어 지지만, 성공적으로 완료되면을 반환하는 FSDataOutputStream 개체를 반환합니다. 동일한 개념이 연속 쓰기를 보는 경우에 적용되며, 다른 하나는 복제 인수의 일관성 (즉, 쓰기 = 3 회 쓰기) 및 실패를 처리합니다. 읽기와 마찬가지로 write()close() 전화에서 FSDataInputStream으로 전화를 걸어 측정 범위를 지정합니다.

클러스터의 모든 노드에 대해이를 전역 적으로 수행하려면 클러스터에서 공유하는 Hadoop 배포의 일부로이 메소드를 대체해야합니다.

+0

각 데이터 노드의 통계를 집계하는 방법을 설명하지 않습니다. 클라이언트 노드는 개별 데이터 노드를 프로파일 링하고 이름 노드에 정보를 보낼 것으로 예상 할 수 없습니다. 어쨌든, 내 필요가 지나간 이후로 나는이 대답을 받아 들일 것이다. –