mapreduce v1.0学习笔记
它是什么?
一个用于处理大数据开源的分布式计算框架,它由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学习笔记的更多相关文章
- HDFS v1.0学习笔记
hdfs是一个用于存储大文件的分布式文件系统,是apache下的一个开源项目,使用java实现.它的设计目标是可以运行在廉价的设备上,运行在大多数的系统平台上,高可用,高容错,易于扩展. 适合场景 存 ...
- DirectX 总结和DirectX 9.0 学习笔记
转自:http://www.cnblogs.com/graphics/archive/2009/11/25/1583682.html DirectX 总结 DDS DirectXDraw Surfac ...
- 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移
不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...
- vue2.0学习笔记之路由(二)路由嵌套+动画
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue2.0学习笔记之路由(二)路由嵌套
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- hdcms v5.7.0学习笔记
hdcms v5.7.0学习笔记 https://note.youdao.com/ynoteshare1/index.html?id=c404d63ac910eb15a440452f73d6a6db& ...
- dhtmlxgrid v3.0学习笔记
dhtmlxgrid v3.0学习笔记 分类: dhtmlx JavaScript2012-01-31 15:41 1744人阅读 评论(0) 收藏 举报 stylesheetdatecalendar ...
- OAuth 2.0学习笔记
文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...
- 一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx、supervisor、mysql环境搭建
作为.neter,看到.net core 2.0的正式发布,心里是有点小激动的,迫不及待的体验了一把,发现速度确实是快了很多,其中也遇到一些小问题,所以整理了一些学习笔记: 阅读目录 环境说明 安装C ...
随机推荐
- Django day29 视图,路由控制,响应器
一:视图 1.视图的几种方式: (1) 第一种 from rest_framework.mixins import ListModelMixin, CreateModelMixin class Pub ...
- NHibernate系列学习(三)-条件查询Criteria
1.本笔记主要介绍Criteria的使用 2.效果界面 3.代码详情 namespace KimismeDemo { public partial class Form3 : Form { priva ...
- CF831C Jury Marks
思路: 关键在于“插入”一个得分之后,其他所有得分也随之确定了. 实现: #include <iostream> #include <cstdio> #include < ...
- node.js安装步骤
首先这是node.js的官网:https://nodejs.org/en/ 截至2017年12月9日,node更新在8.9.3该版本,建议开发人员下载6.0以上版本,8以上不是很稳定! 如果有其他需 ...
- [Android]异常9-自定义PopupWindow出现闪屏
背景: 自定义PopupWindow使用时,Android4.0或者一些手机正常使用,Android6.0或者部分手机使用自定义PopupWindow触发事件时,出现闪屏 异常原因: 可能一>A ...
- node 搭建本地服务器
/** * 代理服务器 natapp -authtoken f1bdaa0535788971 * 热部署指令 supervisor index */ const Koa = require('koa' ...
- oracle sql*loader的使用
用法: SQLLDR keyword=value [,keyword=value,...] 有效的关键字: userid -- ORACLE 用户名/口令 control -- 控制文件 ...
- 【sqli-labs】 less57 GET -Challenge -Union -14 queries allowed -Variation4 (GET型 挑战 联合查询 只允许14次查询 变化4)
双引号闭合 http://192.168.136.128/sqli-labs-master/Less-57/?id=1"%23 和less56一样查数据
- 怎么选择最适合自己的Python培训机构?
Python培训已经成为入门Python的一个重要途径,它的优势在于学习知识的系统性.快速性和实用性.Python培训毕业的学员大多数拥有较强的实战动手能力,能够较快上手,更符合企业需求. 不过,大部 ...
- altera quartus 百度云分享 quartus prime 17.1 16.1 13.0
quartus prime 17.1 标准版 链接:https://pan.baidu.com/s/10QWejKdDobVxDSqnVPJ0xQ 提取码:hhvj 复制这段内容后打开百度网盘手机Ap ...