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. 初识phar反序列化&&复现bytectf_2019_easycms&&RSS思路

    概要 来自Secarma的安全研究员Sam Thomas发现了一种新的漏洞利用方式,可以在不使用php函数unserialize()的前提下,引起严重的php对象注入漏洞.这个新的攻击方式被他公开在了 ...

  2. TensorFlow命令行参数FLAGS使用

    import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf #tensorboard --logdir=&qu ...

  3. VideoView--简单获取进度条的方法

    使用MediaController类就可以简单的把视频中的进度条加进去 实例: 现在布局哪里放一个VideoView,然后: videoView = (VideoView) findViewById( ...

  4. scrollview 和 listview滑动冲突解决

    http://blog.csdn.net/wanghao200906/article/details/51084975 http://www.cnblogs.com/shitianzeng/artic ...

  5. 动静结合?Ruby 和 Java 的基础语法比较(入门篇)

    前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...

  6. 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020

    论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...

  7. CentOS7虚拟机安装vmtools

    直接开始: 在安装vmtools之前,需要先安装两个小部件,否则将安装失败. 下面是步骤: 1.切换为root模式,需要输入root密码,但是不显示. 命令为: su 2.安装gcc 命令为: yum ...

  8. 【Linux常见命令】dos2unix命令,unix2dos命令

    我们都知道.打回车键就是换行的意思. 在不同系统下打回车键效果是不同的: MAC OS下:dakdhih \r LINUX下:dakdhih \n DOS\WINDOWS下:dakdhih \r\n ...

  9. Vue Router路由守卫妙用:异步获取数据成功后再进行路由跳转并传递数据,失败则不进行跳转

    问题引入 试想这样一个业务场景: 在用户输入数据,点击提交按钮后,这时发起了ajax请求,如果请求成功, 则跳转到详情页面并展示详情数据,失败则不跳转到详情页面,只是在当前页面给出错误消息. 难点所在 ...

  10. vue-cli创建的webpack工程中引用ExtractTextPlugin导致css背景图设置无效的解决方法

    当我们用vue-cli创建项目后,如果在我们的template模板文件中的css样式设置中,有设置了background-image的属性,并且url值传入的是相对路径,那么当我们在打包生产代码时,w ...