【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的 ...
随机推荐
- SVG 案例:动态去创建分支节点,当鼠标经过某个节点时,分支线会高亮
css: <style> #div1{ width:780px; height:400px; background:#fff; margin:20px auto; overflow:hid ...
- HttpWebRequest在Post的时候,遇到特殊符号+号(加号)变成空格了
今天在调用一个外部接口的时候遇到一个问题,外部接口说要用FOMR的POST方法提交. OK,没问题,我加了个ASPX页面,里面加了个FORM表单和一些元素,提交,返回值成功.注意看下面这一句:但返回值 ...
- Delphi TMemo 可以显示、编辑多行文本
多行编辑框组件(TMemo)TMemo组件可以显示.编辑多行文本,是一个标准的Windows多行编辑组件.对一些比较多的文本内容可以利用TMemo组件来显示.编辑. 1.TMemo组件的典型用法 TM ...
- 大佬整理出来的干货:LDA模型实现—Python文本挖掘
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...
- Docker-Bridge Network 03 自定义网络
本节介绍自定义bridge network的自定义网络. 1.前言2.创建自定义网络2.1 创建网络2.2 指定网段创建网络3.创建容器3.1 指定网络创建容器3.2 指定IP创建容器4.通信4.1 ...
- C++枚举算法
枚举算法 什么是枚举? 枚举,顾名思义,就是用最笨的方法,去解决问题(暴力枚举),一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠. 枚举 ...
- linux常用命令--文件的权限
ls -lh 显示权限 ls /tmp | pr -T5 -W$COLUMNS 将终端划分成5栏显示 chmod ugo+rwx directory1 设置目录的所有人(u).群组(g)以及其他人(o ...
- 5. iphone 的:active样式
如果给按钮定义 :hover 样式,在 iPhone 上按钮点击一次是 hover 态,再点击一次 hover 态才会消失,这不是我们想要的,继而想通过定义 :active 样式来实现按钮按下时的效果 ...
- Spring5:Java Config
@Configuration @Bean @ComponentScan @ImportResource 使用Java的方式配置spring,完全不使用spring配置文件,交给java来做! 两个注解 ...
- Java中基础类基础方法(学生类)(手机类)
学生类: //这是我的学生类class Student { //定义变量 //姓名 String name; //null //年龄 int age; //0 //地址 String address; ...