Hadoopとは何ですか? そのアーキテクチャとコンポーネントについて簡単に説明してください。

Hadoopとは何ですか? そのアーキテクチャとコンポーネントについて簡単に説明してください。

Hadoop は、大規模なデータ セットを処理および保存するためのオープンソースの分散コンピューティング フレームワークです。安価なハードウェアで高い耐障害性を提供​​し、大量のデータを処理できるように設計されています。Hadoop のアーキテクチャは、Hadoop 分散ファイル システム (HDFS) と MapReduce という 2 つのコア コンポーネントで構成されています。

  1. Hadoop 分散ファイル システム (HDFS):
    HDFS は、大規模なデータ セットを保存するために使用される Hadoop の分散ファイル システムです。安価なハードウェアで高い耐障害性を提供​​するように設計されています。HDFS は、大きなファイルを複数のブロックに分割し、ストレージを複数のマシンに分散します。これにより、高いデータ信頼性と拡張性が可能になります。HDFS のアーキテクチャには次のコンポーネントが含まれています。
  • NameNode: NameNode は HDFS のマスター ノードであり、ファイル システムの名前空間とストレージ ブロックのメタデータの管理を担当します。ファイル システム全体のディレクトリ ツリーとファイル ブロックの位置情報を維持します。
  • DataNode: DataNode は HDFS の作業ノードであり、実際のデータ ブロックの保存を担当します。NameNode から指示を受け取り、ローカルに保存されたデータ ブロックを管理します。DataNode は、データ レプリケーションとフォールト トレランスも担当します。
  • セカンダリ ネームノード: セカンダリ ネームノードはネームノードの補助ノードであり、ファイル システムの編集ログを定期的にマージおよびチェックし、新しいイメージ ファイルを生成する役割を果たします。これは、NameNode への負荷圧力を軽減し、システムの信頼性を向上させるのに役立ちます。
  1. MapReduce:
    MapReduce は、Hadoop のコンピューティング モデルおよび実行フレームワークです。コンピューティング タスクを Map ステージと Reduce ステージの 2 つのステージに分割します。MapReduce のアーキテクチャには次のコンポーネントが含まれています。
  • JobTracker: JobTracker は MapReduce のマスター ノードであり、ジョブの実行のスケジュールと監視を担当します。クライアントからジョブ要求を受け取り、実行のために利用可能な TaskTracker にジョブを割り当てます。
  • TaskTracker: TaskTracker は MapReduce の作業ノードであり、特定のタスクの実行を担当します。JobTracker から指示を受け取り、Map タスクと Reduce タスクを実行します。TaskTracker は、タスクの進行状況とステータスを監視し、結果を JobTracker に報告する役割も担います。
  • Map タスク: Map タスクは MapReduce の最初のステージであり、入力データをキーと値のペアの形式に変換し、中間結果を生成する役割を果たします。各 Map タスクは、入力データのサブセットを独立して処理し、中間結果を生成します。
  • Reduce タスク: Reduce タスクは MapReduce の第 2 段階であり、中間結果の集計と計算、および最終結果の生成を担当します。各 Reduce タスクは、1 つ以上の Map タスクによって生成された中間結果を処理します。

以下は、Hadoop の MapReduce フレームワークを使用して、入力テキスト ファイル内の各単語の出現をカウントするコード例です。

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 {
    
    

  // Mapper class
  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);
      }
    }
  }

  // Reducer class
  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);
  }
}

上の例では、WordCount という Java クラスを定義しました。これには、Mapper クラス (TokenizerMapper) と Reducer クラス (IntSumReducer) が含まれています。Mapper クラスは、入力テキスト データを単語に分割し、各単語をキーとして使用し、値を 1 に設定します。Reducer クラスは、同じ単語のカウントを合計し、結果を出力する役割を果たします。

main() 関数では、Job オブジェクトを作成し、ジョブの名前、Mapper クラスと Reducer クラス、および入出力データ型を設定します。また、入力パスと出力パスを指定し、job.waitForCompletion() メソッドを呼び出してジョブを実行します。

適切な入力データとカスタムの Mapper クラスと Reducer クラスを使用すると、さまざまなタイプの大規模データを処理し、対応する分析と計算を実行できます。Hadoopの分散ファイルシステムHDFSとコンピューティングフレームワークMapReduceを利用することで、信頼性と拡張性の高いビッグデータ処理システムを構築できます。

おすすめ

転載: blog.csdn.net/qq_51447496/article/details/132747754