MapReduce入门


Mapreduce思想

  • 概述

    MapReduce的思想核心是分而治之,适用于大量复杂的任务处理场景(大规模数据处理场景)。

    最主要的特点就是把一个大的问题划分成很多小的子问题并且每个小的子问题的求取思路与我们大问题的求取思路一样

    最主要有两个阶段:一个map阶段,负责拆分;一个是reduce阶段,负责聚合

  • 思想模型



    一个文件切块(Split)对应一个mapTask

    mapreduce没有block的概念,默认一个切块(Split)对应block块的大小(128M)

    MapReduce处理的数据类型是<key,value>键值对


MapReduce运行流程

  • 可控的八个步骤

    1.读取文件,解析成<key,value>对。  这里是<k1,v1>

    2.接收<k1,v1>,自定义我们的map逻辑,然后转换成新的<k2,v2>进行输出,往下发送。  这里发送出去的是<k2,v2>

    3.分区。相同key的value发送到同一个reduce里面去,key合并,value形成一个集合

    4.排序。

    5.规约。

    6.分组。

    7.接收<k2,v2>,自定义reduce逻辑,转换成新的<k3,v3>进行输出

    8.将<k3,v3>进行输出

  • 运行流程图

  • 运行流程代码

    定义一个主类,用来描述job并提交job

package cn.itcast.wordcount;

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; /**
* 定义一个主类,用来描述job并提交job
* 除了javaweb的程序打成一个war包进行运行,其他程序都是打成一个jar包进行运行
* 运行一个jar包需要main方法,作为程序的入口类
*/
public class MainCount extends Configured implements Tool {
/**
* 程序入口类
*
* @param args
*/
public static void main(String[] args) throws Exception {
//创建Configuration对象
Configuration configuration = new Configuration();
//执行ToolRunner得到一个int类型的返回值,表示程序的退出状态码(如果退出状态码是0代表运行成功,其他数字代表运行失败)
int run = ToolRunner.run(configuration, new MainCount(), args);
//程序退出
System.exit(run); } /**
* 这个run方法很重要,这里面主要通过job对象来组装程序,就是组装步骤的八个类(每一个步骤都是一个类)
*
* @param args
* @return
* @throws Exception
*/
@Override
public int run(String[] args) throws Exception {
/*
第一步:读取文件,解析成<key,value>对
从父类里获取Configuration
getInstance需要两个参数。一个是Configuration配置文件,一个是jobName(可以随便起)
*/
Job job = Job.getInstance(super.getConf(), "xxx"); //指定输入类
job.setInputFormatClass(TextInputFormat.class);
//TextInputFormat.addInputPath(job,new Path("hdfs://node01:8020/wordcount"));
TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/3.大数据离线第三天/wordcount/input")); //第二步:设置mapper类
job.setMapperClass(WordCountMapper.class);
//设置k2和v2的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); /**
* 第三步到第六步省略
* 分区 相同key的value发到同一个reduce,key合并,valuex形成一个集合
* 排序
* 规约
* 分组
*/ //第七步:设置reduce类
job.setReducerClass(WordCountReducer.class);
//设置k3和v3的类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//第八步:设置输出类以及输出路径
job.setOutputFormatClass(TextOutputFormat.class);
//TextOutputFormat.setOutputPath(job,new Path("hdfs://node01:8020/wordcount_out"));
TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/3.大数据离线第三天/wordcount/output/")); //将任务提交到集群上去
boolean b = job.waitForCompletion(true);
return b ? 0 : 1;
}
}

定义一个mapper类

package cn.itcast.wordcount;

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;
import java.io.InputStream; /**
* 设置Mapper类
* 自定义Map逻辑,把<k1,v1>转换成新的<k2,v2>进行输出,往下发送
*/
public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
/**
* 重写map方法,实现自定义逻辑,接收<k1,v1>,转换成新的<k2,v2>
*
* @param key k1
* @param value v1
* @param context 上下文对象(承上启下,衔接上面的组件和下面的组件)
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//第一步:切开第一行数据
String line = value.toString();
//转换成<k2,v2>往下发送
String[] split = line.split(",");
//循环遍历数据
for (String word : split) {
//创建k2和v2对象
Text k2 = new Text(word);
IntWritable v2 = new IntWritable(1);
//通过write方法将数据往下发送
context.write(k2, v2);
}
}
}

定义一个reducer类

package cn.itcast.wordcount;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException; public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
/**
* 重写reduce方法
*
* @param key k2
* @param values 集合 v2
* @param context 上下文对象
* @throws IOException
* @throws InterruptedException
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
//循环遍历集合
int count = 0;
for (IntWritable value : values) {
//IntWritable没有"+"方法,需要转换成int类型
int num = value.get();
count += num;
}
//输出 <k3,v3>类型
context.write(key, new IntWritable(count));
}
}
  • 如果遇到此问题

    Caused by:

    org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=admin, access=WRITE, inode="/":root:supergroup:drwxr-xr-x

第一种解决方法:关闭HDFS权限

cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop

vim hdfs-site.com

修改hdfs-site.com配置文件,将true改为false即可

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

第二种解决方法:将代码打包成jar包,放到集群上执行

yarn jar hadoop_hdfs_operate-1.0-SNAPSHOT.jar cn.itcast.hdfs.demo1.JobMain

第三种解决方法:在本地系统运行

//修改输入和输出路径
TextInputFormat.setInputPaths(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/3.大数据离线第三天/wordcount/input")); TextOutputFormat.setOutputPath(job, new Path("file:////Volumes/赵壮备份/大数据离线课程资料/3.大数据离线第三天/wordcount/output/"));

【Hadoop离线基础总结】MapReduce入门的更多相关文章

  1. 【Hadoop离线基础总结】oozie的安装部署与使用

    目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...

  2. 【Hadoop离线基础总结】Hue的简单介绍和安装部署

    目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...

  3. 【Hadoop离线基础总结】impala简单介绍及安装部署

    目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...

  4. 【Hadoop离线基础总结】Hive调优手段

    Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...

  5. 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发

    目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...

  6. 【Hadoop离线基础总结】Sqoop常用命令及参数

    目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...

  7. 【Hadoop离线基础总结】工作流调度器azkaban

    目录 Azkaban概述 工作流调度系统的作用 工作流调度系统的实现 常见工作流调度工具对比 Azkaban简单介绍 安装部署 Azkaban的编译 azkaban单服务模式安装与使用 azkaban ...

  8. 【Hadoop离线基础总结】MapReduce增强(下)

    MapReduce增强(下) MapTask运行机制详解以及MapTask的并行度 MapTask运行流程 第一步:读取数据组件InputFormat(默认TextInputFormat)会通过get ...

  9. 【Hadoop离线基础总结】MapReduce增强(上)

    MapReduce增强 MapReduce的分区与reduceTask的数量 概述 MapReduce当中的分区:物以类聚,人以群分.相同key的数据,去往同一个reduce. ReduceTask的 ...

随机推荐

  1. js操作svg整体缩放

    首先我们先创建一个svg整体布局,代码如下: <!DOCTYPE html> <html> <head> <title>js操作svg实现整体缩放< ...

  2. 五分钟!用python绘制漂亮的系统架构图

    Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标: AWS.Azure.GCP.K8s.阿里云 和 Oracle 云 基 ...

  3. CSRF(跨站请求伪造)学习总结

    前言 参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.html 什么是CSRF? CSRF,中文名字,跨站请求伪造,听起来是不是和XS ...

  4. C# XML相关操作

    XML是一种意见单文本格式存储数据的方式,这意味着它可以被任何计算机读取.XML中完整的数据集就是XML文档. 在名称空间System.Xml下面大部分类型都是用来支持DOM处理模型的.其中很多类型配 ...

  5. form表单里的button调用js函数

    近来发现一个特别奇怪的问题:在form表单里,button的onclick事件无法调用js函数.代码如下(这段代码放在form标签里): dropUpdateAddress调用的js函数为: 这个时候 ...

  6. 用functools.lru_cache实现Python的Memoization

    现在你已经看到了如何自己实现一个memoization函数,我会告诉你,你可以使用Python的functools.lru_cache装饰器来获得相同的结果,以增加方便性. 我最喜欢Python的原因 ...

  7. Java中Double保留小数位

    1.能四舍五入 double d = 114.145; d = (double) Math.round(d * 100) / 100; System.out.println(d); 2. BigDec ...

  8. 使用openmp进行并行编程

    预处理指令pragma 在系统中加入预处理器指令一般是用来允许不是基本c语言规范部分的行为.不支持pragma的编译器会忽略pragma指令提示的那些语句,这样就允许使用pragma的程序在不支持它们 ...

  9. tcp的重传与超时

    TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制. 其基本原理:在发送一个数据之后,就开启一个定时器,若是在这个时间内没有收到 ...

  10. React Native 在 Airbnb 的起起落落

    写在前面 Airbnb 早在 2016 年就上了 React Native 大船,是很具代表性的先驱布道者: In 2016, we took a big bet on React Native. T ...