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. Java核心技术--接口与内部类

    接口implement 继承接口,即履行"义务". 接口中所有的方法自动属于public,在接口声明中,不必提供关键字public 接口中决不能含有实例域,也不能在接口中实现方法 ...

  2. 数据结构与算法--树(tree)结构

    树 二叉树 遍历原则:前序遍历是根左右, 中序遍历是左根右,后序遍历是左右根. 二叉搜索树 特点:对于树中的每个节点X,它的左子树中所有节点的值都小于X,右子树中所有节点的值都大于X. 遍历:采取二叉 ...

  3. JavaScript基础1225

    JavaScript函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. tip:JavaScript对大小写敏感.关键词function必须是小写,并且必须以与函数名称相同的大小写 ...

  4. redis:安装及基础知识(一)

    Redis官网:https://redis.io/ Redis中文网:http://www.redis.cn/ Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. ...

  5. 小白初学Java的一点点收获

    作为刚刚学习Java没有几天的小白,我想把我在学习过程中,所学习到的知识和注意事项和大家一起分享分享.在这个过程中,希望大家可以有所收获,有什么不对的地方,希望大家指出并且私信我. 首先说说第一次记事 ...

  6. 用long类型让我出了次生产事故,写代码还是要小心点

    昨天发现线上试跑期的一个程序挂了,平时都跑的好好的,查了下日志是因为昨天运营跑了一家美妆top级淘品牌店,会员量近千万,一下子就把128G的内存给爆了,当时并行跑了二个任务,没辙先速写一段代码限流,后 ...

  7. testlink配置修改

    1.      Read/write permissions报错 问题: Checking if  /var/testlink/logs/ directory exists [S] </B< ...

  8. Python开发基础之Python常用的数据类型

    一.Python介绍 Python是一种动态解释型的编程语言.Python它简单易学.功能强大.支持面向对象.函数式编程,可以在Windows.Linux等多种操作系统上使用,同时Python可以在J ...

  9. 【Python可视化】使用Pyecharts进行奥运会可视化分析~

    项目全部代码 & 数据集都可以访问我的KLab --[Pyecharts]奥运会数据集可视化分析-获取,点击Fork即可- 受疫情影响,2020东京奥运会将延期至2021年举行: 虽然延期,但 ...

  10. [Qt] 去掉QMessageBox标题栏上的图标

    msgBox.setWindowFlags(Qt::Drawer);