2011-12-10 4 views
6

하나의 시스템에서 HDFS 클라이언트를 사용하여 HDSF 클러스터에서 분산 읽기를 구현할 수 있습니까?Map/Reduce없이 HDFS 분산 읽기

저는 3 개의 데이터 노드 (DN1, DN2, DN3)로 구성된 클러스터로 실험을 수행했습니다. 그런 다음 DN1에있는 클라이언트 프로그램에서 10 개의 독립적 인 파일에서 10 개의 동시 읽기를 실행하며 DN1에서 데이터를 읽는 것으로 나타났습니다. 다른 데이터 노드 (DN2, DN3)는 활동이 없음을 보여주었습니다 (디버그 로그로 판단).

모든 파일 블록이 3 개의 데이터 노드 모두에서 복제되었는지 확인 했으므로 DN1을 종료하면 데이터가 DN2 (DN2 만)에서 읽혀집니다.

읽는 데이터 양이 많아지지 않아서 (2GB에서 30GB로 시도) 도움이되지 않았습니다.

나는 여러 개의 큰 파일을 읽고 그 중 적은 양의 데이터 (몇 Kb)를 추출 할 필요가 있기 때문에 더 많은 서비스를 설정해야하기 때문에 map/reduce를 사용하지 않는 것이 좋습니다. 각 분할 작업의 HDFS 로의 출력. 오히려 결과를 데이터 노드에서 내 클라이언트 프로그램으로 직접 스트리밍하는 것이 좋을 것입니다. 나는 (jdk7)이 방식으로, 읽기/쓰기 데이터 SequenceFile 사용하고

은 :

//Run in thread pool on multiple files simultaneously 

List<String> result = new ArrayList<>(); 
LongWritable key = new LongWritable(); 
Text value = new Text(); 
try(SequenceFile.Reader reader = new SequenceFile.Reader(conf, 
            SequenceFile.Reader.file(filePath)){ 
    reader.next(key); 
    if(key.get() == ID_I_AM_LOOKING_FOR){ 
    reader.getCurrentValue(value); 
    result.add(value.toString()); 
    } 
} 

return result; //results from multiple workers are merged later 

어떤 도움에 감사드립니다. 감사!

답변

7

내가 보는 행동은 디자인에 의한 것입니다. Hadoop document에서 :

복제 선택

글로벌 대역폭 소비를 최소화하고 대기 시간을 읽으려면, HDFS는 독자에 가장 가까운 복제에서 읽기 요청을 만족시키기 위해 을 시도합니다. 판독기 노드와 동일한 랙에 복제본이있는 경우 복제본이 읽기 요청을 충족시키는 것이 좋습니다. angg/ HDFS 클러스터가 여러 데이터 센터에 걸쳐있는 경우 이 로컬 데이터 센터에 상주하는 복제본이 모든 원격 복제본보다 우선합니다.

Hadoop source code 대응하여 확인할 수 있습니다 : 전 하나에 오류가 발생하지만 가장 가까운 사람이 항상 첫 번째 경우

LocatedBlocks getBlockLocations(...) { 
    LocatedBlocks blocks = getBlockLocations(src, offset, length, true, true); 
    if (blocks != null) { 
     //sort the blocks 
     DatanodeDescriptor client = host2DataNodeMap.getDatanodeByHost(
      clientMachine); 
     for (LocatedBlock b : blocks.getLocatedBlocks()) { 
     clusterMap.pseudoSortByDistance(client, b.getLocations()); 

     // Move decommissioned datanodes to the bottom 
     Arrays.sort(b.getLocations(), DFSUtil.DECOM_COMPARATOR); 
     } 
    } 
    return blocks; 
    } 

즉, 사용 가능한 모든 복제본이 다른 후 하나를 시도하고 있습니다.

한편, HDFS Proxy을 통해 HDFS 파일에 액세스하면 데이터 노드 randomly을 선택합니다. 그러나 나는 그것이 당신이 원하는 것이라고 생각하지 않습니다.

+0

감사합니다. 그것은 그것을 설명한다! 프록시 팁 주셔서 감사. – rodion

+1

Hadoop은 어느 노드가 어떤 랙에 있는지 어떻게 알 수 있습니까? - http://hadoop.apache.org/common/docs/current/cluster_setup.html#Hadoop+Rack+Awareness –

+0

"angg"란 무엇입니까? –

3

에드워드 (Edwardw)는 현재 클러스터가 매우 작고 (단지 3 개의 노드 만)이 경우 모든 노드의 파일을 볼 수 있다고 말했습니다. Hadoop의 기본 복제 요소도 3이기 때문에 이러한 상황이 발생합니다. 대규모 클러스터에서는 각 노드에서 파일을 사용할 수 없으므로 여러 파일에 액세스하면 서로 다른 노드로 이동하여로드가 분산 될 수 있습니다.

더 작은 데이터 세트로 작업하는 경우 당신은 내가 당신의 경우는 MR에 대한 좋은 소리 말할 것

+0

당신 말이 맞아요. 나는 실제로 클러스터 전체에 블록을 균등하게 분산시키려는 시도로 1 복제를 시도했지만 DN1에 모든 블록을 씁니다. ((다른 노드에서 분산되기 전에 더 많은 데이터와 블록이 필요합니다. – rodion

0

(분할 지역으로) 당신이 작은 덩어리로 일을하고 노드간에로드를 분산 할 수있는 HBase를보고 할 수 있습니다. 특정 MR 계산 패러다임을 제쳐 놓으면 hadoop은 반대가 아닌 데이터에 코드를 가져 오기 위해 만들어 졌다는 것을 알 수 있습니다. 확장 가능한 데이터 처리를 위해서는 코드를 데이터로 이동하는 것이 필수적입니다.
반면에 MapReduce를 설정하는 것이 HDFS보다 쉽습니다. 작업간에 상태를 저장하지 않기 때문입니다.
동시에 MR 프레임 워크는 당신을 위해 병렬 처리에 신경을 쓸 것입니다.
데이터 처리 결과가 너무 작 으면 감속기에서 함께 결합하면 성능에 큰 영향을 미치지 않습니다.
즉, MapReduce의 사용을 재검토 할 것을 제안합니다.

+0

감사합니다. 몇 가지 성능 테스트가 필요합니다 :) – rodion

+0

일부 정보를 입력하지 않으면 견적을 얻으 려 노력합니다 –

+0

감사합니다. 매우 간단합니다. 기본적으로 로그 데이터의 대용량 파일에 대한 grep과 같은 검색입니다. 로그 데이터는 임의의 콘텐츠가 될 수 있습니다. 다음과 같은 두 가지 유형의 검색이 있습니다. 1) grep과 유사한 하위 문자열/정규 표현식으로 내용 일치 2) 알려진 로그 찾기 위치 (위치/ID는 별도로 저장 됨)로 콘텐츠를 가져옵니다. 결과 집합은 항상 작을 것으로 가정 할 수 있습니다 (0 ~ 100 개의 로그). 또한 블록 압축 ('SequenceFile' API 사용)을 사용하고 있습니다. – rodion