2014-08-28 4 views
2

나는 단일 파일이 300MB 인 것을 고려하십시오. block 크기는 128MB입니다. 그래서 입력 파일은 다음 청크로 나누어지고 HDFS에 저장됩니다.HDFS의 Do 블록에 Hadoop에 바이트 오프셋 정보가 저장되어 있습니까?

Block1: 128MB 
Block2: 128MB 
Block3: 64MB. 

이제 각 블록의 데이터에는 byte offset 정보가 들어 있습니까? 즉, 블록에 다음과 같은 offset 정보가 있습니까?

Block1: 0-128MB of File 
Block2 129-256MB of File 
Block3: 257MB-64MB of file 

그렇다면 어떻게 하둡에서 Block2 (즉, 129MB에서 시작)에 대한 바이트 오프셋 정보를 얻을 수 있습니까? 이것은 단지 이해를 돕기위한 것입니다. 블록에 관한 이런 종류의 메타 데이터를 얻기위한 hadoop 명령 줄 도구는 무엇입니까?

편집

바이트 오프셋 정보가 존재하지 않는다면, 블록에 자사의지도 작업을 수행하는 매퍼가 처음부터 선을 소비하기 시작합니다. 오프셋 정보가 있으면 매퍼는 다음 EOL을 찾은 다음 레코드 처리를 시작할 때까지 건너 뜁니다. 그래서 블록 내부에 바이트 오프셋 정보가 있다고 생각합니다.

+0

나 자신은 아니지만, 300mb 파일을 생성하는 작은 스크립트를 작성하여 시작할 것입니다. – admdrew

+1

@admdrew : 300MB 파일을받는 것에 대해 걱정하지 않습니다. 하지만 블록 내부의 메타 데이터 저장 방법에 대한 자세한 내용은 –

+1

동의합니다. 북마크 됨; 누군가가 대답하기를 바랍니다. – admdrew

답변

0

면책 조항 : 본인은 내가 HDFS 소스 코드를 많이 읽지 않았다고 잘못 생각합니다.

기본적으로 datanode는 블록 크기가 큰 블록을 관리합니다. 그들은 블록 ID를 알고 있지만 그 ID는 알고 있습니다. 네임 노드는 모든 것을, 특히 파일 경로와이 파일의 모든 블록 ID와 각 블록이 저장되는 위치 사이의 매핑을 알고 있습니다. 각 블록 ID는 복제 설정에 따라 하나 이상의 위치에 저장 될 수 있습니다.

HDFS가 이러한 방식으로 맵핑을 수행 할 필요가 없기 때문에 블록 ID에서 원하는 정보를 얻기 위해 공용 API를 찾지 못할 것이라고 생각합니다. 반대쪽에서 파일의 블록과 위치를 쉽게 알 수 있습니다. source code, 특히 blockmanager 패키지를 사용해보십시오.

자세한 내용을 보려면 this article about the HDFS architecture이 좋은 시작일 수 있습니다.

+0

죄송합니다. 그러나 어떤 의미에서든이 질문에 대답하지는 않습니다. 나는 NameNode와 Datanodes 사이에서 어떻게 블록의 매핑이 발생 하는지를 안다. 그러나 여기에있는 질문은 블록에서 바이트 오프셋 정보와 더 관련이 있습니다. 그러한 정보가 없으면 블록에서 맵 작업을 수행하는 맵퍼가 처음부터 행을 소비하기 시작합니다. 오프셋 정보가 있으면 매퍼는 다음 EOL을 찾은 다음 레코드 처리를 시작할 때까지 건너 뜁니다. –

+0

DFSInputStream이 어떻게 작동하는지 알고 싶다면 소스 코드를 읽을 수 있습니다. ctor에서'dfsclient.getLocatedBlock'이 호출되어'LocatedBlocks'을 얻는 것을 볼 수 있습니다.그런 다음 블록의 끝 (또는 블록 밖에서 탐색)에 도달하면'blockEnd'가 -1로 설정되어'seekBlockSource' 호출이 트리거되어'LocatedBlocks.findBlock'이 호출됩니다. 'LocatedBlock'는 크기와 오프셋을 가지며, 그들은 오른쪽 블록을 찾기 위해 이진 검색이 정렬됩니다. 좋은 답변을 얻으려면 질문의 문맥을 명확하게 정의해야한다고 생각합니다. –

0

hdfs fsck /path/to/file -files -blocks을 실행하여 블록 목록을 가져올 수 있습니다.

Block에는 오프셋 정보가없고 길이 만 있습니다. 그러나 LocatedBlocks을 사용하여 파일의 모든 블록을 가져올 수 있으며,이 블록에서 오프셋이 시작되는 각 블록을 쉽게 재구성 할 수 있습니다.

+0

위의 편집에서 질문을 볼 수 있습니까? 블록에 대한 오프셋 정보가 어딘가에 존재해야합니다. 그렇지 않으면 레코드 경계가 제대로 설정되지 않습니다. –

+1

레코드는 맵핑 된 개념입니다. 블록은 HDFS 개념이며 맵핑과 관련이 없습니다. 블록에는 오프셋이 없지만 오프셋은 입력 형식으로 전달 될 수 있습니다. –

+0

각 블록은 일반적으로 논리적 파티션 인 inputSplit에 해당합니다. 어떤 경우에 inputSplit이 어떤 블록을 처리하고 있는지 알기 위해서는 sowmehow에서 바이트 오프셋을 정확하게 알아야합니까? –