2011-12-10 14 views
6

1台のマシンで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であるために発生します。大きなクラスタでは、各ノードでファイルを使用できないため、複数のファイルにアクセスすると、異なるノードに移動して負荷が分散する可能性があります。

あなたは小さなデータセットで作業する場合、あなたは小さな塊と協力し、(領域を分割することによって)ノード間で負荷を分散されますHBaseのを見てみたいことがあり

+0

あなたは正しいです。私は実際にブロックをクラスタ全体に均等に分散しようとすると1に設定しようとしましたが、DN1にそれらをすべて書き込んでしまいました。((別のノード間でバランスをとる前に、 – rodion

0

私はあなたの場合は、MRのための良い音ことを言うだろう。特定のMR計算パラダイムを脇に置いた場合、ハーフ・ループは、逆の代わりにデータにコードを持ち込むように構築されていることがわかります。スケーラブルなデータ処理を行うには、コードをデータに移動することが不可欠です。
MapReduceは、ジョブ間に状態を保存しないため、HDFSより簡単です。
同時に、MRフレームワークはあなたのために並列処理を気にします。何かを正しく実行するには時間がかかるでしょう。
データ処理の結果が非常に小さい場合、還元剤で一緒に組み合わせるとパフォーマンスに大きな影響はありません。
つまり、MapReduceの使用を再考することをお勧めします。

+0

ありがとうございます。いくつかのパフォーマンステストが必要です:) – rodion

+0

私がいくつかの情報を落とすならば、私は見積もりでheloにしようとします –

+0

ありがとう、それはかなりシンプルですが、 1)grepのような部分文字列/正規表現による内容の一致2)既知のログへのシーク(2つのタイプの検索があります) (position/idは別々に保存されます)、コンテンツを取得するだけです。結果セットは常に小さくなると想定できます:0〜100ログ。また、ブロック圧縮を使用しています( 'SequenceFile' APIを使用しています)。 – rodion

関連する問題