HDFS Erasure Coding | Hadoop Advent Calendar 2016 #04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、小澤です。 この記事はHadoop Advent Calendar 4日目のものとなります。

前回はHDFSがどのような仕組みで動いているかの紹介をしました。
今回はHadoop3.0から搭載予定のHDFS Erasure Codingについて書かせていただきたいと思います。

Erasure Codingとは

HDFS上で従来のReplication方式とは異なったデータ保持の仕方をするものです。 一言で例えるなら、従来のReplicationはRAID1(ミラーリング)に対してErasure CodingはRAID5のような形式でデータを保持するものとなっています。 従来はReplication数3の場合、データサイズの3倍のディスク容量が必要でしたが、Erasure Codingでは1.5倍で抑えることが可能となっています。

データの構造

Erasure CodingはReplicationと比較してデータの保持の仕方が複雑になっています。 そこでまずはどのような形式でデータを保持しているのか簡単に解説しておきます。 なお、具体的な実現方法を説明するのが目的ではないため、手法の詳細や用語の説明に関しては割愛しますのでおおよそどのような感じになっているのかをつかんでいただければと思います

ec

まず、最初にデータを細かく分割します。 次に、分割したデータ6つごとに3つのparity用のデータを作成します 最後にこのparityも含めて分割されたデータを順にDataNodeへと格納していきます。

データは全体の9個うち、どれか6つがあれば元のデータを復元できます。 この6つのデータというのは必ずしも元のデータではなく計算されたparityであっても問題ありません。 なので、Erasure Codingでは9個のうち3個までの破損に耐えられる仕組みとなっています。 また、データサイズも6個につき3つのparityなので1.5倍となっています。

より詳しい話に関してはHDFS Erasure Coding in ActionIntroduction to HDFS Erasure Coding in Apache Hadoopを参照していただければと思います。 ただし、これらは実装に近い部分に踏み込んでいたり理論的な部分を解説していたりするため、いきなり参考にすると難しい内容となっているかもしれません。 難しかったとしても、理解できなければ使えないということもないのでまずは使ってみて実感してみるのも1つの手かと思います。

利用シーン

Erasure Codingを利用することで、ディスクの使用効率は良くなるもののデメリットが全く無いわけではありません。

Erasure CodingではWriteの際にはparityの計算と作成、Readの際には元のデータの復元のための計算が必要になるほか、 一部のデータが破損した際の復元する際にも複数のノードに分散されたデータ全体を利用して再計算が必要になります。 1つのノードにあるデータのみでの活用ができないため、Data Localityもなくなります。 これによるオーバーヘッドや計算リソースの使用は考えておく必要があります。

そのため、ReplicationとErasure Codingの使い分けとしては

  • 頻繁に利用されるデータはReplicationとして保存しておき効率良く読み込めるようにしておく場合はReplication
  • 蓄積を目的としておりデータ分析の際に利用されることはあまりない大量データを低コストで保持しておきたい場合はErasure Coding

というふうに考えておくいいかと思います。

おわりに

Erasure CodingはHadoop3.0で加わった大きな新機能1つです。 大量のアーカイブを保持するために利用効率をあげるとために使えると考えると、データの規模が大きくなればなるほどその効果を発揮します。 このように、データ量は日々増大しており、より一層大規模化していく環境が求められるシーンに合わせて新しい機能を追加していくというのが最近のHadoopの一つの流れであるように感じます。

明日はHadoopのエコシステムであるHiveについて、どのような構成になっているかを書かせていただく予定です。
ぜひ、お楽しみに!