MapReduce(一)之基本概念及操作

MapReduce的概念及特点

MapReduce是Hadoop体系下的一种计算模型(计算框架|编程框架),主要是用来对存储在HDFS上的数据进行统计及分析的。

MapReduce特点

  • 易于编程:只需要使用Hadoop接口进行编程,即可实现多台计算机分布式计算和分布式存储。
  • 高扩展性:存储空间不足或者计算能力不足,则可以添加计算机完成。
  • 容错性高:如果某个节点宕机,Hadoop可以自动切换讲计算任务转移到其他节点上完成,不会影响计算结果。
  • 应用场景:PB级别以上海量数据的离线处理,无法实时处理和流失动态处理。(每日)

MapReduce的核心思想

分而治之:大任务拆分小任务。

在这里插入图片描述

MapReduce计算

  • Job(一个大型任务)[Application]

    一组MapReduce又统称为一个Job作业

  • Map(拆分后的小任务)

    局部计算

  • Reduce(整合任务)

    对局部计算结果进行汇总计算

yarn框架

作用(施工队):资源调度、任务监控。主要用来整合Hadoop集群中的资源(CPU、内存)进行统一调度,同时监控任务的执行情况。

​ 总结: 联合多个服务器节点的硬件,共同完成一个计算。突破单机服务器的计算能力。

组成部分:

  • ResourceManager(老板)

    集群计算资源的管理器,也是yarn架构中的主节点。
    功能:

      	1. 监控集群资源
      	2. 为计算分配资源
    
  • NodeManager(员工)

    yarn集群计算资源的提供者,也是yarn架构中的从节点。
    功能:

    1. 真正执行计算任务的节点。
    2. 监控本节点的资源情况(CPU、内存、网络、硬盘),并通过心跳向ResourceManager汇报。

在这里插入图片描述

Yarn伪分布式搭建

# 准备单机的HDFS架构
验证:jps
[root@hadoop10 ~]# jps
2224 Jps
2113 SecondaryNameNode
1910 DataNode
1806 NameNode
关闭掉hdfs
	stop-dfs.sh
# 初始化配置文件
1. mapred-site.xml
	<!--配置yarn框架作为mapreduce的资源调度器-->
	<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
2. yarn-site.xml
	<property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
	<!--配置resourcemanager的主机ip-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>Hadoop</value>
    </property>
# 启动yarn集群
1. 启动HDFS集群
	start-dfs.sh
2. 启动yarn集群
	start-yarn.sh
# 验证
1. jps
[root@hadoop11 ~]# jps
    6160 DataNode
    6513 ResourceManager
    6614 NodeManager
    6056 NameNode
    6349 SecondaryNameNode
    6831 Jps
2. 访问yarn的资源调度器web网页。
	http://ip:8088

MapReduce数据流转机制

在这里插入图片描述

1. InputFormat(MapReduce自动处理)
	将block文件转化成split切片,其中每条数据由key-value组成。
	key是数据偏移量,value是每条数据。
2. Map(程序员编码)
	将split逐条输入给map,由map负责,对每条数据进行处理,转化为keyOut-valueOut。
3. Shuffle(MapReduce的默认处理器)
	对map输出的每条数据的key-value进行排序,分组。
4. Reduce(程序员编码)
	对Shuffle分组后的数据的key-value进行处理,转化为新的key-value。
5. OutputFormat
	将reduce产生的数据,存储HDFS文件系统中。

MapReduce编码

# 编写map程序
public class NameCountMap extends Mapper<LongWritable, Text,Text, IntWritable> {
    
    
    /**
       * @param keyIn      输入map数据的key
       * @param valueInt   输入map数据的value
       * @param contextOut map处理完毕后输出的每条数据 包含key-value
       * @throws IOException 
       * @throws InterruptedException 
       * @do 接收输入的key-value转化为输出的key-value,交给shuffle分组排序 
       */
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
    
    
        //局部计算
        String[] names = value.toString().split(" ");
        for (String name : names) {
    
    
            context.write(new Text(name),new IntWritable(1));
        }
    }
}
# 编写reduce程序
public class NameCountReduce extends Reducer<Text, IntWritable,Text,IntWritable> {
    
    
    /**
       *
       * @param keyIn 输入reduce的key
       * @param valuesIn 输入reduce的value,是一個集合。
       * @param contextOut 转化后输出的key-value,封装在contextOut中
       * @throws IOException
       * @throws InterruptedException
       * @do 接收shuffle排序分组后的数据,并处理
       */
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
    
    
        int sum = 0;
        for (IntWritable value : values) {
    
    
            int i = value.get();
            sum+=i;
        }
        context.write(key,new IntWritable(sum));
    }
}
# 编写job程序
		//0. 初始化HDFS配置文件
		Configuration conf = new Configuration();
        conf.set("fs.defaultFS","hdfs://192.168.242.10:9000");
        //1. 创建一个Job
        Job job = Job.getInstance(conf);
        job.setJarByClass(MR1.class);
        //2. 设置map  key value mapclass InputFormat
        job.setMapperClass(NameCountMap.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        TextInputFormat.addInputPath(job,new Path("/hdfs/mr/wordcount.log"));
        //3. 设置reduce  key value reduce class TextOutputFormat
        job.setReducerClass(NameCountReduce.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        TextOutputFormat.setOutputPath(job,new Path("/hdfs/mrout"));//该目录是mapreduce生成的,不能自己创建,并且不能存在。
        //4. 启动Job
        boolean b = job.waitForCompletion(true);
        System.out.println(b);
# 本地直接运行
	使用本地的方式提交任务,需要HDFS开启写入文件的权限。
	hdfs dfs -chmod -R 777 /hdfs

MapReduce任务提交

打包上传任务

# 打包
# 1. 设置maven的打包的环境
<properties>
    <!--解决编码的GBK的问题-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
    <!--指定打包的jar的名字-->
    <finalName>word_count</finalName>
    <!--指定打包的信息-->
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <!--指定入口主函数所在的类名-->
                    <manifest>
                        <mainClass>com.aries.mapreduce_day01_01.job.WordCountJob</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>
# 2. 执行打包
	在当前项目所在的目录下执行如下命令
	> mvn package
# 3. 上传jar包到Hadoop的ResourceManager所在的机器
# 4. 执行程序
	> yarn jar mr1.jar

maven自动化部署插件wagon

# 1. 配置maven远程提交插件
1. 添加maven的ssh扩展
2. 添加maven的远程拷贝插件wagon(货车)
<!--加入maven的扩展ssh-->
<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-ssh</artifactId>
        <version>2.8</version>
    </extension>
</extensions>
<!--maven的远程拷贝插件-->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>1.0</version>
    <configuration>
        <!--上传的本地jar的位置-->
        <fromFile>target/${project.build.finalName}.jar</fromFile>
        <!--远程拷贝的地址-->
        <url>scp://用户名:密码@ip:/opt/app</url>
    </configuration>
</plugin>
3. 添加远程执行命令,和参数。
# 清空
	mvn clean
# 打包本地jar
	mvn package
# 远程上传jar
	mvn wagon:upload-single
4. 远程执行命令
	# 如下内容在wagon的插件中添加
<!--maven的远程拷贝插件-->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>wagon-maven-plugin</artifactId>
    <version>1.0</version>
    <configuration>
        <!--上传的本地jar的位置-->
        <fromFile>target/${project.build.finalName}.jar</fromFile>
        <!--远程拷贝的地址-->
        <url>scp://root:[email protected]:/opt/app</url>
        <!--上传后执行的linux命令-->
        <commands>
            <!--执行的命令-->
            <command>nohup /opt/installs/hadoop2.9.2/bin/yarn jar /opt/app/${project.build.finalName}.jar > /opt/logs/mr.out 2>&amp;1 &amp;</command>
        </commands>
        <!--是否显示命令执行结果-->
        <displayCommandOutputs>true</displayCommandOutputs>
    </configuration>
</plugin>
nohup命令简介
nohup no hang up 命令执行后,要持续一段时间,不要挂断。
&(结尾) 最后的&表示nohup命令的结尾。
2>&1 错误和输出都重定向写入到前面的文件中。
命令参数 含义

在这里插入图片描述

# maven和wagon 命令汇总
 `注意,mvn命令需要在项目的pom.xml所在的目录执行`
1. 清空
	mvn clean
2. 打包
	mvn package
3. 上传
	mvn wagon:upload-single 
4. 执行
	mvn wagon:sshexec

配置MapReduce的历史日志服务器

Hadoop自带了一个历史服务器,可以通过历史服务器查看已经运行完的MapReduce作业记录。

比如用了多少个Map、用了多少个Reduce、作业提交时间、作业启动时间、作业完成时间等信息。

默认未启动

# 1. 配置mapred-site.xml,指定历史日志服务器的地址
<!--job历史日志服务器的服务地址-->
<property>
   <name>mapreduce.jobhistory.address</name>
   <value>hadoop10:10020</value>
</property>
<!--job的历史日志服务器的web地址-->
<property>
   <name>mapreduce.jobhistory.webapp.address</name>
   <value>hadoop10:19888</value>
</property>
# 2. 配置yarn-site.xml,指定开启日志聚合和日志保留时间
<!--开启日志聚合-->
<property>
  <name>yarn.log-aggregation-enable</name>
  <value>true</value>
</property>
<!--日志保存时间 单位秒 这里是7天-->
<property> 
  <name>yarn.log-aggregation.retain-seconds</name>
  <value>604800</value>
</property>
# 3. 启动历史日志服务器
1. 重启yarn
	[root@hadoop10 ~]# stop-yarn.sh
	[root@hadoop10 ~]# start-yarn.sh
2. 启动
	[root@hadoop10 ~]# mr-jobhistory-daemon.sh start historyserver
	如果需要关闭执行如下命令
	[root@hadoop10 ~]# mr-jobhistory-daemon.sh stop historyserver
# 4. 查看日志
	1. 访问http://ip:8088(访问yarn集群,看到执行过的job信息)
	2. 点击"Applications"找到刚才执行的job的"history"
	3. 点击logs

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_44191814/article/details/121080098