はじめに
あなたは小売業者が、「店舗の毎日の記録で、どの商品が最も多く登場したか?」という単純な疑問に答える手伝いをしています。数を集計する前に、ファイルを集め、その内容が利用でき、正しいことを確かめる必要があります。この実験は、そのための第一歩です。
日常のデータからビッグデータへ
1店舗だけなら、毎日の記録はノートパソコンで開ける小さなファイルに収まるでしょう。では、何千もの店舗が毎日記録を送り、ウェブサイトの操作履歴や倉庫の更新情報も加わる状況を想像してください。保存するデータが増え、新しいデータが次々に届き、ファイルの構造もさまざまになります。
ビッグデータとは、規模、到着する速さ、複雑さのために、現在使っているツールやリソースでは扱いにくいデータ処理のことです。何行を超えたらビッグデータになる、という共通の基準はありません。実際に考えるべきことは、データを保存できるか、使える時間内に処理できるか、機器が故障しても作業を続けられるか、という点です。
小さな売上ファイルなら、表計算ソフト、データベース、Python スクリプトで十分な場合もあります。処理量が増えたときの方法の1つは、接続された複数のコンピューターで保存と処理を分担することです。協力して動くコンピューターの集まりをクラスター、それらに作業を分担させる方式を分散コンピューティングと呼びます。
Hadoop の役割
Apache Hadoop は、クラスターにデータを保存し、処理するためのオープンソースのツール群です。まず次の2つを押さえると、全体をイメージしやすくなります。
| 構成要素 | 役割 | 小売業者の疑問 |
|---|---|---|
| HDFS — Hadoop 分散ファイルシステム(Hadoop Distributed File System) | 複数のマシンにファイルを保存し、設定に応じてデータの複製を保持します | 毎日の入力ファイルをどこに保存できるか? |
| MapReduce — バッチ処理フレームワーク | 処理ジョブを小さなタスクに分割し、その結果をまとめます | これらのファイルにある商品ラベルをどう集計するか? |
バッチとは、昨日のファイルのように、まとめて処理する範囲が決まったデータの集合です。後の実験では、用意された集計プログラムを実行します。この実験では保存を担当する HDFS を使います。計算が役立つのは、意図したデータを読み込めているときだけだからです。
Hadoop は、さまざまなデータツールの一部です。後のコースでは、ファイルを SQL で検索する Hive、プログラムによるデータ処理を行う Spark、イベントを継続的に届ける Kafka を紹介します。この実験を始めるためにそれらのツールは必要なく、今は名前を覚える必要もありません。
ワークフローの最初の作業
小売業者のワークフローを単純にすると、次のようになります。
商品ファイルを集める → HDFS に保存する → バッチを処理する → 集計結果を確認する
ここから始めます
今回の作業は、ファイルを1つアップロードし、読み戻して、内容が保たれていることを確認することです。料理に使う前に材料を確かめるようなものです。信頼できる計算をするには、まず正しく保存する必要があります。
この実験では 1台のマシンに Hadoop が用意されているため、クラスターをインストールせずに実際の HDFS コマンドを学べます。この環境でも、ローカルファイルと HDFS ファイルには、それぞれ別のパスとアクセス用コマンドがあります。複数のマシンにまたがる保存や、マシン故障からの復旧はこの構成では実演しません。後で HDFS を詳しく学ぶにつれ、これらの考え方も理解できるようになります。
この実験を終えると、次のことができるようになります。
- ローカルファイルと HDFS に保存されたファイルを区別する。
- HDFS ディレクトリを作成してファイルをアップロードする。
- HDFS ファイルを読み、ローカルの元ファイルと比較する。
- 同じデータを別の保存先ファイル名でアップロードする。
実験全体で Terminal(ターミナル)タブを使います。基本的なターミナル操作だけで進められ、Java や Python のプログラミングは必要ありません。パスやターミナルコマンドに慣れていない場合は、Linux 学習パスから始めてください。
最初のファイルを HDFS にアップロードする
このステップでは、ローカルファイルを確認し、自分の HDFS ディレクトリを作成して、そこにファイルをアップロードします。
ターミナルでは、実行したい操作を入力します。hdfs コマンドはクライアントであり、保存されたファイルを管理する、起動中の HDFS サービスにリクエストを送ります。以下にはローカルの Linux コマンドと HDFS コマンドの両方が登場します。コマンドを見ると、どちらの保存領域を使っているか分かります。
HDFS サービスの起動と小さな入力ファイルの準備は済んでいます。ターミナルをクリックして、以下のコマンドを順番に実行してください。プロンプトが戻ってから次に進みます。プロンプトの記号を含めず、コマンドだけをコピーしてください。
cd を使い、シェルの作業場所をローカルのプロジェクトディレクトリに移します。
cd /home/labex/project
パスが / で始まるので、これは絶対パスです。ローカルの入力ファイルは、この場所の下にある data ディレクトリにあります。通常の Linux の cat コマンドは、ローカルファイルを表示します。
cat /home/labex/project/data/products.txt
表示される内容は次のとおりです。
notebook pen notebook
folder pen
notebook folder
この単純化したサンプルでは、各単語が商品ラベルであり、1回の出現が記録された商品1点を表します。notebook と pen の出現回数の合計は、手で数えても5回と分かります。内訳はノートが3点、ペンが2点です。大きなファイルが多数ある場合は、バッチプログラムでこの集計を行えます。
今はこの疑問を頭に置きながら、テキストをそのまま保存することに集中しましょう。正しい結果をすぐ判断できるよう、読みやすい3行を使います。このサンプル自体の処理に Hadoop が必要なわけではありません。
HDFS には独自のディレクトリツリーがあります。この環境では、hdfs dfs がファイルシステムの操作を HDFS に送ります。Linux の mkdir でローカルディレクトリを作っても、HDFS ディレクトリは作成されません。
HDFS のホーム /user/labex の下にディレクトリを作成します。-mkdir はディレクトリを作る操作です。-p を付けると、不足する親ディレクトリも作成され、対象のディレクトリがすでにあっても使えます。
hdfs dfs -mkdir -p /user/labex/your-first-hadoop-lab
成功した場合、通常は何も表示されません。操作が終わるとプロンプトが戻ります。ローカルのパスと同じようにスラッシュで表記されていますが、このディレクトリは HDFS にあります。
-put は、ローカルの元ファイルを HDFS の保存先にコピーします。以下の1つ目のパスはローカル、2つ目は HDFS のパスです。
hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products.txt
アップロードに成功した場合、通常は何も表示されず、ローカルの元ファイルも残ります。成功した後でもう一度同じコマンドを実行すると、保存先がすでに存在すると HDFS に通知されます。その場合は内容の確認に進んでください。削除や上書きは必要ありません。
-ls を使って HDFS ディレクトリの一覧を表示します。
hdfs dfs -ls /user/labex/your-first-hadoop-lab
Found 1 items と、次のパスで終わるファイルの項目が表示されるはずです。
/user/labex/your-first-hadoop-lab/products.txt
この項目には、アクセス権限、所有者、グループ、サイズ、更新日時も含まれています。それぞれの詳細は後で学びます。このステップでは、保存先のパスから HDFS にファイルが存在することを確認できれば十分です。次は内容を調べます。
ファイルを読み戻して内容を確認する
このステップでは、HDFS ファイルを読み、その内容をローカルに保存して、元ファイルと比較します。
小売業者は最終的に、保存されたファイルからラベルを集計します。間違ったファイルをアップロードしたり、1行失われたりすると、プログラム自体は成功しても後の集計結果は誤る可能性があります。ディレクトリ一覧から分かるのはファイルが存在することであり、内容の正しさまでは分かりません。
読み戻す前に、表示される内容を予想してください。アップロードによって商品ラベルが変わったり、行が消えたりするでしょうか? HDFS の -cat は、HDFS からファイルを読み、ターミナルに内容を表示します。
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt
表示される内容は次のとおりです。
notebook pen notebook
folder pen
notebook folder
ステップ1で確認したローカルファイルと比べてください。単語と改行が一致するはずです。コマンドの違いにも注目しましょう。この環境では、cat がローカルファイルを読み、hdfs dfs -cat が HDFS ファイルを読みます。
読み戻した結果をローカルに残すには、シェルの > 演算子を使います。これは、コマンドの表示出力をローカルファイルにリダイレクトします。ファイルがなければ作成し、すでにあればその内容を置き換えます。準備済みの output ディレクトリに結果を保存しましょう。
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products.txt > /home/labex/project/output/products-readback.txt
今回はローカルの出力ファイルに書き込まれたため、商品テキストはターミナルに表示されません。HDFS の元ファイルは変わりません。ローカルの cat コマンドで、保存した結果を読みます。
cat /home/labex/project/output/products-readback.txt
同じ3行が表示されるはずです。これで、ローカルの元ファイル、HDFS ファイル、ローカルに読み戻したファイルがそろいました。
diff を使い、元ファイルと保存した結果を比較します。2つのファイルが同じなら、diff は何も表示せず、正常に終了します。
diff /home/labex/project/data/products.txt /home/labex/project/output/products-readback.txt
差分が表示されずにプロンプトが戻れば、読み戻した内容と元ファイルが一致しています。差分が出た場合は、上記の HDFS の入力パスとローカルの出力パスを正確に指定して読み戻しのコマンドを再実行し、もう一度比較してください。
保存先の名前を変えて練習する
このステップでは、アップロードコマンドの一部を変え、ファイルの内容が変わるかどうかを確認します。
次のコマンドを実行する前に結果を予想してください。ローカルの元ファイルはそのままで、HDFS の保存先ファイル名だけを変えると、商品ラベルは変わるでしょうか? 最初の HDFS ファイルは残るでしょうか?
ローカルの元ファイルをもう一度アップロードします。今回は保存先の名前を products-copy.txt にします。
hdfs dfs -put /home/labex/project/data/products.txt /user/labex/your-first-hadoop-lab/products-copy.txt
前と同じく、成功した場合は通常何も表示されません。すでにこのアップロードを終えている場合、保存先が存在するというメッセージが出たら、再度アップロードせずに内容を確認してください。
HDFS ディレクトリの一覧を表示して、予想を確かめます。
hdfs dfs -ls /user/labex/your-first-hadoop-lab
今度は Found 2 items と、次のパスで終わる項目が表示されるはずです。
/user/labex/your-first-hadoop-lab/products-copy.txt
/user/labex/your-first-hadoop-lab/products.txt
両方のファイルが残っています。-put はローカルの元ファイルを指定した保存先にコピーする操作で、先にある HDFS ファイルの名前を変える操作ではないからです。2つ目のファイルは同じ記録の練習用コピーであり、別の日の売上データではありません。バッチ入力の準備を学ぶときには、重複したコピーを二重に集計しないよう、ファイルを慎重に選びます。
新しい HDFS ファイルを読みます。
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt
同じ3行の商品ラベルが出力されるはずです。ファイル名を変えても内容は変わりません。
同じ読み戻しの方法で、新しいファイルをローカルに保存します。
hdfs dfs -cat /user/labex/your-first-hadoop-lab/products-copy.txt > /home/labex/project/output/products-copy-readback.txt
保存した結果を元ファイルと比較します。
diff /home/labex/project/data/products.txt /home/labex/project/output/products-copy-readback.txt
差分は表示されないはずです。これで、予想した2点を確認できました。最初の HDFS ファイルは残り、2つ目にも同じデータが入っています。
次に進む前に、ローカルファイルを読むコマンドと HDFS ファイルを読むコマンドを区別してください。次の実験では、HDFS コマンドがどこに接続するかを決める設定を調べます。
まとめ
小売業者が商品記録を集めて数えたいという要望から出発しました。増え続けるデータの処理で、分散した保存と処理が必要になる理由と、Hadoop の役割を学びました。HDFS はファイルを保存し、MapReduce はバッチを処理できます。
このワークフローのうち保存の部分を実践しました。ローカルの小売データのテキストファイルを HDFS にアップロードし、読み戻して、diff で内容が保たれていることを確認しました。その後、HDFS の保存先の名前だけを変えた場合の結果を予想し、確かめました。
hdfs dfs -mkdir -p、-put、-ls、-cat を練習し、これらの HDFS 操作と、ローカルの cat やシェルの出力リダイレクトとの違いを学びました。次は、Hadoop クライアントが HDFS を見つける仕組みと、保存と計算の連携について調べます。



