它是什么?

一个用于处理大数据开源的分布式计算框架,它由java实现,原生提供java编程交互接口,其它语言通过hadoop streaming方式和mapreduce框架交互。

可以做什么?

利用框架提供的简单编程接口,对海量数据进行离线统计分析编程。程序员只需要实现map接口(数据分解),reduce接口(数据汇总)即可,实现简单。

适用场景

离线情况下对海量数据进行分析

怎么使用?

示例 - 对文章单词进行计数(使用Python实现)

准备

1 搭建好hadoop 1.0集群

2 网上找一篇英语文章,上传到hdfs集群中,假如上传后文件路径为: /data/the_english_article.txt

说明

1 单词之间使用空格分隔

实现map接口(map.py)

import sys

for line in sys.stdin:
ss = line.strip().split(" ")
for s in ss:
s = s.strip()
if s != "":
print "\t".join([s, 1])

实现reduce接口(reduce.py)

import sys

cur_word = None
sum = 0 for line in sys.stdin:
word, cnt = line.strip().split("\t")
if cur_word == None:
cur_word = word
if cur_word != word:
print "\t".join([cur_word, sum])
cur_word = word
sum = 0
sum += int(cnt) print "\t".join([cur_word, sum])

本地模拟mapreduce执行

集群上调试效率很低,正常情况下,先在本地调试,确定代码无问题后,再在集群上跑测试

cat ./the_english_article.txt | python map.py | sort -k1 | python reduce.py | head -n 20

mapreduce集群上执行

1 创建一个shell脚本(run.sh)

HADOOP_CMD=hadoop命令完整路径
HADOOP_STREAMING_JAR=streaming jar包完整路径 INPUT_FILE=/data/the_english_article
OUTPUT_DIR=/output/wc $HADOOP_CMD fs -rmr -skipTrash $OUTPUT_DIR $HADOOP_CMD jar $HADOOP_STREAMING_JAR \
-input $INPUT_FILE \
-output $OUTPUT_DIR \
-mapper "python map.py" \
-reducer "python reduce.py" \
-file ./map.py
-file ./reduce.py

2 执行mapreduce任务

bash run.sh

3 查看结果

如果执行成功,hdfs上/output/wc会有part-00000这个文件,结果就保存在这个文件中(一个reduce对应一个输出文件,如果没有指定reduce任务数量,默认是1个reduce汇总)

4 杀死job

hadoop job -kill job_id

如何实现?

思想

分而治之 - mapreduce框架精髓所在

数据处理:分解 -> 求解 -> 合并

数据不移动,计算移动

代码数据量小,移动代码比移动数据性能要高,只针对map阶段

技术架构

角色 描述
Job Tracker 集群计算资源管理和任务调度以及任务监控,客户端提交任务给Job Tracker,计算框架的大脑
Task Tracker 执行计算任务,任务状态上报以及资源使用情况上报,通过心跳方式,默认每隔3秒,资源slot管理

提交任务流程

mapreduce执行流程(偏宏观角度)

1 红色部分是需要编程的部分,其它是mapreduce框架自带的功能

2 一个分片对应一个map

3 如果一行分片时中间被截断了,整行属于前一部分的分片

4 一个reduce会输出一个结果文件

5 map/reduce默认缓存区是100M,阀值是80%,达到这个阀值开始往硬盘溢写

6 reduce数据从map所在节点拷贝过来,会产生网络io,map不是

7 map/reduce是进程模型,有自己独立的空间,可以更好的控制资源

8 所有map任务执行完毕,才会开始执行reduce任务

9 同一分区下所有小文件归并为一个文件完成后,才开始执行reduce程序

10 数据分片规则:max(min.split,min(max.split,block))

操作 含义
partition 对key进行分组,有几个reduce就会通过哈希取模的方式分成几个组,这个操作可以确保相同的key一定会分配到同一个reduce
sort 同一个组下对key进行排序,按字符串排序,确保数据有序
combine 对相同key进行数据合并,实际上是提前对部分数据执行reduce操作,可以减少reduce阶段数据传输量,但是有些场景不适合,比如求中位数,会得到错误的结果
spill 对缓冲区数据进行溢写,map会不断的产生数据,而内存缓冲区大小是有限的,当内存超过或者等于阀值的80%时,会锁住这部分内存,把这部分数据写入硬盘,生成一个spill.n的小文件,写入之前会分好组排好序
merge 对溢写生成的小文件进行合并,生成一个更大的文件,合并的文件也是分好组排好序的数据,合并文件采用归并排序

mapreduce执行流程(偏微观角度)

实践总结

1 TaskTracker节点map,reduce slot数量确定

机器CPU核数 - 1

2 单个map/reduce任务占用内存最好不要超过500M

3 单个map/reduce任务执行时间最好控制在1~3分钟,最好不要超过20分钟

4 压缩文件不能分片,目前为止只有text file, sequence file可以分片

5 ulimit查看open max files,这个值不能太小

6 reduce个数不能设置太少(执行慢,出错再试成本高),也不能设置太多(shuffle开销大,输出大量小文件)

hadoop streaming

技术架构

streaing在JVM和map/reduce进程之间,通过系统标准输入和系统标准输出交换数据

优点

1 支持任意语言编程

2 开发效率高

缺点

1 会造成数据的二次拷贝

2 默认只能处理文本数据

常用命令行选项

选项 含义 必填/可选 备注
-input 指定作业的输入文件的hdfs路径 必填 支持使用*通配符,支持指定多个文件或目录(多个使用,分隔),可以多次使用
-output 指定作业输出的hdfs目录 必填 目录必须不存在,并且执行作业任务的用户拥有创建该目录的权限,只能使用一次
-mapper 用户自己写的map程序 必填 指示怎么执行map程序
-reducer 用户自己写的reduce程序 可选 指示怎么执行reduce程序
-file 提交单个文件到hdfs中 可选 程序代码文件,配置文件等,用于计算节点下载到本地,然后运行
-jobconf 提交作业时的一些配置属性 可选 配置作业相关的参数,示例:mapred.job.name="xxxx"
-cacheFile 任务相关文件已上传至hdfs,希望从hdfs拉取文件到本地 可选 hdfs://host:port/path/to/file#linkname选项在计算节点缓存文件,Streaming程序通过./linkname访问文件
-cacheArchive 同-cacheFile类似,只不过由文件变成了压缩后的目录 可选 同上
-partitioner 指定用于分区的类 可选 示例:org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner

常用提交作业时配置属性

选项 含义
mapred.reduce.tasks 指定作业reduce任务数量,默认是1个
mapred.job.name 作业名
mapred.job.priority 作业优先级
mapred.job.map.capacity 最多同时运行map任务数
mapred.job.reduce.capacity 最多同时运行reduce任务数
mapred.task.timeout 任务没有响应(输入输出)的最大时间
mapred.compress.map.output map的输出是否压缩
mapred.map.output.compression.codec map的输出压缩格式
mapred.output.compress reduce的输出是否压缩
mapred.output.compression.codec reduce的输出压缩方式
stream.map.output.field.separator map输出分隔符
stream.num.map.output.key.fields map输出中指定用于key的字段数
num.key.fields.for.partition map输出中指定用于分区的字段数
mapred.text.key.partitioner.options 指定用于分区的字段,示例:指定第2个,第3个字段用于分区,xx=-k2,3

参考资料

【0】八斗学院mapreduce内部学习资料

【1】MapReduce Tutorial

https://hadoop.apache.org/docs/current1/mapred_tutorial.html

【2】Hadoop Streaming

http://hadoop.apache.org/docs/current/hadoop-streaming/HadoopStreaming.html

mapreduce v1.0学习笔记的更多相关文章

  1. HDFS v1.0学习笔记

    hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...

  2. DirectX 总结和DirectX 9.0 学习笔记

    转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...

  3. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  4. vue2.0学习笔记之路由(二)路由嵌套+动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. vue2.0学习笔记之路由(二)路由嵌套

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. hdcms v5.7.0学习笔记

    hdcms v5.7.0学习笔记 https://note.youdao.com/ynoteshare1/index.html?id=c404d63ac910eb15a440452f73d6a6db& ...

  7. dhtmlxgrid v3.0学习笔记

    dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...

  8. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  9. 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建

    作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...

随机推荐

  1. [Swift通天遁地]五、高级扩展-(3)日期和时间类型的扩展方法

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. Java高质量20问

    问题一:在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环? HashMap本身没有什么问题,有没有问题取决于你是如何使用它的.比如,你在一个线程里初始化了一个 ...

  3. MySQL 批量插入值

    MySQL 批量插入值 今天遇到个问题,需要从类似以下语句中的各个小括号[其实也有中括号等]抽取相关字段进行组合[相关规则,此处略去不提],并保存到数据库中,此时如果每次插入一条,会连续进行多次插入, ...

  4. SQLServer局部变量和全局变量介绍05-29学习笔记

    变量 数据在内存中存储可以变化的量叫变量.为了在内存中存储信息,用户必须指定存储信息的单元,并为了该存储单元命名, 以方便获取信息,这就是变量的功能.Transact-SQL可以使用两种变量,一种是局 ...

  5. 【学习笔记】线段树—扫描线补充 (IC_QQQ)

    [学习笔记]线段树-扫描线补充 (IC_QQQ) (感谢 \(IC\)_\(QQQ\) 大佬授以本内容的著作权.此人超然于世外,仅有 \(Luogu\) 账号 尚可膜拜) [学习笔记]线段树详解(全) ...

  6. [转]Linux下chkconfig命令详解

    转自:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796873.html chkconfig命令主要用来更新(启动或停止)和查询系统 ...

  7. Linq学习(一)-初涉Linq

    一.何谓LINQ LINQ:Language Integrated Query语言集成查询,其本质是对ADO.NET结果集通过反射连同泛型特性转换成对象集,实现OR模型的转换 二.优点与缺点 优点:封 ...

  8. hdu2639,第K优决策

    在dp问题中如果遇到问题,没有什么是加一维度不能解决的,如果不能,再加一维度. #include<iostream> #include<cstring> #include< ...

  9. JS——math

    random() 方法可返回介于 0 ~ 1 之间的一个随机数. Math.random() 0.0 ~ 1.0 之间的一个伪随机数,但是不包括0和1.

  10. dotnetnuke 7.x登录时不跳到站点设置中的指定页

    查源码发现登录按钮有参数,点击跳到登录页或者弹窗登录,真正登录后会根据传参的url反回.因为皮肤对像没有相应参数,所以只能去掉参数.我是用js去的,偷个懒吧.如下所示: <script type ...