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