1.MapReduceのインストール
(1)分散コンピューティングの概要
master:8088にアクセスして、糸が正常に開始されたかどうかを確認します。
(2)mapreduceが正常にインストールされていることを確認します
hadoopインストールパッケージに含まれているmapreduceの通常のマッチング例を実行します。
コンソールに次の出力が表示され、mapReduceタスクが実行中であることが示され、Yarnモニタリングインターフェイスでタスクの実行レコードが表示されます。
2、Hadoopシリアル化メカニズム
シリアル化を実現するためにhadoopの書き込み可能なインターフェースを使用する
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.5</version>
<dependency>
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class BlockWritable implements Writable {
private long blockId;
private long numBytes;
private long generationStamp;
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(blockId);
out.writeLong(numBytes);
out.writeLong(generationStamp);
}
@Override
public void readFields(DataInput in) throws IOException {
this.blockId = in.readLong();
this.numBytes = in.readLong();
this.generationStamp = in.readLong();
}
public static void main(String[] args) throws IOException {
//序列化
BlockWritable blockWritable = new BlockWritable(34234L, 234324345L, System.currentTimeMillis());
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream("D:/block.txt"));
blockWritable.write(dataOutputStream);
//反序列化
Writable writable = WritableFactories.newInstance(BlockWritable.class);
DataInputStream dataInputStream = new DataInputStream(new FileInputStream("D:/block.txt"));
writable.readFields(dataInputStream);
System.out.println((BlockWritable) writable);
}
}
Hadoopによってカプセル化された一連のシリアル化メカニズムにより、シリアル化後のファイルサイズはJavaシリアル化のファイルサイズよりもはるかに小さくなります。大量のデータの場合、パフォーマンスが大幅に向上します。
3つ目は、mapReduceを使用して、分散テキスト行数の計算を実現することです。
(1)分散テキスト行数の計算
(2)プロジェクトにmapReduce依存関係を追加します
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-mapreduce-client-core</artifactId>
<version>2.7.5</version>
<dependency>
(3)mapReduceコードを書く
package com.dzx.hadoopdemo.mapred;
import org.apache.hadoop.conf.Configurable;
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.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobContext;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月24日 14:28:59
*/
public class DistributeCount {
public static class ToOneMapper extends Mapper<Object, Text, Text, IntWritable> {
private final static IntWritable ONE = new IntWritable(1);
private Text text = new Text();
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
this.text.set("count");
context.write(this.text, ONE);
}
}
public static class IntSumReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable(0);
@Override
protected 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 configuration = new Configuration();
//创建JOB
Job job = Job.getInstance(configuration, "distribute-count");
//设置启动类
job.setJarByClass(DistributeCount.class);
//设置mapper类
job.setMapperClass(ToOneMapper.class);
// job.setCombinerClass(IntSumReducer.class);
//设置reduce类
job.setReducerClass(IntSumReducer.class);
//设置输出结果key类型
job.setOutputKeyClass(Text.class);
//设置输出结果value类型
job.setOutputValueClass(IntWritable.class);
JobConf jobConf = new JobConf(configuration);
//设置文件输入路径
FileInputFormat.addInputPath(jobConf, new Path(args[0]));
//设置结果输出文件路径
FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));
//等待任务执行完成之后结束进程,设置为true会打印一些日志
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
(4)ジョブを実行する
記述されたmapReduceコードをmapreduce-course-1.0-SNAPSHOT.jarにパッケージ化します
より大きなテキストファイルbig.txtを準備し、hdfsにアップロードします
hadoop fs -mkdir -p / user / hadoop-twq / mr / count / input
hadoop fs -put bih.txt / user / hadoop-twq / mr / count / input /
ヤーンジャーmapreduce-course-1.0-SNAPSHOT.jarcom.dzx.hadoopdemo.mapred.DistributeCount /user/hadoop-twq/mr/count/input/big.txt / user / hadoop-twq / mr / count / output
図に示すように、タスクの実行後、出力時にファイルが生成されます。ファイルの内容を確認し、カウント21000104を表示して、big.txtテキストファイルに2,100万行を超えるデータがあることを示します。
ジョブを再度実行すると、出力ファイルが既に存在するというエラーが報告されるため、最初に元の出力ファイルを削除する必要があります。
第四に、ブロックとマップの入力分割の関係
ブロック->入力分割
ブロックサイズ未満のファイル-"入力分割
各ブロックのサイズが256Mであるとすると、326Mのbig.txtファイルはストレージ用に2つのブロックに分割されるため、ジョブの実行中に、ヤーンモニタリングインターフェイスに2つの対応するマップタスクがあることがわかります。これは、次のログ出力からも確認できます。
5つ目は、MapReduceが糸で実行される原理です。
//设置reduce任务数
job.setNumReduceTasks(2)
RMは糸のResourceManagerを指します
6、MapReduceメモリCPUリソース構成
mapred-site.xmlに次の構成を追加します
次に、上記の構成をslave1とslave2に同期します
scp mapred-site.xml hadoopq-twq @ slave1:〜/ bigdata / hadoop-2.7.5 / etc / hadoop /
scp mapred-site.xml hadoopq-twq @ slave2:〜/ bigdata / hadoop-2.7.5 / etc / hadoop /
セブン、MapReduceのコンバイナー
(1)コンバイナーの説明
コンバイナを使用して、事前に各マシンのデータを減らし、最終データのネットワーク送信を減らし、パフォーマンスを向上させます。
コードでの実装:job.setCombinerClass(IntSumReduce.class);
8.mapReduceを使用してwordCountを実装します
(1)コードの記述
package com.dzx.hadoopdemo.mapred;
import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileUtil;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.FileInputFormat;
import org.apache.hadoop.mapred.FileOutputFormat;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.File;
import java.io.IOException;
import java.util.StringTokenizer;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月25日 11:06:53
*/
public class WordCount {
public static class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
private Text text = new Text();
private final static IntWritable ONE = new IntWritable(1);
@Override
protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
// String s = value.toString();
// String[] strArray = s.split(" ");
// for (String item : strArray) {
// text.set(item);
// context.write(text, ONE);
// }
StringTokenizer stringTokenizer = new StringTokenizer(value.toString());
while (stringTokenizer.hasMoreTokens()) {
text.set(stringTokenizer.nextToken());
context.write(text, ONE);
}
}
}
public static class WordCountReduce extends Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable res = new IntWritable(0);
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
res.set(sum);
context.write(key, res);
}
}
public static void main(String[] args) throws Exception {
File file = new File(args[1]);
if (file.exists()) {
FileUtils.deleteQuietly(file);
}
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration, "word-count");
job.setJarByClass(WordCount.class);
job.setMapperClass(WordCountMapper.class);
job.setCombinerClass(WordCountReduce.class);
job.setReducerClass(WordCountReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
job.getConfiguration().set("yarn.app.mapreduce.am.resource.mb", "512");
job.getConfiguration().set("yarn.app.mapreduce.am.command-opts", "-Xmx250m");
job.getConfiguration().set("yarn.app.mapreduce.am.resource.cpu-vcores", "1");
job.getConfiguration().set("mapreduce.map.memory.mb", "400");
job.getConfiguration().set("mapreduce.map.java.opts", "-Xmx200m");
job.getConfiguration().set("mapreduce.map.cpu.vcores", "1");
job.getConfiguration().set("mapreduce.reduce.memory.mb", "400");
job.getConfiguration().set("mapreduce.reduce.java.opts", "-Xmx200m");
job.getConfiguration().set("mapreduce.reduce.cpu.vcores", "1");
JobConf jobConf = new JobConf(configuration);
FileInputFormat.addInputPath(jobConf, new Path(args[0]));
FileOutputFormat.setOutputPath(jobConf, new Path(args[1]));
System.out.println(job.waitForCompletion(true) ? 0 : 1);
}
}
記述したコードをmapreduce-wordcount.jarパッケージに入力してサーバーにアップロードし、次のコマンドを実行します。
hadoop jar mapreduce-wordcount.jar com.dzx.hadoopdemo.mapred.WordCount /user/hadoop-twq/mr/count/input/big_word.txt / user / hadoop-twq / mr / count / output
タスクの実行が完了するのを待った後、結果の出力ファイルを確認し、次の内容を確認して、単語数の統計が完了したことを示します。
仮想メモリ構成を改善する
ヤーンを再起動すると、仮想メモリが4倍に拡大されていることがわかります。
(2)ワードカウントプログラムの詳細な説明-シャッフル
ジョブがreduceTaskを2に設定した場合
図からわかるように、maptaskの結合フェーズでは、マップの結果はキーの自然なアルファベット順に従ってソートされます。
(3)カスタムパーティショナー
reduceTaskが2に設定されている場合、最終的なタスク出力ファイルは2つの結果セットファイルを生成します。このデータ分割を実現する方法には、分割ルールが含まれます。
デフォルトでは、Hadoopはキーのハッシュ値に従ってパーティション化されます。
実際、各ワードのハッシュ値はモジュロ2です。
カスタムパーティショナー
package com.dzx.hadoopdemo.mapred;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
/**
* @author duanzhaoxu
* @ClassName:
* @Description:
* @date 2020年12月25日 14:34:47
*/
public class CustomPartitiner extends Partitioner<Text, IntWritable> {
//自定义分区器
@Override
public int getPartition(Text text, IntWritable intWritable, int i) {
if (text.toString().contains("s")) {
return 0;
}
return 1;
}
}
再パッケージ化してサーバーにアップロードし、タスクを実行すると、sを含むキーの結果がpart0ファイルに出力され、sを含まないキーの結果がpart1ファイルに出力されることがわかります。
(4)MapReduceアプリケーション
1.明確な問題
mapReduceのキーを使用して自然に重複排除し、マップ入力の値をreduceのキーとして使用して自動的に重複排除します
2.distcp
hdfsnn1ノードデータをnn2ノードにコピーします
distcp hdfs:// nn1:8020 / source / first hdfs:// nn1:8020 / source / second hdfs:// nn2:8020 / target
9つのHadoop圧縮メカニズム
データは特定のアルゴリズムによって特別にエンコードされるため、データが占めるストレージスペースは比較的小さくなります。このプロセスは圧縮と呼ばれ、その逆も同様です。
時間とスペースを比較検討する必要のある圧縮ツールの種類に関係なく、ビッグデータの分野では、圧縮ファイルの分離可能性も考慮してください。
Hadoopでサポートされている圧縮ツールは、DEFAULT、bzip、Snappyです。
10. Avro行ストレージおよび寄木細工列ストレージ(一時的に更新されません)
11. avroファイルと寄木細工のファイルの読み取りと書き込み(重要)(一時的に更新されません)
12. sequenceFileファイルの読み取りと書き込み(一時的に更新されません)