はじめに
広大な砂漠の荒廃地で、孤独な商人が危険な旅に出ます。その目的は、灼熱する砂の下に秘められた謎を解き明かすことです。商人の目標は、古代の遺物や人工物を発見し、忘れ去られた文明の秘密を解き明かすことです。しかし、砂漠に埋もれた膨大なデータ量は、脅威的なチャレンジをもたらし、効果的に情報を処理し分析するために、Hadoop MapReduce の力が必要です。
広大な砂漠の荒廃地で、孤独な商人が危険な旅に出ます。その目的は、灼熱する砂の下に秘められた謎を解き明かすことです。商人の目標は、古代の遺物や人工物を発見し、忘れ去られた文明の秘密を解き明かすことです。しかし、砂漠に埋もれた膨大なデータ量は、脅威的なチャレンジをもたらし、効果的に情報を処理し分析するために、Hadoop MapReduce の力が必要です。
このステップでは、砂漠の発掘から得られた生データを処理するためのマッパークラスを作成します。目的は、データから関連する情報を抽出し、リデューサによるさらなる分析のために準備することです。
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
メソッドをオーバーライドして、各入力キーと値のペアを処理します。
LongWritable
であり、入力値は、入力ファイルからのテキスト行を含む Text
オブジェクトです。map
メソッドは、split
メソッドと正規表現 "\\s+"
を使用して、入力行を個々の単語に分割します。これにより、1 つ以上の空白文字が一致します。map
メソッドは Text
オブジェクトを作成し、それをキーとして発行します。また、その単語のカウントを表す定数 LongWritable
値 1
を値として発行します。このステップでは、マッパーから発行されたデータを集約するためのリデューサクラスを作成します。リデューサは、各単語の出現回数をカウントし、最終的な出力を生成します。
/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
メソッドをオーバーライドして、各キーに関連付けられた値を集約します。
Text
オブジェクトであり、入力値は、マッパーから発行されたその単語のカウントを表す LongWritable
オブジェクトの Iterable
です。reduce
メソッドは、値を反復処理し、与えられた単語のすべてのカウントの合計を計算します。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 ジョブを作成し、ArtifactMapper
と ArtifactReducer
クラスを実行するように構成します。
main
メソッドは、新しい Configuration
オブジェクトと、カスタム名 "Artifact Word Count" の Job
オブジェクトを作成します。setMapperClass
と setReducerClass
メソッドは、ジョブで使用するマッパーとリデューサクラスを指定するために使用されます。setOutputKeyClass
と setOutputValueClass
メソッドは、ジョブの出力キーと値の型を指定するために使用されます。FileInputFormat.addInputPath
メソッドは、ジョブの入力パスを指定するために使用されます。これは、最初のコマンドライン引数として取られます。FileOutputFormat.setOutputPath
メソッドは、ジョブの出力パスを指定するために使用されます。これは、2番目のコマンドライン引数として取られます。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 の理解を深めるとともに、効果的な学習体験のデザインを浮き彫りにしました。