Hadoop の概要 (以下)

HDFS クラスター

HDFS クラスターは Hadoop クラスター上に構築され、HDFS は Hadoop のメインデーモン プロセスであるため、HDFS クラスターの構成プロセスは Hadoop クラスター構成プロセスの代表となります。

Docker を使用すると、より便利かつ効率的にクラスター環境を構築できます。

各コンピュータの設定

Hadoop はクラスターをどのように構成しますか?また、さまざまなコンピューターにはどのような構成が必要ですか?

HDFSネーミング ノードからデータ ノードへのリモート制御はSSHを介して実現されるため、主要な構成項目はネーミング ノードで構成し、非クリティカル ノード構成は各データ ノードで構成する必要があります。つまり、データ ノードとネーミング ノードの構成は異なる場合があり、異なるデータ ノードの構成も異なる場合があります。

クラスターの確立を容易にするために、同じ構成ファイルを使用して、Docker イメージの形式ですべてのクラスター ノードと同期します。

具体的な手順

一般的なアイデアは、まず Hadoop を含むミラー イメージを使用して、クラスター内のすべてのノードが共有できるように構成し、次にそれをプロトタイプとして使用して、クラスターを形成する複数のコンテナーを生成します

構成プロトタイプ

まず、事前に準備した hadoop_proto イメージを使用してコンテナーとして開始します。

docker run -d --name=hadoop_temp --privileged hadoop_proto /usr/sbin/init

Hadoop の構成ファイル ディレクトリを入力します。

cd $HADOOP_HOME/etc/hadoop
書類 効果
労働者 すべてのデータ ノードのホスト名または IP アドレスを記録します。
コアサイト.xml Hadoopコア構成
hdfs-site.xml HDFS 構成項目
マップレッドサイト.xml MapReduce 設定項目
糸サイト.xml YARN 設定項目

クラスターのプロトタイプが構成されたら、コンテナーを終了し、コンテナーを新しいイメージcluster_protoにアップロードします。

docker stop hadoop_temp
docker commit hadoop_temp cluster_proto

クラスターをデプロイする

まず、Hadoop クラスターのプライベート ネットワーク hnet を作成します。

docker network create --subnet=172.20.0.0/16 hnet

次にクラスターコンテナーを作成します。

docker run -d --name=nn --hostname=nn --network=hnet --ip=172.20.1.0 --add-host=dn1:172.20.1.1 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn1 --hostname=dn1 --network=hnet --ip=172.20.1.1 --add-host=nn:172.20.1.0 --add-host=dn2:172.20.1.2 --privileged cluster_proto /usr/sbin/init
docker run -d --name=dn2 --hostname=dn2 --network=hnet --ip=172.20.1.2 --add-host=nn:172.20.1.0 --add-host=dn1:172.20.1.1 --privileged cluster_proto /usr/sbin/init

名前付きノードを入力します。

docker exec -it nn su hadoop

HDFS のフォーマット:

hdfs namenode -format

何も問題がなければ、次のステップは HDFS を開始することです。

start-dfs.sh

起動に成功すると、jps コマンドで NameNode と SecondaryNameNode の存在を確認できるようになります。DataNode プロセスは dn1 と dn2 で実行されるため、指定されたノードには存在しません。

MapReduce の使用法

Word Count は、MapReduce 作業プログラムの中で最も古典的な「単語カウント」です。その主なタスクは、テキスト ファイル内の単語について帰納的な統計を作成し、出現した各単語の総出現数をカウントすることです。

Hadoop には、Word Count を含む多くの古典的な MapReduce サンプル プログラムが含まれています。

注: このケースは HDFS が実行されていないときでも実行できるため、最初にスタンドアロン モードでテストしてみましょう。

まず、以前に作成した hadoop_proto イメージの新しいコンテナーを開始します。

docker run -d --name=word_count hadoop_proto

コンテナに:

docker exec -it word_count bash

HOME ディレクトリに入ります。

cd ~

次に、テキスト ファイル input.txt を準備します。

I love China
I like China
I love hadoop
I like hadoop

上記内容をテキストエディタで保存します。

MapReduce を実行します。

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount input.txt output

意味を説明してください:

Hadoop jar は、サンプル パッケージへのパスが後に続く jar ファイルから MapReduce ジョブを実行します。

wordcount は、サンプル パッケージの Word Count プログラムを実行することを意味し、その後にこれら 2 つのパラメータが続きます。1 つ目は入力ファイル、2 つ目は出力結果のディレクトリ名です (出力結果は複数のファイルであるため)。

実行後、フォルダーが出力されるはずで、このフォルダー内に_SUCCESSとpart-r-00000の2つのファイルがあります。

クラスタモード

次に、MapReduce をクラスター モードで実行します。

前の章で構成したクラスター コンテナーを起動します。

docker start nn dn1 dn2

NameNode コンテナを入力します。

docker exec -it nn su hadoop

ホームに移動:

cd ~

input.txt を編集します。

I love China
I like China
I love hadoop
I like hadoop

HDFS を開始します。

start-dfs.sh

ディレクトリを作成します。

hadoop fs -mkdir /wordcount
hadoop fs -mkdir /wordcount/input

input.txtをアップロードする

hadoop fs -put input.txt /wordcount/input/

実行ワード数:

hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount /wordcount/input /wordcount/output

実行結果を表示します。

hadoop fs -cat /wordcount/output/part-r-00000

すべてが正常であれば、次の結果が表示されます。

I       4
hadoop  2
like    2
love    2
China   2

MapReduce プログラミング

MapReduce の使用方法を学んだ後は、すでに単語数などの統計タスクや検索タスクを処理できるようになりますが、客観的に見ると、MapReduce でできることはまだたくさんあります。

MapReduce は主に開発者がプロ​​グラミングを通じて機能を実装することに依存しており、開発者は Map と Reduce に関連するメソッドを実装することでデータを処理できます。

このプロセスを簡単に示すために、ワードカウントプログラムを手動で作成します。

注: MapReduce は Hadoop ライブラリに依存しますが、私が使用している Hadoop ランタイム環境は Docker コンテナであり、開発環境を展開するのが難しいため、実際の開発作業 (デバッグを含む) には Hadoop を実行しているコンピュータが必要です。

MyWordCount.java ファイルのコード

/**
 * 引用声明
 * 本程序引用自 http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html
 */
package com.runoob.hadoop;
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapred.*;
/**
 * 与 `Map` 相关的方法
 */
class Map extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {
    
    
   private final static IntWritable one = new IntWritable(1);
   private Text word = new Text();
   public void map(LongWritable key,
               Text value,
               OutputCollector<Text, IntWritable> output,
               Reporter reporter)
         throws IOException {
    
    
      String line = value.toString();
      StringTokenizer tokenizer = new StringTokenizer(line);
      while (tokenizer.hasMoreTokens()) {
    
    
         word.set(tokenizer.nextToken());
         output.collect(word, one);
      }
   }
}
/**
 * 与 `Reduce` 相关的方法
 */
class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
    
    
   public void reduce(Text key,
                  Iterator<IntWritable> values,
                  OutputCollector<Text, IntWritable> output,
                  Reporter reporter)
         throws IOException {
    
    
      int sum = 0;
      while (values.hasNext()) {
    
    
         sum += values.next().get();
      }
      output.collect(key, new IntWritable(sum));
   }
}
public class MyWordCount {
    
    
   public static void main(String[] args) throws Exception {
    
    
      JobConf conf = new JobConf(MyWordCount.class);
      conf.setJobName("my_word_count");
      conf.setOutputKeyClass(Text.class);
      conf.setOutputValueClass(IntWritable.class);
      conf.setMapperClass(Map.class);
      conf.setCombinerClass(Reduce.class);
      conf.setReducerClass(Reduce.class);
      conf.setInputFormat(TextInputFormat.class);
      conf.setOutputFormat(TextOutputFormat.class);
      // 第一个参数表示输入
      FileInputFormat.setInputPaths(conf, new Path(args[0]));
      // 第二个输入参数表示输出
      FileOutputFormat.setOutputPath(conf, new Path(args[1]));
      JobClient.runJob(conf);
   }
}

この Java ファイルの内容を NameNode コンテナ (推奨される場所) に保存します。

/home/hadoop/MyWordCount/com/runoob/hadoop/MyWordCount.java

注: 現状では、一部の Docker 環境にインストールされている JDK は中国語をサポートしていないため、念のため、上記のコード内の中国語のコメントを削除してください。

ディレクトリを入力してください:

cd /home/hadoop/MyWordCount

コンパイル:

javac -classpath ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-client-core-3.1.4.jar -classpath ${HADOOP_HOME}/share/hadoop/client/hadoop-client-api-3.1.4.jar com/runoob/hadoop/MyWordCount.java

パック:

jar -cf my-word-count.jar com

埋め込む:

hadoop jar my-word-count.jar com.runoob.hadoop.MyWordCount /wordcount/input /wordcount/output2

結果の表示:

hadoop fs -cat /wordcount/output2/part-00000

出力:

I       4
hadoop  2
like    2
love    2
China   2

おすすめ

転載: blog.csdn.net/weixin_44659309/article/details/132394618