砂漠データ探索の探求

HadoopHadoopBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

広大な砂漠の荒廃地で、孤独な商人が危険な旅に出ます。その目的は、灼熱する砂の下に秘められた謎を解き明かすことです。商人の目標は、古代の遺物や人工物を発見し、忘れ去られた文明の秘密を解き明かすことです。しかし、砂漠に埋もれた膨大なデータ量は、脅威的なチャレンジをもたらし、効果的に情報を処理し分析するために、Hadoop MapReduce の力が必要です。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL hadoop(("Hadoop")) -.-> hadoop/HadoopMapReduceGroup(["Hadoop MapReduce"]) hadoop(("Hadoop")) -.-> hadoop/HadoopYARNGroup(["Hadoop YARN"]) hadoop(("Hadoop")) -.-> hadoop/HadoopHiveGroup(["Hadoop Hive"]) hadoop/HadoopMapReduceGroup -.-> hadoop/setup_jobs("Setting up MapReduce Jobs") hadoop/HadoopMapReduceGroup -.-> hadoop/mappers_reducers("Coding Mappers and Reducers") hadoop/HadoopYARNGroup -.-> hadoop/yarn_jar("Yarn Commands jar") hadoop/HadoopHiveGroup -.-> hadoop/process("Process Control Function") hadoop/HadoopHiveGroup -.-> hadoop/aggregating("Aggregating Function") hadoop/HadoopHiveGroup -.-> hadoop/udf("User Defined Function") subgraph Lab Skills hadoop/setup_jobs -.-> lab-288986{{"砂漠データ探索の探求"}} hadoop/mappers_reducers -.-> lab-288986{{"砂漠データ探索の探求"}} hadoop/yarn_jar -.-> lab-288986{{"砂漠データ探索の探求"}} hadoop/process -.-> lab-288986{{"砂漠データ探索の探求"}} hadoop/aggregating -.-> lab-288986{{"砂漠データ探索の探求"}} hadoop/udf -.-> lab-288986{{"砂漠データ探索の探求"}} end

マッパーの実装

このステップでは、砂漠の発掘から得られた生データを処理するためのマッパークラスを作成します。目的は、データから関連する情報を抽出し、リデューサによるさらなる分析のために準備することです。

su - hadoop コマンドを使用して hadoop ユーザーに切り替え、自動的に /home/hadoop ディレクトリに移動します。このとき、ls. コマンドを使用してデータファイル data*.txt を確認します。その後、以下のコードに従ってそのディレクトリに ArtifactMapper.java ファイルを作成して入力します。

import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class ArtifactMapper extends Mapper<LongWritable, Text, Text, LongWritable> {

    private final static LongWritable ONE = new LongWritable(1);
    private Text word = new Text();

    @Override
    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // Split the line into words
        String[] tokens = value.toString().split("\\s+");

        // Emit each word with a count of 1
        for (String token : tokens) {
            word.set(token);
            context.write(word, ONE);
        }
    }
}

ArtifactMapper クラスでは、Hadoop が提供する Mapper クラスを拡張します。map メソッドをオーバーライドして、各入力キーと値のペアを処理します。

  1. 入力キーは、入力行のバイトオフセットを表す LongWritable であり、入力値は、入力ファイルからのテキスト行を含む Text オブジェクトです。
  2. map メソッドは、split メソッドと正規表現 "\\s+" を使用して、入力行を個々の単語に分割します。これにより、1 つ以上の空白文字が一致します。
  3. 各単語に対して、map メソッドは Text オブジェクトを作成し、それをキーとして発行します。また、その単語のカウントを表す定数 LongWritable1 を値として発行します。

リデューサの実装

このステップでは、マッパーから発行されたデータを集約するためのリデューサクラスを作成します。リデューサは、各単語の出現回数をカウントし、最終的な出力を生成します。

/home/hadoop ディレクトリに、以下のコード内容に従って ArtifactReducer.java ファイルを作成して入力します。

import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class ArtifactReducer extends Reducer<Text, LongWritable, Text, LongWritable> {

    @Override
    public void reduce(Text key, Iterable<LongWritable> values, Context context)
            throws IOException, InterruptedException {
        long sum = 0;
        for (LongWritable value : values) {
            sum += value.get();
        }
        context.write(key, new LongWritable(sum));
    }
}

ArtifactReducer クラスでは、Hadoop が提供する Reducer クラスを拡張します。reduce メソッドをオーバーライドして、各キーに関連付けられた値を集約します。

  1. 入力キーは、単語を表す Text オブジェクトであり、入力値は、マッパーから発行されたその単語のカウントを表す LongWritable オブジェクトの Iterable です。
  2. reduce メソッドは、値を反復処理し、与えられた単語のすべてのカウントの合計を計算します。
  3. その後、reduce メソッドは、context.write を使用して、単語をキーとして、合計カウントを値として発行します。

ドライバの作成

このステップでは、MapReduce ジョブを調整するためのドライバクラスを作成します。ドライバは、ジョブを構成し、入力と出力のパスを指定し、Hadoop クラスタにジョブを送信します。

/home/hadoop ディレクトリに、以下のコード内容に従って ArtifactDriver.java ファイルを作成して入力します。

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

public class ArtifactDriver {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        Job job = Job.getInstance(conf, "Artifact Word Count");

        // Specify the job's jar file by class
        job.setJarByClass(ArtifactDriver.class);

        // Set the Mapper and Reducer classes
        job.setMapperClass(ArtifactMapper.class);
        job.setReducerClass(ArtifactReducer.class);

        // Set the output key and value types
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);

        // Set the input and output paths
        FileInputFormat.addInputPath(job, new Path(args[0]));
        FileOutputFormat.setOutputPath(job, new Path(args[1]));

        // Submit the job and wait for completion
        System.exit(job.waitForCompletion(true)? 0 : 1);
    }
}

ArtifactDriver クラスでは、MapReduce ジョブを作成し、ArtifactMapperArtifactReducer クラスを実行するように構成します。

  1. main メソッドは、新しい Configuration オブジェクトと、カスタム名 "Artifact Word Count" の Job オブジェクトを作成します。
  2. setMapperClasssetReducerClass メソッドは、ジョブで使用するマッパーとリデューサクラスを指定するために使用されます。
  3. setOutputKeyClasssetOutputValueClass メソッドは、ジョブの出力キーと値の型を指定するために使用されます。
  4. FileInputFormat.addInputPath メソッドは、ジョブの入力パスを指定するために使用されます。これは、最初のコマンドライン引数として取られます。
  5. FileOutputFormat.setOutputPath メソッドは、ジョブの出力パスを指定するために使用されます。これは、2番目のコマンドライン引数として取られます。
  6. job.waitForCompletion メソッドは、ジョブを送信して完了を待つために呼び出されます。ジョブが成功した場合はステータスコード0で、失敗した場合は1でプログラムが終了します。

ジョブのコンパイルと実行

このステップでは、Java クラスをコンパイルし、Hadoop クラスタ上で MapReduce ジョブを実行します。

まず、Java クラスをコンパイルする必要があります。

javac -source 8 -target 8 -classpath $HADOOP_HOME/share/hadoop/common/hadoop-common-3.3.6.jar:$HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.3.6.jar:. *.java

このコマンドは Java クラスをコンパイルし、コンパイルされた .class ファイルを現在のディレクトリに配置します。-classpath オプションには Hadoop ライブラリのパスが含まれており、これは Hadoop クラスを使用するコードをコンパイルする際に必要です。-source-target は、Hadoop 内の Java のバージョンと一致させるために、Java ソースおよびターゲットバイトコードのバージョンを指定するためのパラメータです。

次に、jar コマンドで class ファイルをパッケージ化します。

jar -cvf Artifact.jar *.class

最後に、MapReduce ジョブを実行できます。砂漠に関するすべてのデータは既に /input HDFS ディレクトリに保存されています。

hadoop jar Artifact.jar ArtifactDriver /input /output

コマンドを実行した後、MapReduce ジョブの進行状況を示すログが表示されるはずです。ジョブが完了すると、/output HDFS ディレクトリに出力ファイルが見つかります。そして、以下のコマンドを使用して結果を表示します。

hdfs dfs -ls /output
hdfs dfs -cat /output/part-r-00000

まとめ

おめでとうございます!あなたは、Hadoop MapReduce ジョブ用のマッパーとリデューサのコーディングプロセスを成功裏に探索しました。古代遺物を求める砂漠商人のシナリオに導かれ、膨大な砂漠データを分析するために Hadoop MapReduce の力を引き出しました。ArtifactMapper クラスを実装することで関連データを抽出し、ArtifactReducer クラスでマッパーの出力を集約しました。ArtifactDriver クラスでプロセスを調整することで、さらに理解が深まりました。全体を通して、ベストプラクティス、完全なコード例、および検証チェックに重点が置かれていました。この実践的な経験は、Hadoop MapReduce の理解を深めるとともに、効果的な学習体験のデザインを浮き彫りにしました。