Hadoop ラボ:HDFS と MapReduce、ファイルを置き、単語数を読む
このラボは、生徒一人ひとりに小さな Hadoop クラスターを用意します。分散ファイルシステムの HDFS (NameNode と DataNode)と、MapReduce のジョブを動かす YARN(ResourceManager と NodeManager)です。起動するとクラスターが見本の文に対して Hadoop 付属の単語数のジョブを実行し、生徒は自分のファイルを HDFS に置いて一覧し、読み戻し、単語数の結果を読みます。
Apache プロジェクト自身のイメージを手を加えずに動かすので、攻撃できる脆弱なものはなく、調べる対象のシステムがあるだけです。ラボのコピーからインターネットにも、ほかの生徒にも届きません。
生徒が学ぶこと
ビッグデータのシステムがデータをどう保存し、どう処理するか。ファイルは2種類のマシンが担います。どのブロックがどのファイルになるかを知っている NameNode と、バイトを保持する DataNode です。ファイルの書き込みは2回のリクエストで、NameNode が DataNode を選び、DataNode がデータを受け取ります。生徒は curl でそれを自分の目で確かめます。続いて MapReduce の単語数の出力(単語ごとに1行、出現回数つき)を読み、YARN で完了したジョブとして表示されるのを見ます。データ、クラウド、ビッグデータ、分散システムの単元に向いています。正確な文言はお使いの認定機関の単元でご確認ください。
ブラウザーで動かす
ラボのサービスは namenode、datanode、resourcemanager、nodemanager、client の5つです。ラボのターミナルには hadoop コマンドがないので、curl で HTTP 経由で HDFS と話します。WebHDFS は http://namenode:9870/webhdfs/v1/ に、ジョブの一覧は http://resourcemanager:8088/ws/v1/cluster/apps にあります。起動時にクラスターが見本の文の単語数を数え、結果を /user/lab/wordcount-out に残しています。これは生徒が起動するものではありません。自分のファイルで MapReduce のジョブを動かすには、ターミナルで docker exec client hadoop jar を使います。hadoop コマンドがあるのは client サービスだからです。ラボを止めると何も保存されず、起動には1分ほどかかります。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。Hadoop: HDFS and MapReduceを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページのラボバーには、HDFS NameNode, the page that lists every file と YARN ResourceManager, the page that lists the jobs の2つのリンクがあります。NameNode のページで Utilities、Browse the file system の順に選び、/user/lab を開きます。ラボの横のターミナルでは、curl http://namenode:9870/webhdfs/v1/user/lab/input?op=LISTSTATUS が同じフォルダーを一覧し、/user/lab/wordcount-out/part-r-00000 に op=OPEN をつけた curl -L が単語数を表示します。
何を提出させるか
HDFS に置いたファイルのパス、そのファイルから MapReduce が作った単語数の行、そして NameNode と DataNode がそれぞれ何をするかを書いた一文です。生徒は自分の文章を選べるので、答えは一人ひとり違います。さらに力を見たいときは、なぜファイルを読むのに2回のリクエストが要るのか、このラボはブロックを1つしか持たないのに実際のクラスターはなぜ3つ持つのかを尋ねてください。
自動では採点されません。ラボの限界も授業で伝えておくとよいでしょう。DataNode と NodeManager がそれぞれ1つなので、Hadoop の構成は分かりますが、マシンの故障に耐える様子や大きなジョブが速くなる様子は分からず、権限も無効になっています。
このラボの基本レッスン
Hadoop Basics は、このラボで進める小さなレッスンで、各手順に説明と、生徒のターミナルにコマンドを入力する Run ボタンがあります。1文のファイルを curl で HDFS に置いて一覧し、読み戻し、続いてクラスターが作った単語数を読み、ジョブがどうなったかを ResourceManager に尋ねます。
無料の個人アカウントには、ホームにある Basics モジュールで配布されます。どの学校もライブラリの Basics フォルダから自分のモジュールにコピーでき、新しい学校ではサンプルモジュールの Lab Basics (Sample) に入っています。意図的に小さくしてあり、ラボで進めるレッスンとは何かを教員に見せるもので、残りはラボが担います。変更したい場合は自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルは、公開イメージ1つ、バージョン 3.4.1 に固定した apache/hadoop を手を加えずに5回動かします。Apache Hadoop のライセンスは Apache License 2.0 で、当社は配布していません。各サービスは起動時に自分の設定を書き、ヒープは極限まで小さく、ジョブは1つの小さなジョブとして動くので、1つのコピーがプラットフォームのメモリに収まります。リポジトリのテストは、ファイルの書き込み、読み戻し、単語数を含めて、プラットフォームと同じ制限のもとで生徒の操作をたどります。
課題として出す
HDFS に置くファイルと、何を提出するかを課題に書いてください。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-hadoop とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
よくある質問
- NameNode のページでファイルの中身を読めないのはなぜですか?
- NameNode のページにはファイルとフォルダーが一覧されますが、ファイルのバイトは DataNode にあり、ブラウザーは読むためにそこへ送られます。ラボのコピーはそれを開いていません。ターミナルで op=OPEN をつけた curl -L で読んでください。-L が NameNode から DataNode へのリダイレクトをたどります。
- ラボを止めるとファイルは残りますか?
- いいえ。HDFS はデータをラボのコンテナーの中に持つので、止めたラボは空の状態から始まり、見本の単語数のジョブもやり直されます。止める前に、したことを提出するよう生徒に伝えてください。
- Hadoop ラボは単語数を自動で採点しますか?
- いいえ。自動では採点されません。HDFS に置いたファイルのパスと、そこから作った単語数の行を提出させてください。NameNode と DataNode がそれぞれ何をするかを書いた一文で、理解したかどうかが分かります。