ザラのデータ魔法

HadoopBeginner
オンラインで実践に進む

はじめに

魔法の砂漠王国ザラでは、賢く慈悲深いアミール王は、彼の領土に散らばる膨大なデータ資源の力を引き出そうとしました。彼は最も熟練したデータウィザードを呼び寄せて、王国のデータを収集、処理、分析し、すべての人の意思決定と繁栄に役立つ洞察を解き明かすシステムを考案するように命じました。

その目標は、Hadoop 分散ファイルシステム (HDFS) と統合し、効率的なデータ処理のために MapReduce の力を活用できる堅牢で拡張可能なデータプラットフォームを作成することでした。このプラットフォームにより、王国は貿易記録、農業収穫量、国勢調査情報など、さまざまなソースからのデータを分析できるようになり、アミール王は臣民の幸福のために情報に基づいた意思決定を行うことができるようになります。

Hadoop エコシステムの探索

このステップでは、Hadoop エコシステムとそのコアコンポーネントである HDFS と MapReduce に慣れ親しむことができます。

Hadoop は、コモディティハードウェアのクラスタ全体で大規模なデータセットを分散保存および処理するためのオープンソースフレームワークです。主に 2 つのコンポーネントで構成されています。

  1. Hadoop 分散ファイルシステム (HDFS): 複数のマシンにまたがって大きなファイルを保存するために設計された分散ファイルシステムで、データへのフォールトトレランスと高スループットアクセスを提供します。

  2. MapReduce: クラスタ内の複数のマシンで並列に大量のデータを処理するアプリケーションを書くためのプログラミングモデルとソフトウェアフレームワーク。

Hadoop エコシステムを探索するには、ターミナルで次のコマンドを使用できます。

まず、ターミナルで次のコマンドを実行して、hadoop ユーザーとしてログインしていることを確認します。

su - hadoop

HDFS 内のディレクトリとファイルを一覧表示します。

hdfs dfs -ls /

HDFS 内に新しいディレクトリを作成します。

hdfs dfs -mkdir -p /home/hadoop/input

ローカルファイルを HDFS にコピーします。

hdfs dfs -put /home/hadoop/local/file.txt /home/hadoop/input

これらのコマンドは、HDFS とのやり取り方法を示しており、その内容を一覧表示したり、ディレクトリを作成したり、ローカルファイルシステムからファイルをコピーしたりします。

hdfs dfs コマンドは、Hadoop 分散ファイルシステム (HDFS) とやり取りするために使用されます。-ls オプションは HDFS 内のディレクトリの内容を一覧表示し、-mkdir は新しいディレクトリを作成します。-put オプションはローカルファイルを HDFS にコピーします。

MapReduce ジョブの実行

このステップでは、HDFS に格納されたデータに対して MapReduce ジョブを実行する方法を学び、並列処理の力を活用して大規模なデータセットを効率的に分析します。

MapReduce は、クラスタ内の複数のマシンで並列に大規模なデータセットを処理するためのプログラミングモデルです。主に 2 つの主なフェーズで構成されています。

  1. Map: 入力データが小さなチャンクに分割され、それぞれのチャンクが「マッパー」と呼ばれる別個のタスクによって処理されます。マッパーはデータを処理し、キーと値のペアを出力します。

  2. Reduce: マッパーからの出力はキーでソートされ、グループ化され、それぞれのグループが「リデューサー」と呼ばれる別個のタスクによって処理されます。リデューサーは、各キーに関連付けられた値を結合し、最終結果を生成します。

テキストファイル内の単語の出現回数をカウントする簡単な MapReduce ジョブを実行してみましょう。まず、次の内容の WordCount.java という Java ファイルを作成します。

import java.io.IOException;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class WordCount {

    public static class TokenizerMapper
            extends Mapper<Object, Text, Text, IntWritable>{

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();

        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                word.set(itr.nextToken());
                context.write(word, one);
            }
        }
    }

    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true)? 0 : 1);
    }
}

次に、Java ファイルをコンパイルします。

mkdir ~/wordcount
javac -source 8 -target 8 -classpath $(hadoop classpath) -d ~/wordcount WordCount.java
jar -cvf ~/wordcount.jar -C ~/wordcount.

最後に、MapReduce ジョブを実行します。

hadoop jar ~/wordcount.jar WordCount /home/hadoop/input/file.txt /home/hadoop/output

WordCount クラスは、テキストファイル内の単語の出現回数をカウントする MapReduce ジョブを定義しています。TokenizerMapper クラスは、入力テキストの各行をトークン化し、(単語,1) のキーと値のペアを出力します。IntSumReducer クラスは、各単語の値 (カウント) を合計し、最終的な (単語,カウント) のペアを出力します。

Java ファイルはコンパイルされ、JAR ファイルにパッケージ化され、その後 hadoop jar コマンドを使用して実行されます。入力ファイルパス (/home/hadoop/input/file.txt) と出力ディレクトリパス (/home/hadoop/output) が引数として提供されます。

まとめ

この実験では、魔法の砂漠王国ザラへの旅に出ました。そこでは、アミール王が Hadoop エコシステムの力を利用して王国のデータを処理および分析するのを支援しました。Hadoop のコアコンポーネント、つまり分散保存用の HDFS と並列データ処理用の MapReduce を探索しました。

実践的な手順を通じて、HDFS とやり取りしたり、ディレクトリを作成したり、ファイルをアップロードしたりする方法を学びました。また、MapReduce ジョブ、特に単語カウントアプリケーションを実行する経験も積み、これが Hadoop の並列処理能力を示しています。

この実験を完了することで、Hadoop を HDFS と MapReduce と統合する貴重なスキルを身につけました。これにより、現実世界のビッグデータチャレンジに対処する知識を手に入れることができます。この経験は、データウィザードとしての成長に確実に貢献し、さまざまな分野で洞察を解き明かし、意思決定を促進する力を与えます。