【Hadoop离线基础总结】MapReduce入门
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入门的更多相关文章
- 【Hadoop离线基础总结】oozie的安装部署与使用
目录 简单介绍 概述 架构 安装部署 1.修改core-site.xml 2.上传oozie的安装包并解压 3.解压hadooplibs到与oozie平行的目录 4.创建libext目录,并拷贝依赖包 ...
- 【Hadoop离线基础总结】Hue的简单介绍和安装部署
目录 Hue的简单介绍 概述 核心功能 安装部署 下载Hue的压缩包并上传到linux解压 编译安装启动 启动Hue进程 hue与其他框架的集成 Hue与Hadoop集成 Hue与Hive集成 Hue ...
- 【Hadoop离线基础总结】impala简单介绍及安装部署
目录 impala的简单介绍 概述 优点 缺点 impala和Hive的关系 impala如何和CDH一起工作 impala的架构及查询计划 impala/hive/spark 对比 impala的安 ...
- 【Hadoop离线基础总结】Hive调优手段
Hive调优手段 最常用的调优手段 Fetch抓取 MapJoin 分区裁剪 列裁剪 控制map个数以及reduce个数 JVM重用 数据压缩 Fetch的抓取 出现原因 Hive中对某些情况的查询不 ...
- 【Hadoop离线基础总结】流量日志分析网站整体架构模块开发
目录 数据仓库设计 维度建模概述 维度建模的三种模式 本项目中数据仓库的设计 ETL开发 创建ODS层数据表 导入ODS层数据 生成ODS层明细宽表 统计分析开发 流量分析 受访分析 访客visit分 ...
- 【Hadoop离线基础总结】Sqoop常用命令及参数
目录 常用命令 常用公用参数 公用参数:数据库连接 公用参数:import 公用参数:export 公用参数:hive 常用命令&参数 从关系表导入--import 导出到关系表--expor ...
- 【Hadoop离线基础总结】工作流调度器azkaban
目录 Azkaban概述 工作流调度系统的作用 工作流调度系统的实现 常见工作流调度工具对比 Azkaban简单介绍 安装部署 Azkaban的编译 azkaban单服务模式安装与使用 azkaban ...
- 【Hadoop离线基础总结】MapReduce增强(下)
MapReduce增强(下) MapTask运行机制详解以及MapTask的并行度 MapTask运行流程 第一步:读取数据组件InputFormat(默认TextInputFormat)会通过get ...
- 【Hadoop离线基础总结】MapReduce增强(上)
MapReduce增强 MapReduce的分区与reduceTask的数量 概述 MapReduce当中的分区:物以类聚,人以群分.相同key的数据,去往同一个reduce. ReduceTask的 ...
随机推荐
- 从前端到后端实现弹幕的过程(jsp/Jquery.barrager.js)
Jquery.barrager.js插件,可以去网上下载!下载完后,就把下载文件中的js文件.css文件.图片文件.等等等文件全部拷贝到你们自己的项目中去,千万别拷贝漏了,如果你怕拷贝漏了什么,那就把 ...
- CSS也能计算:calc
举个例子ul li适配屏幕,如果加个border:1px,不用border-content得情况下,每个li多加了2px: <ul><li></li><li& ...
- Websocket直播间聊天室教程 - GoEasy快速实现聊天室
最近两年直播那个火啊,真的是无法形容!经常有朋友问起,我想实现一个直播间聊天或者我想开发一个聊天室, 要如何开始呢? 今天小编就手把手的教你用GoEasy做一个聊天室,当然也可以用于直播间内的互动.全 ...
- H - Hamiltonian Hypercube Gym - 101170H
规律题 首先我们要知道他的顺序是怎么来的,首先当n等于1时,是0,1 当n=2时,先按照与按顺序在他们前面分别加0,即00,01,在逆序加1,即11,10 构成的顺序为00,01,11,10:往后同理 ...
- Jmeter实现multipart/form-data类型请求
http请求有三种content-type:application/json.x-www-form-urlencoded.multipart/form-data,前两种比较常见,这里主要说multip ...
- 2016NOIP普及组T2回文日期
回文日期 分类:枚举,函数 [题目描述] 日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月份,最后2位代表日期 ...
- atom跨平台超好用的markdown实时预览
https://atom.io/ sublime有预览markdown的插件,但仅限于每次在浏览器中预览,想要找一个能够实时在软件中预览的,终于发现了atom. 很多功能以插件的形式安装,theme也 ...
- js的localStorage基础认识
新建a.html文件: <!DOCTYPE html> <html> <body> <div id="result"></di ...
- 负载均衡服务之HAProxy基础配置(一)
前文我们聊了下haproxy的基础安装,以及怎样去代理后端主机的配置:当然没有很详细的去说配置文件中各指令的意思:有关haproxy的安装和代理后端server可以参考本人博客https://www. ...
- ES6新增的Map和WeakMap 又是什么玩意?非常详细的解释
上一篇文章讲了set和weakSet,这节咱就讲Map和weakMap是什么?这两篇文章并没有什么联系,主要知识用法类似而已.嘿嘿,是不是感觉舒服多了. 什么是Map 介绍什么是Map,就不得不说起O ...