MapReduce環境搭建以及WordCount案例

程式碼路上的不歸者發表於2020-11-26

一、環境搭建

(伺服器主機名CentOSQ)
①配置資源管理器

//編輯yarn-site檔案
[root@CentOSQ ~]# vi /usr/hadoop-2.9.2/etc/hadoop/yarn-site.xml
//加如下列配置(注意下列配置我們的主機名是什麼下列的配置和我們的主機名是一致的)
<!--配置MapReduce計算框架的核心實現Shuffle-洗牌-->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!--配置資源管理器所在的目標主機-->
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>CentOSQ</value>
</property>
<!--關閉實體記憶體檢查-->
<property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
</property>
<!--關閉虛擬記憶體檢查-->
<property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
</property>

②配置MapReduce計算框架

//將mapred-site.xml.template檔案使用移動命令mv 改成mapred-site.xml檔案
[root@CentOSQ ~]# mv /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml.template  /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml

在這裡插入圖片描述

[root@CentOSQ ~]#  vi /usr/hadoop-2.9.2/etc/hadoop/mapred-site.xml
//在<configuration>中加入下面的配置

	<!--MapRedcue框架資源管理器的實現-->
	<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
	</property>

③啟動計算服務

[root@CentOSQ ~]# start-yarn.sh
//使用jps檢視我們的啟動的服務
[root@CentOSQ ~]# jps
//我們的yarn框架啟動後會有這麼兩個框架服務啟動NodeManager、ResourceManager
1802 NodeManager
1711 ResourceManager

④可以訪問ResourManager內嵌WebUI頁面:http://CentOSQ:8088
我們需要保證在使用主機名訪問的時候我們windows中的主機名對映是配置過的
在這裡插入圖片描述

二、MapReduce任務開發(WordCount案例)

背景

假設我們有如下的一張表,需要統計出每個版塊被點選次數。

日誌級別 類別 點選日期
INFO /product/xxxx1 2020-09-28 10:10:00
INFO /product/xxxx2 2020-09-28 12:10:00
INFO /cart/xxxx2 2020-09-28 12:10:00
INFO /order/xxxx 2020-09-28 12:10:00

如果我們可以將以上的日誌看做成是資料庫中的一張表,這個問題就可以使用以下SQL解決:

    select category,sum(1) from t_click group by category

如果使用上面提到的MapReduce計算模型,我們可以使用Map完成group的功能,使用Reduce完成sum的功能。有如下資料格式

INFO   /product/xxx/1?name=zhangsan    2020-09-28 10:10:00
INFO   /product/xxx/1?name=zhangsan    2020-09-28 10:10:00
INFO   /cart/xxx/1?name=lisi           2020-09-28 10:10:00
INFO   /order/xxx/1?name=zhangsan      2020-09-28 10:10:00
INFO   /product/xxx/1?name=zhaoliu     2020-09-28 10:10:00
INFO   /cart/xxx/1?name=win7           2020-09-28 10:10:00

實現
①寫Mapper邏輯

package com.baizhi.mr;


import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/**
 * 1、使用者必須首先清楚 資料格式、儲存位置  --讀取資料方式 --Mapper寫法?
 * TextInputFormat<LongWritable,Text>:讀取檔案系統中檔案本地系統、HDFS
 *                    位元組偏移量     文字行
 * 2、必須清楚的知道自己想幹嘛? 按__類別__統計  __點選次數__值
 *                               key           value
 */
public class URLMapper extends Mapper<LongWritable, Text,Text, IntWritable> {
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        //獲取一行的文字資料
        String line = value.toString();
        //以空格切分文字行資料
        String[] split = line.split("\\s+");
        //遍歷以空格切分的單詞進行輸出
        for (String s : split) {
            context.write(new Text(s),new IntWritable(1));
        }
    }
}

②Reducer邏輯

package com.baizhi.mr;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * 1、你要對哪種Mapper的輸出結果彙總  --  決定Reducer輸入的Key和Value型別
 *
 * 2、你要知道最終輸出結果以哪種格式寫出去,輸出Key/Value格式使用者只需要關注他的toString即可
 *
 *   TextOutputFormat<key,value>  將結果寫出到檔案系統:本地、HDFS
 */

public class URLReducer extends Reducer<Text, IntWritable, Text,IntWritable> {
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        int total=0;
        for (IntWritable value : values) {
            total+=value.get();
        }
        context.write(key,new IntWritable(total));
    }
}

③封裝Job物件

package com.baizhi.mr;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;

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.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

//com.baizhi.mr.URLCountApplication
public class URLCountApplication extends Configured implements Tool {
    public int run(String[] strings) throws Exception {
        //1.建立一個job物件
        Configuration conf =getConf();
        Job job = Job.getInstance(conf, "URLCountApplication");
        
        //打包任務釋出需要新增的程式碼
        job.setJarByClass(URLCountApplication.class);

        //2.設定資料格式
        job.setInputFormatClass(TextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        //3.設定從那個檔案裡讀取的資料路徑
        TextInputFormat.addInputPath(job,new Path("/logs/word"));
        //系統自己建立的的輸出路徑 如果系統檔案存在則自動放棄(這樣做是為了防止資料的覆蓋)
        TextOutputFormat.setOutputPath(job,new Path("/logs/wordcount"));
        //4.設定處理邏輯
        job.setMapperClass(URLMapper.class);
        job.setReducerClass(URLReducer.class);
        //5.設定輸出的key value
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);


        //6.提交
        return job.waitForCompletion(true)?1:0;
    }

    public static void main(String[] args) throws Exception {
        ToolRunner.run(new URLCountApplication(),args);
    }
}

三、任務釋出

遠端部署

		需要在job當中新增如下程式碼
		 job.setJarByClass(URLCountApplication.class);

在這裡插入圖片描述
打包程式
在這裡插入圖片描述
設定程式的類載入路徑,因為任務是打好jar包以後使用hadoop jar命令提交的.

[root@CentOSQ ~]# hadoop jar Hadoop_MR-1.0-SNAPSHOT.jar com.baizhi.mr.URLCountApplication
//或者如下
[root@CentOSQ ~]# yarn jar Hadoop_MR-1.0-SNAPSHOT.jar com.baizhi.mr.URLCountApplication


相關文章