SlideShare a Scribd company logo
Hadoop, The Definitive
 Guide (2nd edition)
読書会資料(第3章 /HDFS )

          担当: @tyamadajp
P41-42:HDFS と適用領域
       Hadoop System
                                 データの分散保管と
         MapReduce Engine        コード配布+計算要求
ブロック保有
ノードの照会          Code     Code
                                 FS API
                +Data    +Data
                                 HDFS
        Name   Data     Data              local fs, S3
                                          なども使用可
        Node   Node     Node

●
    API を介する、交換可能なストレージ要素の1つ
●   特徴1:ノード故障への耐性
●   特徴2:大データ (~TB/node) への連続アクセス
●
    特徴3: write-once, read-many に特化
多数ファイル、低レイテンシ利用、マルチライタは不得意
P43-45:HDFS の構成と構造 (1)
             Name Node             ブロック1つ
                                   あたり 64+[MB]
                              #0
                         DN    1
                         #1    2       もう最近は
                                       128[MB] に
    client
                              #0
                         DN    1
「 N バイトのファイル
                         #2    2
  A の 0-64MB 部分を
 書き込みたい」
「なら ID:XXX で DN#1             #0
  ->2->3 に書くように」         DN    1
                         #3    2


●   ファイルは 64+[MB] ブロック単位で分散保持
●   サイズはシーク処理が 1% に収まる程度に決める
P43-45:HDFS の構成と構造 (2)
             Name Node                       64[KB] ずつ、
                                             ブロックが
                 ACK                A[0,*]   埋まるまで転送
                         DN
                         #1
    client
                              ACK
                                    A[0,*]
「 #1->2->3 の流れで          DN
  A[0,0](64KB 分 ) を      #2                  ブロック毎に
  ID:XXX で書きたい」                              違う DN 群が
「書き込み完了。 ACK 」                ACK
                                    A[0,*]   NN に選ばれる。
 ・・・                     DN                  左図は A[1] に
「 A[0,N] を書きたい」                     A[1,*]
「書き込み完了。 ACK 」
                         #3                  ついても DN#3 が
                                             選ばれた場合。

●
    ブロック毎に別の DN 群が書き込み先となる
●
    書き込みプロセスから NN は完全に分離される
P43-45:HDFS の構成と構造 (3)
                Name Node
                                 A[0,*]
                            DN
DN#1 has A[0]
                            #1
DN#2 has A[0]
                                 A[0,*]
DN#3 has A[0]               DN
DN#3 has A[1]               #2

                                 A[0,*]
                            DN   A[1,*]
                            #3

 ●
     DN は NN に書込完了後に block report を送信
 ●
     NN は File A <-> BlockID の対応表と上を合成
P45:NameNode の役割・課題
役割
●
  File<->[Block], Block<->[DN] の対応管理
● DN からの Block report および heartbeat の受付


● Client からの FS op/RPC のエントリポイント


  #負荷は軽い( 10Knode/68PB でも 1 台の試算)

データ管理・運用に課題
● 対応表が消える=全データ消滅だが SPoF 稼動


●
  ジャーナリング方式でデータ管理されている
  ◚ しかし、マージは再起動の時(=遅い)
P45:NameNode の冗長(?)化
                                    NN /w
                                CheckPoint Role

 Name Node               ※metadata+journal を吸い出して
                          マージし、書き戻す。 NN の
    metadata               journal が空に戻って再起動が
       table              高速化する
     journal
    blockmap
               ※ ジャーナルの             NN /w
                複製先として登録
                                 Backup Role
Backup Role の登場で復旧可能には                merged
なったが、 blockmap 再作成=全 DN              metadata
問合せが必要で failover はできない。                table
クラスタ構成で稼動できるように                       journal
改良予定( HDFS 論文 , 2010 より)        ※ こちらをマスタとして
 NTT-D で Kemari 使って冗長構成組んでるとか    再起動すれば復旧可能
P45-47: 基本操作方法
●   基本は「 hadoop fs -<op> 」で操作。
    詳しくは本を。あと hadoop fs だけでヘルプが
●
    扱える「ファイル」は「 scheme:... 」の URI で
    指定してローカル・リモートの各所を指定
    ◚ 今回の HDFS だと hdfs://host/path で

●   簡易的な UNIX-style user/group+rwx ACL あり
    マルチユーザ運用のためなのでオフにもできる




        細かくプレゼン資料にする程ではないので軽く飛ばします
P48:org.apache.hadoop.fs.FileSystem
    URI scheme に対応する FS API の実装クラスを
    登録すれば、任意のデータストアが組込可能
組込方法 – hoge:// scheme の場合
●   *.FileSystem の拡張クラスを実装する
●   core-site.xml に以下を追加する
  <property>
  <name>fs.hoge.impl</name>
  <value>test.HogeFileSystem</value>
  </property>
●   hogefs.jar を hadoop の参照 classpath に追加
●
    hadoop コマンドでは -libjars ... を追加
P48:Extending FileSystem
public class HogeFileSystem extends FileSystem {
  public void
  initialize(URI uri, Configuration conf) throws IOException {
     super.initialize(uri, conf);
     setConf(conf);                   ダミーで書く程度なら赤字の
  }                                      メソッドだけ書けば簡単
  public URI getUri() { … }
  public FSDataInputStream open(Path file, int bufferSize) …
  public FSDataOutputStream create(Path file, …
  public FSDataOutputStream append(Path file, …
  public boolean rename(Path src, Path dst) …
  public boolean delete(Path file) 自前の *OutputStream 書いて
                                    …
  public boolean delete(Path file, booolean recursive) …
                                    block report 送ったりさせる
  public boolean mkdirs(Path file, 必要もあるかも(未検証)
                                     …
  public FileStatus[] listStatus(Path file) ...
  public FileStatus[] getFileStatus(Path file) …
  public void setWorkingDirectory(Path newDir) { … }
  public Path getWorkingDirectory() { … }
P49-50:Available Interfaces
低レベルアクセス           Hadoop FS API を叩いている場合は
● Java API          HDFS 以外にも利用できなくもない
● Thrift RPC

 (形態: Client ↔ Thrift Server ↔ Java API )
●
  libhdfs/C
 (形態: Client ↔ C ↔ JNI ↔ Java API )
高レベルアクセス
●
  FUSE
 (形態: Fuse-DSF ↔ libhdfs ↔ ... )
● WebDAV (開発中)

 (形態: WebDAV Server ↔ Java API )
●
  HTTP/XML
 (形態: XML-generating Web server ↔ Java API )
● FTP (開発中)
P51-62:Using Java API

   ひたすらコードが続くので、この部分は本文参照。
   要点は
   ●   URLStreamHandlerFactory を登録し URL.* API を
       使う方法があるが、廃止。毎回 abs URL が必要、
       異 scheme 間の操作で問題があるなどした
   ●   カレント URI を FileContext で定め、そこを起点に
       操作する方法が新方式
   ●   直接 FS API を利用する方法は維持されている
   ●   FS*Stream の Seekable, PositionedReable,
       Progressable インタフェースを活用すると、
       効率のよい読み出しや進行通知ができる。
   ●   また、 globStatus API では PathFilter を使い
       glob 指定での一部ファイルの stat 相当が可能
   ●   FS API は概ね POSIX 風
P63:Java API とノード構成の関係
        掲載図以上にわかりやすい表現がないのでほぼ同じ図…

client node
 JVM
                                  ②get block location
       ①open
                                         Name
  HDFS ③readDFS (metadata) API
                                         Node
  client    FSData*Stream API
        ⑥close
                                         近い方から読むが
                                         故障時には自動切替

スライド 4 枚目に前述だが、           ④read           ⑤read
メタデータ系とデータ系 API で
参照先ノードが完全に分かれる。        Data       Data     Data
                       Node       Node     Node
図にはないが、各 API の下側に
HDFS の実装クラスが入り、実
ノードアクセスを担当する。
P64: ノードトポロジと「距離」概念
ノード間距離 d を
元に NN は DN を
管理・制御する                          d=6
               R                       R
      DC: A        d=4
                         DC: B

          #0        #5       #0            #5
d=0       #1        #6       #1            #6
          #2        #7       #2            #7
          #3        #8       #3            #8
d=2
          #4        #9       #4            #9


  デフォルトでは全ノードが等距離な構成と見なすので、適切に
  NN に制御させるには設備 / 遅延 / 帯域を見て距離 d を調整する。
  上の d は「ホップ数 +1 」風になっているだけで、実際の設備
  次第では必ずしも適切とはいえない。
P65-67: トポロジに基づく書込処理
               R            まず性能のため
                            最大のローカリティが
                            得られるノードに書く

                            次に冗長化のため、別
 client   DN       DN       ラックのノードに複製


                            最後に冗長度の更なる
                            確保のため、ラック内
                   DN       別ノードに再複製


複製が dfs.replication.min 個に達した時点で書込完了 ACK は飛ぶ。
その後 dfs.replication 個まで内部で複製を増やす動作になる。
複製エラー時は、正常ノード側の BlockID の付け替えを行い NN に
通知する。すると複製数不足が検知され追加複製トリガが引かれる
P68-69: バッファリングと同期
          client                             out.flush()
             A              stat             A → block full までは
                                                   メタデータのみ反映
              writing                        B → 未反映
                                             C → 反映( A と同様)
     書込完了               書込中
                                             out.hflush()
         block#0            block#1          A → 全て反映
                                             B → 未反映
  read                        open           C → 全て反映
                              (new reader)
                                             out.hsync()
client             client                    A → 全て反映
  B                  C                       B → 全て反映
                                             C → 全て反映
 ブロックの状態は
 A/B/C からどう見える?                              ※ なお、 sync ( =~hflush )は
 ヒント: NOT POSIX                                deprecated API となった
P70:distcp - MapReduce と並列転送
やりたいこと: cp             src#0 src#1 src#2     dst#0 dst#1 dst#2

         getloc(src)
  NN                   MapReduce Engine

create+
getloc(dst)
              cp   src#0
                    dst#0      cp   src#1
                                     dst#1        cp   src#2
                                                        dst#2



              dst#0            dst#1              dst#2



                              Data Nodes
    ※ ただし DFS 系の間でのみ。コピー元も分散保持していないと
      IO ボトルネックで並列処理しても性能が全く出ない(はず)
P70:distcp - 使用上の注意
●   デフォルトは1マップで最低 256[MB] をコピー
●   デフォルトは1ノードに最大 20 マップ(処理)
●
    使用ノード数を絞るなら -m <# of maps>
    → マップあたりのコピー量を増やす結果に
    → ただし、最初のコピーは複製ルールにより
      マップ処理ノードと同じノードに置かれる。
      これ起因のアンバランス配置に注意!
●
    異バージョン HDFS 間のコピーは不可(非互換)
    → hftp:// で指定して回避できる
    → コピー先クラスタ (NN) で実行する必要がある
P71-73:HAR – Hadoop ARchive 形式
●   メタデータの管理(保管)効率向上が目的
    → データは元々実サイズ分しか使わない
●   パックして NameNode 上は「1ファイル」扱い
    → *.har の位置までのみ NN が管理する
●
    ファイルの増減・変更の際は全体再作成になる
注意
    これは NameNode での効率の話であって、 MapReduce 処理
    段階では、各々の処理( split )に HAR 内の複数ファイルを
    まとめて食わせられるわけではない。
    つまり細かい Map タスクが多量に発生するオーバーヘッドは
    回避できない。別の対策に CombineFileInputFormat クラスを
    用いて、入力データを集約する方法があるので要参照。

More Related Content

PPTX
SPDYの話
shigeki_ohtsu
 
PDF
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
Panda Yamaki
 
PDF
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
Panda Yamaki
 
PDF
Mutualized Oblivious DNS (μODNS): Hiding a tree in the wild forest
Jun Kurihara
 
PDF
DNS におけるセキュリティ&プライバシ動向
Jun Kurihara
 
PDF
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
 
PDF
Hokkaido.cap#3 ケーススタディ(基礎編)
Panda Yamaki
 
PDF
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Panda Yamaki
 
SPDYの話
shigeki_ohtsu
 
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
Panda Yamaki
 
Hokkaido.cap#1 Wiresharkの使い方(基礎編)
Panda Yamaki
 
Mutualized Oblivious DNS (μODNS): Hiding a tree in the wild forest
Jun Kurihara
 
DNS におけるセキュリティ&プライバシ動向
Jun Kurihara
 
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
 
Hokkaido.cap#3 ケーススタディ(基礎編)
Panda Yamaki
 
Hokkaido.cap #osc11do Wiresharkを使いこなそう!
Panda Yamaki
 

What's hot (19)

PPTX
コンテナのネットワークインターフェース その実装手法とその応用について
Tomofumi Hayashi
 
ODP
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 
PDF
DPDKを用いたネットワークスタック,高性能通信基盤開発
slankdev
 
PDF
Cpu cache arch
Shinichiro Niiyama
 
PDF
Code jp2015 cpuの話
Shinichiro Niiyama
 
PDF
Hokkaido.cap#4 ケーススタディ(ネットワークの遅延と戦う:前編)
Panda Yamaki
 
PDF
Linux Namespace
Masami Ichikawa
 
PDF
CPUの同時実行機能
Shinichiro Niiyama
 
PDF
Kyoto Tycoon Guide in Japanese
Mikio Hirabayashi
 
PDF
Quick Introduction to GlusterFS
Etsuji Nakai
 
PDF
Scapyで作る・解析するパケット
Takaaki Hoyo
 
PDF
gumiStudy#7 The MessagePack Project
Sadayuki Furuhashi
 
PDF
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
Nobuyuki Sasaki
 
PDF
Scapy presentation
ashigirl ZareGoto
 
PDF
徹底検証!Drbd 8.4 with 高速半導体ストレージ
株式会社サードウェア
 
PDF
Drbd9資料 osc発表
hkuroki
 
PDF
DRBD9とdrbdmanageの紹介
株式会社サードウェア
 
PDF
DNSのRFCの歩き方
Takashi Takizawa
 
PDF
DRBD9とdrbdmanageの概要紹介
株式会社サードウェア
 
コンテナのネットワークインターフェース その実装手法とその応用について
Tomofumi Hayashi
 
tcpdumpとtcpreplayとtcprewriteと他。
(^-^) togakushi
 
DPDKを用いたネットワークスタック,高性能通信基盤開発
slankdev
 
Cpu cache arch
Shinichiro Niiyama
 
Code jp2015 cpuの話
Shinichiro Niiyama
 
Hokkaido.cap#4 ケーススタディ(ネットワークの遅延と戦う:前編)
Panda Yamaki
 
Linux Namespace
Masami Ichikawa
 
CPUの同時実行機能
Shinichiro Niiyama
 
Kyoto Tycoon Guide in Japanese
Mikio Hirabayashi
 
Quick Introduction to GlusterFS
Etsuji Nakai
 
Scapyで作る・解析するパケット
Takaaki Hoyo
 
gumiStudy#7 The MessagePack Project
Sadayuki Furuhashi
 
CentOS 8で標準搭載! 「389-ds」で構築する 認証サーバーについて
Nobuyuki Sasaki
 
Scapy presentation
ashigirl ZareGoto
 
徹底検証!Drbd 8.4 with 高速半導体ストレージ
株式会社サードウェア
 
Drbd9資料 osc発表
hkuroki
 
DRBD9とdrbdmanageの紹介
株式会社サードウェア
 
DNSのRFCの歩き方
Takashi Takizawa
 
DRBD9とdrbdmanageの概要紹介
株式会社サードウェア
 
Ad

Similar to Hadoop book-2nd-ch3-update (20)

PDF
HDFSのスケーラビリティの限界を突破するためのさまざまな取り組み | Hadoop / Spark Conference Japan 2019 #hc...
Yahoo!デベロッパーネットワーク
 
PPTX
Hadoop Compatible File Systems (Azure編) (セミナー「Big Data Developerに贈る第二弾 ‐ Azur...
NTT DATA Technology & Innovation
 
PDF
Hadoop - OSC2010 Tokyo/Spring
Shinichi YAMASHITA
 
PDF
HDFS basics from API perspective
NTT DATA OSS Professional Services
 
PDF
OSC2012 OSC.DB Hadoop
Shinichi YAMASHITA
 
PDF
Apache Hadoop HDFSの最新機能の紹介(2018)#dbts2018
Yahoo!デベロッパーネットワーク
 
PDF
Osc2012 spring HBase Report
Seiichiro Ishida
 
PDF
HDFS Deep Dive
Yifeng Jiang
 
PDF
Hadoopエコシステムのデータストア振り返り
NTT DATA OSS Professional Services
 
PDF
Hadoopによる大規模分散データ処理
Yoji Kiyota
 
PDF
Hadoop Compatible File Systems 2019 (db tech showcase 2019 Tokyo講演資料、2019/09/25)
NTT DATA Technology & Innovation
 
PDF
Hadoopのシステム設計・運用のポイント
Cloudera Japan
 
PPT
Googleの基盤クローン Hadoopについて
Kazuki Ohta
 
PDF
データインターフェースとしてのHadoop ~HDFSとクラウドストレージと私~ (NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
PDF
Hadoop事始め
You&I
 
PDF
Scalable Cooperative File Caching with RDMA-Based Directory Management
Junya Arai
 
PDF
Kvs okuyama-20110818
Takahiro Iwase
 
PPTX
Hdfsソースコードリーディング第2回
shunsuke Mikami
 
PDF
AI・HPC・ビッグデータで利用される分散ファイルシステムを知る
日本ヒューレット・パッカード株式会社
 
PDF
WDD2012_SC-004
Kuninobu SaSaki
 
HDFSのスケーラビリティの限界を突破するためのさまざまな取り組み | Hadoop / Spark Conference Japan 2019 #hc...
Yahoo!デベロッパーネットワーク
 
Hadoop Compatible File Systems (Azure編) (セミナー「Big Data Developerに贈る第二弾 ‐ Azur...
NTT DATA Technology & Innovation
 
Hadoop - OSC2010 Tokyo/Spring
Shinichi YAMASHITA
 
HDFS basics from API perspective
NTT DATA OSS Professional Services
 
OSC2012 OSC.DB Hadoop
Shinichi YAMASHITA
 
Apache Hadoop HDFSの最新機能の紹介(2018)#dbts2018
Yahoo!デベロッパーネットワーク
 
Osc2012 spring HBase Report
Seiichiro Ishida
 
HDFS Deep Dive
Yifeng Jiang
 
Hadoopエコシステムのデータストア振り返り
NTT DATA OSS Professional Services
 
Hadoopによる大規模分散データ処理
Yoji Kiyota
 
Hadoop Compatible File Systems 2019 (db tech showcase 2019 Tokyo講演資料、2019/09/25)
NTT DATA Technology & Innovation
 
Hadoopのシステム設計・運用のポイント
Cloudera Japan
 
Googleの基盤クローン Hadoopについて
Kazuki Ohta
 
データインターフェースとしてのHadoop ~HDFSとクラウドストレージと私~ (NTTデータ テクノロジーカンファレンス 2019 講演資料、2019...
NTT DATA Technology & Innovation
 
Hadoop事始め
You&I
 
Scalable Cooperative File Caching with RDMA-Based Directory Management
Junya Arai
 
Kvs okuyama-20110818
Takahiro Iwase
 
Hdfsソースコードリーディング第2回
shunsuke Mikami
 
AI・HPC・ビッグデータで利用される分散ファイルシステムを知る
日本ヒューレット・パッカード株式会社
 
WDD2012_SC-004
Kuninobu SaSaki
 
Ad

More from Taisuke Yamada (20)

PDF
ウェブパフォーマンス計測の落とし穴
Taisuke Yamada
 
PDF
DIY Akamai Globe in 50 Minutes
Taisuke Yamada
 
PDF
ウェブサイト最適化101 - 正しく測ろうあなたのサイト -
Taisuke Yamada
 
PDF
Quick QUIC Technical Update (2017)
Taisuke Yamada
 
PDF
IoT Deep Dive - Be an IoT Developer for an Hour
Taisuke Yamada
 
PDF
Pythonではじめるソフトウェア無線
Taisuke Yamada
 
PDF
Getting Started with SDR in Python
Taisuke Yamada
 
PDF
VSCode Remoteでも画像コピペがしたいです!
Taisuke Yamada
 
PDF
InfiniBand on Debian
Taisuke Yamada
 
PDF
Infinite Debian - Platform for mass-producing system every second
Taisuke Yamada
 
PDF
Hacking Ruby with Python
Taisuke Yamada
 
PDF
Invitation to Kernel Parameter and Code Exploration
Taisuke Yamada
 
PDF
Charity Items from Debian JP Project
Taisuke Yamada
 
PDF
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
Taisuke Yamada
 
PDF
Introduction to Initramfs - Initramfs-tools and Dracut
Taisuke Yamada
 
PDF
The CAcert Project - An Invitation to CAcert ATE in OSC/Tokyo 2011 (EN)
Taisuke Yamada
 
PDF
The CAcert Project - An Invitation to CAcert ATE at OSC/Tokyo 2011 (JP)
Taisuke Yamada
 
PDF
201012 cacert-at-tokyodebian
Taisuke Yamada
 
PDF
Nilfs usage-report-and-comparison-at-tokyodebian
Taisuke Yamada
 
PDF
Casual Web-browsing with gPXE and SYSLINUX
Taisuke Yamada
 
ウェブパフォーマンス計測の落とし穴
Taisuke Yamada
 
DIY Akamai Globe in 50 Minutes
Taisuke Yamada
 
ウェブサイト最適化101 - 正しく測ろうあなたのサイト -
Taisuke Yamada
 
Quick QUIC Technical Update (2017)
Taisuke Yamada
 
IoT Deep Dive - Be an IoT Developer for an Hour
Taisuke Yamada
 
Pythonではじめるソフトウェア無線
Taisuke Yamada
 
Getting Started with SDR in Python
Taisuke Yamada
 
VSCode Remoteでも画像コピペがしたいです!
Taisuke Yamada
 
InfiniBand on Debian
Taisuke Yamada
 
Infinite Debian - Platform for mass-producing system every second
Taisuke Yamada
 
Hacking Ruby with Python
Taisuke Yamada
 
Invitation to Kernel Parameter and Code Exploration
Taisuke Yamada
 
Charity Items from Debian JP Project
Taisuke Yamada
 
mod_auth_ticket - Bringing Single-Sign-On to lighttpd
Taisuke Yamada
 
Introduction to Initramfs - Initramfs-tools and Dracut
Taisuke Yamada
 
The CAcert Project - An Invitation to CAcert ATE in OSC/Tokyo 2011 (EN)
Taisuke Yamada
 
The CAcert Project - An Invitation to CAcert ATE at OSC/Tokyo 2011 (JP)
Taisuke Yamada
 
201012 cacert-at-tokyodebian
Taisuke Yamada
 
Nilfs usage-report-and-comparison-at-tokyodebian
Taisuke Yamada
 
Casual Web-browsing with gPXE and SYSLINUX
Taisuke Yamada
 

Recently uploaded (10)

PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 

Hadoop book-2nd-ch3-update

  • 1. Hadoop, The Definitive Guide (2nd edition) 読書会資料(第3章 /HDFS ) 担当: @tyamadajp
  • 2. P41-42:HDFS と適用領域 Hadoop System データの分散保管と MapReduce Engine コード配布+計算要求 ブロック保有 ノードの照会 Code Code FS API +Data +Data HDFS Name Data Data local fs, S3 なども使用可 Node Node Node ● API を介する、交換可能なストレージ要素の1つ ● 特徴1:ノード故障への耐性 ● 特徴2:大データ (~TB/node) への連続アクセス ● 特徴3: write-once, read-many に特化 多数ファイル、低レイテンシ利用、マルチライタは不得意
  • 3. P43-45:HDFS の構成と構造 (1) Name Node ブロック1つ あたり 64+[MB] #0 DN 1 #1 2 もう最近は 128[MB] に client #0 DN 1 「 N バイトのファイル #2 2   A の 0-64MB 部分を  書き込みたい」 「なら ID:XXX で DN#1 #0   ->2->3 に書くように」 DN 1 #3 2 ● ファイルは 64+[MB] ブロック単位で分散保持 ● サイズはシーク処理が 1% に収まる程度に決める
  • 4. P43-45:HDFS の構成と構造 (2) Name Node 64[KB] ずつ、 ブロックが ACK A[0,*] 埋まるまで転送 DN #1 client ACK A[0,*] 「 #1->2->3 の流れで DN   A[0,0](64KB 分 ) を #2 ブロック毎に   ID:XXX で書きたい」 違う DN 群が 「書き込み完了。 ACK 」 ACK A[0,*] NN に選ばれる。  ・・・ DN 左図は A[1] に 「 A[0,N] を書きたい」 A[1,*] 「書き込み完了。 ACK 」 #3 ついても DN#3 が 選ばれた場合。 ● ブロック毎に別の DN 群が書き込み先となる ● 書き込みプロセスから NN は完全に分離される
  • 5. P43-45:HDFS の構成と構造 (3) Name Node A[0,*] DN DN#1 has A[0] #1 DN#2 has A[0] A[0,*] DN#3 has A[0] DN DN#3 has A[1] #2 A[0,*] DN A[1,*] #3 ● DN は NN に書込完了後に block report を送信 ● NN は File A <-> BlockID の対応表と上を合成
  • 6. P45:NameNode の役割・課題 役割 ● File<->[Block], Block<->[DN] の対応管理 ● DN からの Block report および heartbeat の受付 ● Client からの FS op/RPC のエントリポイント #負荷は軽い( 10Knode/68PB でも 1 台の試算) データ管理・運用に課題 ● 対応表が消える=全データ消滅だが SPoF 稼動 ● ジャーナリング方式でデータ管理されている ◚ しかし、マージは再起動の時(=遅い)
  • 7. P45:NameNode の冗長(?)化 NN /w CheckPoint Role Name Node ※metadata+journal を吸い出して  マージし、書き戻す。 NN の metadata   journal が空に戻って再起動が table  高速化する journal blockmap ※ ジャーナルの NN /w  複製先として登録 Backup Role Backup Role の登場で復旧可能には merged なったが、 blockmap 再作成=全 DN metadata 問合せが必要で failover はできない。 table クラスタ構成で稼動できるように journal 改良予定( HDFS 論文 , 2010 より) ※ こちらをマスタとして NTT-D で Kemari 使って冗長構成組んでるとか  再起動すれば復旧可能
  • 8. P45-47: 基本操作方法 ● 基本は「 hadoop fs -<op> 」で操作。 詳しくは本を。あと hadoop fs だけでヘルプが ● 扱える「ファイル」は「 scheme:... 」の URI で 指定してローカル・リモートの各所を指定 ◚ 今回の HDFS だと hdfs://host/path で ● 簡易的な UNIX-style user/group+rwx ACL あり マルチユーザ運用のためなのでオフにもできる 細かくプレゼン資料にする程ではないので軽く飛ばします
  • 9. P48:org.apache.hadoop.fs.FileSystem URI scheme に対応する FS API の実装クラスを 登録すれば、任意のデータストアが組込可能 組込方法 – hoge:// scheme の場合 ● *.FileSystem の拡張クラスを実装する ● core-site.xml に以下を追加する   <property>   <name>fs.hoge.impl</name>   <value>test.HogeFileSystem</value>   </property> ● hogefs.jar を hadoop の参照 classpath に追加 ● hadoop コマンドでは -libjars ... を追加
  • 10. P48:Extending FileSystem public class HogeFileSystem extends FileSystem { public void initialize(URI uri, Configuration conf) throws IOException { super.initialize(uri, conf); setConf(conf); ダミーで書く程度なら赤字の } メソッドだけ書けば簡単 public URI getUri() { … } public FSDataInputStream open(Path file, int bufferSize) … public FSDataOutputStream create(Path file, … public FSDataOutputStream append(Path file, … public boolean rename(Path src, Path dst) … public boolean delete(Path file) 自前の *OutputStream 書いて … public boolean delete(Path file, booolean recursive) … block report 送ったりさせる public boolean mkdirs(Path file, 必要もあるかも(未検証) … public FileStatus[] listStatus(Path file) ... public FileStatus[] getFileStatus(Path file) … public void setWorkingDirectory(Path newDir) { … } public Path getWorkingDirectory() { … }
  • 11. P49-50:Available Interfaces 低レベルアクセス Hadoop FS API を叩いている場合は ● Java API HDFS 以外にも利用できなくもない ● Thrift RPC (形態: Client ↔ Thrift Server ↔ Java API ) ● libhdfs/C (形態: Client ↔ C ↔ JNI ↔ Java API ) 高レベルアクセス ● FUSE (形態: Fuse-DSF ↔ libhdfs ↔ ... ) ● WebDAV (開発中) (形態: WebDAV Server ↔ Java API ) ● HTTP/XML (形態: XML-generating Web server ↔ Java API ) ● FTP (開発中)
  • 12. P51-62:Using Java API ひたすらコードが続くので、この部分は本文参照。 要点は ● URLStreamHandlerFactory を登録し URL.* API を 使う方法があるが、廃止。毎回 abs URL が必要、 異 scheme 間の操作で問題があるなどした ● カレント URI を FileContext で定め、そこを起点に 操作する方法が新方式 ● 直接 FS API を利用する方法は維持されている ● FS*Stream の Seekable, PositionedReable, Progressable インタフェースを活用すると、 効率のよい読み出しや進行通知ができる。 ● また、 globStatus API では PathFilter を使い glob 指定での一部ファイルの stat 相当が可能 ● FS API は概ね POSIX 風
  • 13. P63:Java API とノード構成の関係 掲載図以上にわかりやすい表現がないのでほぼ同じ図… client node JVM ②get block location ①open Name HDFS ③readDFS (metadata) API Node client FSData*Stream API ⑥close 近い方から読むが 故障時には自動切替 スライド 4 枚目に前述だが、 ④read ⑤read メタデータ系とデータ系 API で 参照先ノードが完全に分かれる。 Data Data Data Node Node Node 図にはないが、各 API の下側に HDFS の実装クラスが入り、実 ノードアクセスを担当する。
  • 14. P64: ノードトポロジと「距離」概念 ノード間距離 d を 元に NN は DN を 管理・制御する d=6 R R DC: A d=4 DC: B #0 #5 #0 #5 d=0 #1 #6 #1 #6 #2 #7 #2 #7 #3 #8 #3 #8 d=2 #4 #9 #4 #9 デフォルトでは全ノードが等距離な構成と見なすので、適切に NN に制御させるには設備 / 遅延 / 帯域を見て距離 d を調整する。 上の d は「ホップ数 +1 」風になっているだけで、実際の設備 次第では必ずしも適切とはいえない。
  • 15. P65-67: トポロジに基づく書込処理 R まず性能のため 最大のローカリティが 得られるノードに書く 次に冗長化のため、別 client DN DN ラックのノードに複製 最後に冗長度の更なる 確保のため、ラック内 DN 別ノードに再複製 複製が dfs.replication.min 個に達した時点で書込完了 ACK は飛ぶ。 その後 dfs.replication 個まで内部で複製を増やす動作になる。 複製エラー時は、正常ノード側の BlockID の付け替えを行い NN に 通知する。すると複製数不足が検知され追加複製トリガが引かれる
  • 16. P68-69: バッファリングと同期 client out.flush() A stat A → block full までは メタデータのみ反映 writing B → 未反映 C → 反映( A と同様) 書込完了 書込中 out.hflush() block#0 block#1 A → 全て反映 B → 未反映 read open C → 全て反映 (new reader) out.hsync() client client A → 全て反映 B C B → 全て反映 C → 全て反映 ブロックの状態は A/B/C からどう見える? ※ なお、 sync ( =~hflush )は ヒント: NOT POSIX deprecated API となった
  • 17. P70:distcp - MapReduce と並列転送 やりたいこと: cp src#0 src#1 src#2 dst#0 dst#1 dst#2 getloc(src) NN MapReduce Engine create+ getloc(dst) cp src#0 dst#0 cp src#1 dst#1 cp src#2 dst#2 dst#0 dst#1 dst#2 Data Nodes ※ ただし DFS 系の間でのみ。コピー元も分散保持していないと   IO ボトルネックで並列処理しても性能が全く出ない(はず)
  • 18. P70:distcp - 使用上の注意 ● デフォルトは1マップで最低 256[MB] をコピー ● デフォルトは1ノードに最大 20 マップ(処理) ● 使用ノード数を絞るなら -m <# of maps> → マップあたりのコピー量を増やす結果に → ただし、最初のコピーは複製ルールにより マップ処理ノードと同じノードに置かれる。 これ起因のアンバランス配置に注意! ● 異バージョン HDFS 間のコピーは不可(非互換) → hftp:// で指定して回避できる → コピー先クラスタ (NN) で実行する必要がある
  • 19. P71-73:HAR – Hadoop ARchive 形式 ● メタデータの管理(保管)効率向上が目的 → データは元々実サイズ分しか使わない ● パックして NameNode 上は「1ファイル」扱い → *.har の位置までのみ NN が管理する ● ファイルの増減・変更の際は全体再作成になる 注意 これは NameNode での効率の話であって、 MapReduce 処理 段階では、各々の処理( split )に HAR 内の複数ファイルを まとめて食わせられるわけではない。 つまり細かい Map タスクが多量に発生するオーバーヘッドは 回避できない。別の対策に CombineFileInputFormat クラスを 用いて、入力データを集約する方法があるので要参照。