Apache Hadoop — 1つのPodにHDFSとYARNを立てて運用する
1 ポッドの HDFS にファイルを置き、二つの道で読む
目標
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つで、一覧・状態・内容を受け取れるので、スクリプトやモニタリングは、たいていこの道を使います。
ステップ
hdfs getconf -confKeyで、fs.defaultFS・dfs.replication・dfs.blocksizeを尋ねて、/root/hdp/first/conf.txtに、키=값の形式で3行書き込んでください(プレースホルダーはキーと値です)。hdfs dfsadmin -reportの出力を、/root/hdp/first/report.txtに保存してください。- /user/root/first/logsディレクトリを、HDFSに作成してください。
/data/logs/access-2026-03-01.logをアップロードしてください(アップロード先: /user/root/first/logs/)。hdfs dfs -catで、そのファイルの行数を数えて、/root/hdp/first/lines.txtに整数で記入してください。- curlでWebHDFSの
LISTSTATUSを呼び出し、/user/root/first/logsの一覧のレスポンスを、/root/hdp/first/liststatus.jsonに保存してください。 - /user/root/first/archiveを作成し、ログファイルを、/user/root/first/archive/access-0301.logに移動したあと、
hdfs fsck <새 경로> -files -blocksの出力を、/root/hdp/first/blocks.txtに保存してください(プレースホルダーは新しいパスです)。 - /root/hdp/first/report.mdに、
## 두 역할・## 두 길・## 이름만 바뀐다の3つの節を書いてください(見出しは韓国語で、順に「2つの役割」「2つの道」「名前だけが変わる」を意味します)。2つ目の節にステップ5の行数を、3つ目の節に移動の前後で同じだったfileIdを入れてください。
参考
- HDFSは、Podが起動したときにすでに起動しています(
lab-hadoop status)。止まっていれば、lab-hadoop startで起動します。データはNameNode・DataNodeのディスクに残っているので、再び起動すればそのままです。 hdfs dfsコマンド1つがJVM 1つなので、1–2秒かかります。export HADOOP_ROOT_LOGGER=WARN,consoleでログを減らすと、出力がすっきりします。- WebHDFS:
curl -s "http://localhost:9870/webhdfs/v1<경로>?op=LISTSTATUS&user.name=root"(プレースホルダーはパスです)。内容を受け取るop=OPENはDataNodeに渡される(307)ので、curl -Lが必要です。 - よくあるミス: ローカルパスとHDFSパスを混同すること(
/user/root/...はHDFSの中)、-reportをNameNodeが起動する前に実行すること、mvでファイルがコピーされると思い込むこと。 - 公式ドキュメント: HDFS Architecture・Pseudo-Distributed Operation・FileSystem Shell・WebHDFS REST API
設定はどこから来るのか
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のあとに何がそのままだったかを書いてください。