2017-03-24 22 views
0

두 대의 컴퓨터로 구성된 하둡에 다중 노드 클러스터가 있습니다. 첫 번째 머신 (마스터 및 슬레이브 구성)은 이름 노드와 데이터 노드를 실행하고 두 번째 머신 (구성된 슬레이브)은 데이터 노드를 실행합니다.Hadoop의 데이터 노드/Slavenodes간에 데이터를 배포하는 방법은 무엇입니까?

그들 사이의 데이터를 거의 똑같이 업로드하고 배포하고 싶습니다.

먼저 :

나는 두 가지 시나리오가 나는 크기가 500메가바이트의 파일 FILE1이 있다고 가정하고 내가 사용 먼저 컴퓨터에 업로드 :

hadoop fs -put file1 hdfspath 

가 양쪽으로 분할 될 것인가 데이터 노드 또는 첫 번째 기계에만 저장?

배포가 시작될 때 : 첫 번째 컴퓨터에서 블록 크기를 초과 한 후 배포하거나 다른 기준이있는 경우입니까?

각 데이터 노드에 대해 똑같이 250MB로 나눕니까?


둘째 : 나는 250이 있다고 가정 크기가 각각 2MB의 파일 내가 사용하는 최초의 기계에 DIR1이 들어있는 폴더를 업로드 :

hadoop fs -put dir1 hdfspath 

같은 질문 : 데이터에 배포됩니다 두 기계 또는 첫 번째 기계에서만. 또한 배포가 언제 어떻게 발생합니까?

감사합니다.

답변

0

HDFS에 파일을 쓸 때 데이터 블록이라고 불리는 척으로 나뉘며 블록 크기는 hdfs-site.xml (일반적으로 128MB)의 dfs.block.size 매개 변수로 제어됩니다. 각 블록은 동일한 파일의 매개 변수 dfs.replication에 의해 제어되는 하나 이상의 노드에 저장됩니다 (기본값은 3). 노드에있는 블록의 각 복사본을 복제본이라고합니다. 이 이루어집니다

방법은 : -

HDFS 파일에 데이터를 작성, 데이터는 첫 번째 클라이언트에서 로컬 캐시에 기록됩니다. 캐시가 특정 thresold (블록 크기, 기본값 128MB)에 도달하면 클라이언트는 NameNode (메타 데이터를 유지 관리)에서 DataNodes 목록을 요청하고 검색합니다. 이 목록에는 공백이 있고 해당 블록의 복제본을 가질 수있는 DataNode가 들어 있습니다. 복제본 데이터를 가질 수있는 DataNode의 수는 복제 인수를 기반으로합니다. 그런 다음 클라이언트는 DataNode 사이에 데이터를 플러시하는 파이프 라인을 만듭니다. 첫 번째 DataNode는 데이터 수신을 시작합니다 (기본 io.file.buffer.size는 4KB, I/O 작업에 대해 hadoop 사용). 버퍼링 된 데이터를 노드의 로컬 디렉토리에 쓴 다음 동일한 버퍼링 된 데이터를 목록의 두 번째 DataNode로 전송합니다 . 두 번째 DataNode는 차례대로 데이터 블록의 버퍼링 된 데이터 수신을 시작하고 로컬 dir에 쓴 다음 동일한 데이터를 세 번째 DataNode로 플러시합니다. 마지막으로, 세 번째 DataNode는 로컬 dir에 데이터를 씁니다.

첫 번째 블록이 채워지면 클라이언트는 다음 블록의 복제본을 호스트하기 위해 NameNode에서 선택된 새 DataNode를 요청합니다.이 흐름은 파일의 마지막 블록까지 계속됩니다. 각 블록에 대한 DataNode의 선택이 다를 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 데이터의 밸런스를 조정해야합니다. 그렇지 않으면 모두 하나의 데이터 노드에 저장됩니다. 나는 우리가 사용해야한다고 읽었습니다 : hdfs hdfs balancer.그런데 Hadoop의 웹 인터페이스에서 각 노드의 데이터를 보는 방법 즉 URL은 무엇입니까? –