TT Lab
はじめる
学ぶ 学習パス コース

Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する

1 ポッドの HDFS にファイルを置き、二つの道で読む

TT Labで続きを見る

目標

Pod1つで起動した疑似分散HDFSの設定と状態を確認し、アクセスログ1つをアップロードして、シェル(hdfs dfs)とHTTP(WebHDFS)の2つの道で読みます。ファイルを移動する(mv)ことが、NameNodeが持つ名前(ラベル)だけを書き換える操作であることを、fileIdとブロックIDで確認します。

なぜ重要なのか

HDFSは、役割を2つに分けたファイルシステムです。NameNodeは、ディレクトリツリーと「このファイルはどのブロックで、そのブロックはどのDataNodeにあるか」というメタデータをメモリに保持し、DataNodeは、ブロックのバイトを自分のディスクにファイルとして保持します。クライアントはNameNodeに場所を尋ね、バイトはDataNodeと直接やり取りします。 この分離を知ると、運用の多くのことが説明できます。名前の変更と移動はバイトに触れないので、サイズに関係なく即座に終わり、NameNodeが止まるとバイトが無事でも何も読めません。設定がどこから来るか(*-site.xmlが*-default.xmlを上書きする)も、同じ理由で重要です。クライアントとデーモンが異なる設定を見ると、同じコマンドが違う動作をします。 WebHDFSは、同じNameNodeにHTTPで問い合わせる道です。Javaクライアントなしでcurl 1つで、一覧・状態・内容を受け取れるので、スクリプトやモニタリングは、たいていこの道を使います。

ステップ

  1. hdfs getconf -confKeyで、fs.defaultFS・dfs.replication・dfs.blocksizeを尋ねて、/root/hdp/first/conf.txtに、키=값の形式で3行書き込んでください(プレースホルダーはキーと値です)。
  2. hdfs dfsadmin -reportの出力を、/root/hdp/first/report.txtに保存してください。
  3. /user/root/first/logsディレクトリを、HDFSに作成してください。
  4. /data/logs/access-2026-03-01.logをアップロードしてください(アップロード先: /user/root/first/logs/)。
  5. hdfs dfs -catで、そのファイルの行数を数えて、/root/hdp/first/lines.txtに整数で記入してください。
  6. curlでWebHDFSのLISTSTATUSを呼び出し、/user/root/first/logsの一覧のレスポンスを、/root/hdp/first/liststatus.jsonに保存してください。
  7. /user/root/first/archiveを作成し、ログファイルを、/user/root/first/archive/access-0301.logに移動したあと、hdfs fsck <새 경로> -files -blocksの出力を、/root/hdp/first/blocks.txtに保存してください(プレースホルダーは新しいパスです)。
  8. /root/hdp/first/report.mdに、## 두 역할・## 두 길・## 이름만 바뀐다の3つの節を書いてください(見出しは韓国語で、順に「2つの役割」「2つの道」「名前だけが変わる」を意味します)。2つ目の節にステップ5の行数を、3つ目の節に移動の前後で同じだったfileIdを入れてください。

参考

設定はどこから来るのか

hdfs getconf -confKey <키>で、fs.defaultFS・dfs.replication・dfs.blocksizeの3つの値を尋ねて、/root/hdp/first/conf.txtに、fs.defaultFS=값のように키=값の形式で3行書き込んでください(プレースホルダーはキーと値です)。

最初の2つは、このイメージがcore-site.xml・hdfs-site.xmlで変更した値で、ブロックサイズは誰も変更していないので、hdfs-default.xmlのデフォルト値が出ます。サイトファイルがデフォルトファイルを上書きするというルールが、この3つすべてで見えます。

NameNodeから見たクラスター

hdfs dfsadmin -reportの出力を、/root/hdp/first/report.txtに保存してください。

レポートの上側はクラスター全体(容量・使用量・レプリケーション不足のブロック)、下側はDataNodeごとの状態です。生きているDataNodeが何台か、設定された容量がいくつかを見てください。採点ツールは、同じ数値をNameNodeのJMXから読んで比べます。

HDFSの中に場所を作る

/user/root/first/logsディレクトリを、HDFSに作成してください(途中のディレクトリも含めて)。

hdfs dfs -mkdir -pです。ディレクトリはNameNodeのメタデータにだけあり、DataNodeには何もできません。ディレクトリにはブロックがないからです。

ファイルをアップロードする

ローカルの/data/logs/access-2026-03-01.logを、同じ名前でアップロードしてください。アップロード先: /user/root/first/logs/(HDFS)

hdfs dfs -putは、NameNodeからブロックの場所を受け取って、DataNodeにバイトを流し込みます。アップロード中は、._COPYING_が付いた名前であり、終わると正式な名前になります。採点ツールは、長さと内容をローカルの元データと比べます。

シェルで読む

hdfs dfs -catで、/user/root/first/logs/access-2026-03-01.logを読んで行数を数え、/root/hdp/first/lines.txtに整数で記入してください。

hdfs dfs -cat 경로 | wc -lです(プレースホルダーはパスです)。バイトはDataNodeから直接来ます。ローカルの元データと行数が同じかも、自分で比べてみてください。

HTTPで読む(WebHDFS)

curlでhttp://localhost:9870/webhdfs/v1/user/root/first/logs?op=LISTSTATUS&user.name=rootを呼び出して、レスポンスのJSONを、/root/hdp/first/liststatus.jsonにそのまま保存してください。

レスポンスのFileStatuses.FileStatusに、ファイルごとの長さ・ブロックサイズ・レプリケーション係数・所有者・fileId(inode番号)が入っています。fileIdを覚えておいてください。次のステップで、移動したあとも同じかを見ます。

移動はラベルだけを付け替える

/user/root/first/archiveをHDFSに作成し、ログファイルを、/user/root/first/archive/access-0301.logにhdfs dfs -mvしてください。そのあと、hdfs fsck /user/root/first/archive/access-0301.log -files -blocksの出力を、/root/hdp/first/blocks.txtに保存してください。

mvは、NameNodeの中で名前を書き換えるだけです。そのため、fileIdがそのままで、ブロックIDもそのままで、ファイルが1TBでも即座に終わります。採点ツールは、ステップ6で保存したfileIdと今のfileId、そして自分が保存したブロックIDと今のブロックIDを比べます。

2つの役割を数値で残す

/root/hdp/first/report.mdに、## 두 역할・## 두 길・## 이름만 바뀐다の3つの節を書いてください(見出しは韓国語で、順に「2つの役割」「2つの道」「名前だけが変わる」を意味します)。2つ目の節にステップ5の行数を、3つ目の節に移動の前後で同じだったfileIdを、数値で入れてください。

最初の節には、NameNodeとDataNodeがそれぞれ何を持っているか、2つ目の節には、シェルとWebHDFSが同じファイルをどのように見せたか、3つ目の節には、mvのあとに何がそのままだったかを書いてください。