チュートリアルの「ビッグデータへの攻撃」シリーズのMapReduce

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ファイルの読み取りと書き込み(一時的に更新されません)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/qq_31905135/article/details/111608474