2013-02-25 12 views
11

私は、HDFSがデータノードに通常のLinuxファイルシステムを使ってデータを保存していることを知っています。私のHDFSブロックサイズは128 MBです。私は、HDFSが利用可能なストレージとして最初にを持っているという意味で、私のハーフープクラスタにディスク容量の10 GBがあるとします。HDFSのブロックサイズと実際のファイルサイズ

たとえば、12.8 MBという小さなファイルを作成すると、利用可能なHDFSブロックは79になります。12.8 MBという別の小さなファイルを作成するとどうなりますか? #availbaleブロックは79に留まるのか、それとも78になるのでしょうか?前者の場合、HDFSは基本的に各ブロック割り当て後に使用可能な空きディスク容量に基づいて#利用可能なブロックを再計算するので、使用可能なブロックは128MB以上のディスク容量が消費された後にのみ78になります。どうか明らかにしてください。

答えて

18

私が知る最も良い方法は、試してみることです。私の結果は以下のとおりです。

しかし、試してみる前に、自分の設定に80 ブロックだけを割り当ててもブロックを割り当てることができます.80以上の空でないファイルを割り当てることができます。これは、空でないファイルを割り当てるたびにHDFSがフルブロックを使用しないと思うからです。別の言い方をすれば、HDFSブロックはストレージ割り当てユニットではなく、レプリケーションユニットです。 HDFSのストレージ割り当て単位は、基礎となるファイルシステムの単位であると思います(ブロックサイズが4 KBのext4を使用し、レプリケーションファクタが3のクラスタに1 KBのファイルを作成した場合、3 KB = 12 KBのハードディスク容量)。

十分に推測して考えてみましょう。私の研究室の構成は次の通りである:

  • Hadoopのバージョン1.0.4
  • 4データノード、利用可能なスペースの5.0G、64メガバイトの4K
  • ブロックサイズのext4のブロックサイズより少し各

    • 1ファイルとディレクトリ、0ブロック:、1

    のデフォルトのレプリケーションHDFSを起動した後、私は次の名前ノードの要約を持っていますS使用さ= 1つの総

  • DFS:112キロバイト
  • DFSが残り:

    • hadoop fs -mkdir /test
    • for f in $(seq 1 10); do hadoop fs -copyFromLocal ./1K_file /test/$f; done

    :19.82ギガバイト

それから私は、次のコマンドを実行しますこれらの結果:

使用される
  • 12ファイルやディレクトリ、10ブロック= 22の総
  • DFS:122.15キロバイト残り
  • DFS:19.82ギガバイト

をので、10件のファイルがありません(10回64メガバイトを消費しませんでした"DFS Remaining"の変更)。

+0

これは私が推測していたものです。今それは明らかです。詳細な説明と実験をありがとう! – sachin2182

1

HDFSは、ローカルファイルシステム上で必要なものだけを使用します。したがって、12 MBのファイルを表すブロックは、(格納されている各データノード上に)格納されると12 MBを要します。 データのためのスペースがあると仮定して、必要なだけブロックを配置することができます。

+1

しかし、私はHDFSが#利用可能なブロックに関して十分な空き容量があるかどうかを判断すると思います。仮に、128MBのディスク容量があり、1MBのファイルを作成すると、使用可能なブロックは0になります(127MBは完全なHDFSブロックを構成できないため)。HDFSは存在しても1MBのファイルをもう1つ作成できません十分なディスク容量それは正しいと思いますか? – sachin2182

+0

私の経験から - HDFSはブロックを作成しようとし、具体的なノードのスペースを超えてエラーを返します。 –

+0

説明をありがとう@David – sachin2182

0

「利用可能なブロック」は、79(see this question)にとどまります。とにかく、私はHDFSが「利用可能なブロック」に関して十分な空き領域を持っているかどうかを判断しないと思います。

関連する問題