它是什么?

一个用于处理大数据开源的分布式计算框架,它由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. html5做的一个激光条

    <!DOCTYPE HTML><html lang="zh-cn"><head> <title>CSS3激光加载条</titl ...

  2. 湖南集训day4

    难度:☆☆☆☆☆☆☆ 题解: 有个定理,另sum(x)表示小于等于x的数中与x互质的数的和 sum(x)=φ(x)*x/2    最后可知f(x)=x  (f(1)=2)  当然打表能知道. 然后就转 ...

  3. 题解报告:hdu 2647 Reward(拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647 Problem Description Dandelion's uncle is a boss ...

  4. IOS开发 键盘添加工具条 退出 上一项 下一项 简单实现

    首先设置每个 UITextField 的 inputAccessoryView 为UIToolBar : 将所有的 textField 放入一个数组: 设置 UITextField UITextFie ...

  5. [转]mysql触发器的作用及语法

    转自:http://blog.csdn.net/cloudday/article/details/6905590 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本 ...

  6. 生成错误:对路径".dll"的访问被拒绝

    第一步:检查dll所在的目录的访问权限,右键文件夹>属性>安全>设置添加EveryOne用户并将完全控制的权限赋给它. 如果问题还没有解决,请不要一遍遍的重启,看第二步: 第二步:右 ...

  7. c# winform控件dock属性停造位置、摆放顺序详解

    dock : [英文释义- 码头.依靠][winform释义- 获取或设置当前控件依靠到父容器的哪一个边缘.] 用途:多数控件都有这个属性,主要用来设置控件的布局. 但对于不太了解这个属性的朋友来说有 ...

  8. 消息队列 (1) mac安装RabbitMQ

    什么是RabbitMQ? RabbitMQ是由Erlang语言编写的实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为面向消息的中间件).支持WIndows.Linux.MAC OS 操作系 ...

  9. 【GAN学习笔记】对抗式生成网络入门

    今天观看学习了一下台大李宏毅所讲授的 <Introduction of Generative Adversarial Network (GAN)>,对GAN有了一个初步的了解. GAN的基 ...

  10. Java 6中类路径ClassPath对通配符的支持

    在java 6之前,如果我们的应用依赖多个jar包,通常是将所有jar包文件枚举设置到环境变量CLASSPATH或者命令行参数-classpath(-cp)中.通常我们需要写一段shell脚本实现该功 ...