109

Click here to load reader

第2回 Hadoop 輪読会

Embed Size (px)

DESCRIPTION

第2回 Hadoop 輪読会の発表資料

Citation preview

Page 1: 第2回 Hadoop 輪読会

第2回

Hadoop本 輪読会3章 Hadoop分散ファイルシステム

Page 2: 第2回 Hadoop 輪読会

3章 Hadoop分散ファイルシステム

• 分散ファイルシステム- ネットワーク上のマシン群にまたがるストレージ

- ネットワークプログラミングに関するあらゆる複雑性

- ノードの障害に対してもデータの損失を被らない耐久性を持つファイルシステムを作ることは、最も困難な挑戦の一つ

• HDFS(Hadoop Distributed Filesystem)

Page 3: 第2回 Hadoop 輪読会

HDFSの設計

• 得意- 非常に大きなファイル

‣ 数百MB, GB, TB

- ストリーミング型のデータアクセス

‣ 書き込みを1度だけ行い、読み出しを何度も行う処理

- コモディティハードウェア

‣ 高価な高可用性をもったハードウェアは必要ない

‣ 普通に手に入るハードウェアで構成されるクラスタ

Page 4: 第2回 Hadoop 輪読会

HDFSの設計

• 不得意- 低レイテンシのデータアクセス

‣ 高スループットの実現のため、レイテンシを犠牲にしている

- 大量の小さなファイル

‣ 保管できるファイル数はネームノードのメモリ量に制限される

- 複数のライターからの書き込みや、任意のファイルの修正

‣ 1つのライターからのみ書き込むことができる

‣ 書き込みは常にファイルの末尾

Page 5: 第2回 Hadoop 輪読会

HDFSに関する概念

• ブロック- デフォルトで64MB

- メリット

‣ 大きいファイルが作れる

‣ サブシステムが単純になる

‣ レプリケーションと相性がよい

Page 6: 第2回 Hadoop 輪読会

HDFSに関する概念

• ネームノードとデータノード- マスター/ワーカーパターン

- ネームノード(マスター)

- データノード(ワーカー)

Page 7: 第2回 Hadoop 輪読会

HDFSに関する概念

• ネームノード- ファイルシステムのツリーと、ツリー内の全ファイルおよびディレクトリのメタデータを管理(ローカルディスクにイメージ、編集ログ)

- すべてのファイルの全ブロックがどこにあるかを管理(ローカルディスクには保存されない、起動時にデータノード群から再構築)

Page 8: 第2回 Hadoop 輪読会

HDFSに関する概念

• データノード- 実際に、ブロックを保存

- クライアントあるいはネームノードからの要求に応じて、ブロックの読み書きを行う

- 定期的にネームノードに自分が保存しているブロックのリストを報告

Page 9: 第2回 Hadoop 輪読会

HDFSに関する概念

• ネームノードがなければ、ファイルシステムを利用できない

- ネームノードの情報のバックアップ(イメージ, 編集ログ)

- セカンダリネームノード

Page 10: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

編集ログイメージ

Page 11: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

編集ログイメージ

open()append()write()

Page 12: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

編集ログイメージ

open()append()write()

更新

Page 13: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

編集ログイメージ

open()append()write()

更新 追加

Page 14: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

編集ログイメージ

Page 15: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスクイメージ

編集ログ

イメージ

Page 16: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

マージされたイメージ

マージされたイメージ

Page 17: 第2回 Hadoop 輪読会

HDFSに関する概念

• セカンダリネームノード- イメージと編集ログのマージ

NameNode SecondaryNameNode

メモリ ローカルディスク

イメージ

マージされたイメージ

マージされたイメージ

Page 18: 第2回 Hadoop 輪読会

コマンドラインインタフェース

• hadoop fs -copyFromLocal <localsrc> ... <dst>

• hadoop fs -copyToLocal <src> <localdst>

• hadoop fs -ls <path>

• hadoop fs -mkdir <path>

• hadoop fs -help

Page 19: 第2回 Hadoop 輪読会

Hadoopのファイルシステム群

ファイルシステム

URIスキーム java実装

local file org.apache.hadoop.fs.localFileSystem

HDFS hdfs org.apache.hadoop.hdfs.DistributesFileSystem

HFTP hftp org.apache.hadoop.hdfs.HftpFileSystem

HSFTP hsftp org.apache.hadoop.hdfs.HsftpFileSystem

HAR har org.apache.hadoop.fs.HarFileSystem

KFS kfs org.apache.hadoop.fs.kfs.KosmosFileSystem

FTP ftp org.apache.hadoop.fs.ftp.FTPFileSystem

S3(ネイティブ)

s3n org.apache.hadoop.fs.s3native.NativeS3FileSystem

S3(ブロックベース)

s3 org.apache.hadoop.fs.S3FileSystem

•hadoop fs -ls file:///•hadoop fs -ls hdfs:///•hadoop fs -ls hftp:///

Page 20: 第2回 Hadoop 輪読会

インターフェース

• Thrift

• C

- libhdfs

• FUSE(FileSystem in Userspace)

• WebDAV

• その他- HTTP, FTP(まだ、完成していない)

Page 21: 第2回 Hadoop 輪読会

Javaインターフェース

• Hadoop URLからのデータ読み出し

public class URLCat { static { URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); }

public static void main(String[] args) throws Exception { InputStream in = null; try { in = new URL(args[0]).openStream(); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } }}

Page 22: 第2回 Hadoop 輪読会

Javaインターフェース

• FileSystem APIを使ったデータの読み出し

public class FileSystemCat { public static void main(String[] args) throws Exception { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); InputStream in = null; try { in = fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } }

Page 23: 第2回 Hadoop 輪読会

Javaインターフェース

• FSDataInputStream

public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable {

// 実装は省略}

public interface Seekable { void seek(long pos) throws IOException; long getPos() throws IOException; boolean seekToNewSource(long targetPos) throws IOException;}

Page 24: 第2回 Hadoop 輪読会

Javaインターフェース

• FSDataInputStream

public class FileSystemDoubleCat { public static void main(String[] args) throws Exception { String uri = args[0]; FileSystem fs = FileSystem.get(URI.create(uri), new Configuration()); FSDataInputStream in = null; try { in = fs.open(new Path(uri)); IOUtils.copyBytes(in, System.out, 4096, false); in.seek(0); IOUtils.copyBytes(in, System.out, 4096, false); } finally { IOUtils.closeStream(in); } }}

Page 25: 第2回 Hadoop 輪読会

Javaインターフェース

• FSDataInputStream

public class FSDataInputStream extends DataInputStream implements Seekable, PositionedReadable {

// 実装は省略}

public interface PositionedReadable { int read(long position, byte buffer[], int offset, int length) throws IOException; void readFully(long position, byte buffer[], int offset, int length) throws IOException; void readFully(long position, byte buffer[]) throws IOException;}

Page 26: 第2回 Hadoop 輪読会

Javaインターフェース

• データの書き込み- public FSDataOutputStream create(Path f)

throws IOException

- public FSDataOutputStream append(Path f) throws IOException

Page 27: 第2回 Hadoop 輪読会

Javaインターフェース

• FSDateOutputStream

- FileSystemのcreate(), append()が返す

- シークは許されてない

public class FSDataOutputStream extends DataOutputStream implements Syncable { public long getPos() throws IOException { // 実装は省略 }

// 実装は省略}

Page 28: 第2回 Hadoop 輪読会

Javaインターフェース

• ディレクトリ- public boolean mkdirs(Path f) throws IOException

Page 29: 第2回 Hadoop 輪読会

Javaインターフェース

• ファイルのメタデータFileStatus status = fs.getFileStatus(new Path("hdfs://localhost/hogehoge"));

status.isDir(); // ディレクトリかどうかstatus.getLen(); // ファイルサイズstatus.getModificationTime(); // 更新時間status.getReplication(); // レプリケーションサイズstatus.getBlockSize(); // ブロックサイズ(デフォルト64MB)status.getOwner(); // オーナstatus.getGroup(); // グループstatus.getPermission().toString(); // パーミッション情報

Page 30: 第2回 Hadoop 輪読会

Javaインターフェース

• ファイルのリスト- public FileStatus[] listStatus(Path f) throws IOException;

- public FileStatus[] listStatus(Path f, PathFilter filter) throws IOException;

- public FileStatus[] listStatus(Path[] files) throws IOException;

- public FileStatus[] listStatus(Path[] files, PathFilter filter) throws IOException;

Page 31: 第2回 Hadoop 輪読会

Javaインターフェース

• ファイルのリストpublic class ListStatus { public static void main(String[] args) throws Exception { String uri = args[0]; Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(URI.create(uri), conf); Path[] paths = new Path[args.length]; for (int i = 0; i < paths.length; i++) { paths[i] = new Path(args[i]); } FileStatus[] status = fs.listStatus(paths); for (FileStatus stat : status) { System.out.println(stat.getPath().toUri().getPath()); } }}

Page 32: 第2回 Hadoop 輪読会

Javaインターフェース

• ファイルパターン- public FileStatus[] globStatus(Path pathPattern) throws IOException

- public FileStatus[] globStatus(Path pathPattern, PathFilter filter) throws IOException

Page 33: 第2回 Hadoop 輪読会

Javaインターフェース

• ファイルパターン

グロブ 名称 マッチする対象* アスタリスク 0個以上の文字

? クエスチョンマーク 1文字

[ab] 文字クラス 集合{a,b}のいずれかに1文字

[^ab] 否定文字クラス 集合{a,b}に含まれない1文字

[a-b] 文字範囲 集合{a,b}内の1文字(aとbを含む)。aは辞書の並び順でbに等しいか、それより前でなければならない

[^a-b] 否定文字範囲 集合{a,b}に含まれない1文字(aとbもマッチしない)。aは辞書の並び順でb

に等しいか、それより前でなければならない

{a,b} 選択 aあるいはb

¥c エスケープ文字 cがメタ文字の場合、文字c

Page 34: 第2回 Hadoop 輪読会

Javaインターフェース

• パスフィルタ

public interface PathFilter { boolean accept(Path path);}

Page 35: 第2回 Hadoop 輪読会

Javaインターフェース

• パスフィルタ 例public class RegexExcludePathFilter implements PathFilter {

private final String regex; public RegexExcludePathFilter(String regex) { this.regex = regex; } @Override public boolean accept(Path path) { return !path.toString().matches(regex); }}

fs.globStatus(new Path("/2007/*/*"), new RegexExcludePathFilter("^.*/2007/12/31$"));

Page 36: 第2回 Hadoop 輪読会

Javaインターフェース

• データの削除- public boolean delete(Path f, boolean recursive)

throws IOException;

Page 37: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

クライアント

Page 38: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

クライアント

Page 39: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

クライアント

Page 40: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 41: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 42: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 43: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 44: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 45: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 46: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 47: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 48: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 49: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

close()

block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

クライアント

Page 50: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 51: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 52: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 53: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

次からは接続しない

クライアント

Page 54: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

次からは接続しない

クライアント

Page 55: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 56: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 57: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

クライアント

Page 58: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

報告

クライアント

Page 59: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学

HDFSクライアント DistributedFileSystem

FSDataInputStream

NameNode

DateNode1 DateNode2 DateNode3 DateNode4

block1 block1

block2 block3

block3 block2

block4block4

open(new Path(“/aaa.txt”))

“/aaa.txt”のブロック情報の取得(先頭の数ブロック)

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4 aaa.txt : block1, block2. block3, block4

block1 : DataNode1, DataNode3block2 : DataNode3, DataNode4block3 : DataNode2, DataNode3block4 : DataNode1, DataNode2

read()

報告

クライアント

Page 60: 第2回 Hadoop 輪読会

データフロー

• ファイル読み込みの解剖学- クライアントに対して透過的

- データのトラフィックはクラスタ内の全データノードに分散される

- クライアント数の増加に連れて、ネームノードがボトルネックになることはない

Page 61: 第2回 Hadoop 輪読会

データフロー

• ネットワークの近さについて- ネットワークをツリー構造で表し、2つのノード間の距離をそれらのノードの最も近い共通祖先への距離の合計

- 設定の詳細は「9.1.1 ネットワークトポロジ」

- デフォルトはフラット

距離(/d1/r1/n1, /d1/r1/n1) = 0

距離(/d1/r1/n1, /d1/r1/n2) = 2

距離(/d1/r1/n1, /d1/r2/n3) = 4

距離(/d1/r1/n1, /d2/r3/n4) = 6

d1 d2

r1 r2 r3

n1 n2 n3 n4

Page 62: 第2回 Hadoop 輪読会

FSDataOutputStream

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

クライアント

Page 63: 第2回 Hadoop 輪読会

FSDataOutputStream

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

クライアント

Page 64: 第2回 Hadoop 輪読会

FSDataOutputStream

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”)) 作成クライアント

Page 65: 第2回 Hadoop 輪読会

FSDataOutputStream

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

作成クライアント

Page 66: 第2回 Hadoop 輪読会

FSDataOutputStream

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

作成クライアント

Page 67: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

作成クライアント

Page 68: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

作成クライアント

Page 69: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

作成クライアント

Page 70: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

作成クライアント

Page 71: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

作成クライアント

Page 72: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

作成クライアント

Page 73: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

作成クライアント

Page 74: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1

作成クライアント

Page 75: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1

作成クライアント

Page 76: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 77: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 78: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 79: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 80: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 81: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

作成クライアント

Page 82: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

close()

作成クライアント

Page 83: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

既にファイルが存在しないかパーミッションのチェック

write()

DataStreamer

block1 : DataNode1, DataNode2, DataNode3

block1 block1 block1

close()

作成

完了

クライアント

Page 84: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

作成クライアント

Page 85: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1

作成クライアント

Page 86: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成クライアント

Page 87: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成クライアント

Page 88: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成クライアント

Page 89: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2

クライアント

Page 90: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2

クライアント

Page 91: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2

クライアント

Page 92: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2 block2

クライアント

Page 93: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2 block2

クライアント

Page 94: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2 block2

クライアント

Page 95: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2 block2

クライアント

Page 96: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1 block1

作成

block2 block2

クライアント

Page 97: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1

作成

block2 block2

クライアント

Page 98: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1

作成

block2 block2

クライアント

Page 99: 第2回 Hadoop 輪読会

ackキュー

FSDataOutputStream

データキュー

データフロー

• ファイル書き込みの解剖学

HDFSクライアント DistributedFileSystem NameNode

DateNode1 DateNode2 DateNode3

create(new Path(“/aaa.txt”))

write()

DataStreamer

block1

作成

block2 block2block2

クライアント

Page 100: 第2回 Hadoop 輪読会

データフロー

• ファイル書き込みの解剖学- 同時に複数台で障害を起こすと、dfs.replication.min(デフォルトは1)で指定された、個数が書き込まれる限り、書き込みは成功

- 目標の複製数(dfs.replicationで指定された数、デフォルトは3)に到達するまで、非同期的にクラスタ上に複製されていく

- クライアントに対して透過的

Page 101: 第2回 Hadoop 輪読会

データフロー

• レプリカの配置1. クライアントと同じノード(クライアントがクラスタ外ならランダム)

2. 1つ目のレプリカとは異なるラックをランダムに選んでその中のノード

3. 2つ目のレプリカと同じラックの中の別のノード

4. それ以降はランダム(同じラックに偏らないように)

Page 102: 第2回 Hadoop 輪読会

データフロー

• 一貫性モデル- ファイルを作成すると、そのファイルはファイルシステムの名前空間内で見えるようになる

- ファイルに書き込まれた内容は、ストリームがフラッシュされたあとでも見えるとは限らない

fs.create(new Path("p"));

OutputStream out = fs.create(new Path("p"));out.write("content".getBytes("UTF-8"));out.flush();

Page 103: 第2回 Hadoop 輪読会

データフロー

• 一貫性モデル- FSDataOutputStreamのsync()が呼ばれたあとは、見えるようになる

- sync()はclose()時にも呼ばれる

FSDataOutputStream out = fs.create(new Path("p"));out.write("content".getBytes("UTF-8"));out.flush();out.sync();

Page 104: 第2回 Hadoop 輪読会

データフロー

• 一貫性モデル- アプリケーションの設計への影響

‣ sync()を呼ばないなら、障害時に最大1ブロックのデータが失われる

‣ これを許容できないなら、適切なタイミングでsync()を呼んでおくべき

‣ sync()は過度の負荷にはならないが、オーバヘッドは存在するので注意

Page 105: 第2回 Hadoop 輪読会

distcpによる並列コピー

• 2つのHDFS間でのデータ転送

- hadoop distcp hdfs://namenode1/foo hdfs://namenode2/bar

- hadoop distcp -overwrite hdfs://namenode1/foo hdfs://namenode2/bar/foo

- hadoop distcp -update hdfs://namenode1/foo hdfs://namenode2/bar/foo

• MapReduceのジョブとして実装

- 各マップは最低256MBをコピーする(1GBのファイルには4つのマップ)

- ファイルが非常に大きい場合はmap数を制限(ネットワーク帯域、クラスタの利用度合い)

- デフォルトのmap数は、1ノード(tasktraker)につき最大20map

Page 106: 第2回 Hadoop 輪読会

Hadoopアーカイブ

• 小さいファイル群を効率よく保存するための仕組み

• HAR

• hadoop archive -archiveName files.har /my/files /my

Page 107: 第2回 Hadoop 輪読会

Hadoopアーカイブ

• 制限事項- アーカイブを作成するとき、アーカイブを作成しようとしているファイル群の同じだけのディスク容量が必要(アーカイブ圧縮はサポートされてない)

- アーカイブはいったん作成されたら修正できない

- HARファイルはMapReduceへの入力として使えるが、依然として大量の小さいファイルの処理は非効率(「7.2.1.4 小さいファイル郡とCombineFileInputFormat」)

Page 108: 第2回 Hadoop 輪読会

まとめ

• HDFS

- ブロック

- ネームノードとデータノード

- いろいろなインターフェース

- 読み込みと書き込みの詳細

• distcp

• HAR

Page 109: 第2回 Hadoop 輪読会

• ご清聴ありがとうございました

• 質疑応答