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 ...
随机推荐
- [Swift通天遁地]二、表格表单-(5)实现表格下拉和上拉刷新效果
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]三、手势与图表-(6)创建包含三条折线的线性图表
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- [Swift通天遁地]五、高级扩展-(14)扩展String快速计算字符串中的各种数学表达式
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- Python3安装Scrapy
Microsoft Visual C++ Build Tools 最近项目在写爬虫,项目经理给了个Python Scrapy的爬虫项目,要求使用Java实现相关功能.于是乎在本地先后安装了Pytho ...
- javascript中window,document,body的解释
解释javascript中window,document,body的区别: window对象表示浏览器中打开的窗口,即是一个浏览器窗口只有一个window对象. document对象是载入浏览器的ht ...
- Android:EditText属性大全
一.inputType属性inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.比如有时需要虚拟键盘只为字符或只为数字. <span style="fon ...
- [转]linux之pr命令
转自:http://www.bitscn.com/plus/view.php?aid=6638 本文介绍如何使用Linux的pr命令将大文件分割成多个页面进行打印,并在每个页面上加上标题. Linux ...
- Elasticsearch之CURL命令的GET
这是个查询命令. 前期博客 Elasticsearch之CURL命令的PUT和POST对比 1. 以上是根据员工id查询. 即在任意的查询字符串中添加pretty参数,es可以得到易于我们识别的jso ...
- Hadoop Hive概念学习系列之hive里的扩展接口(CLI、Beeline、JDBC)(十六)
<Spark最佳实战 陈欢>写的这本书,关于此知识点,非常好,在94页. hive里的扩展接口,主要包括CLI(控制命令行接口).Beeline和JDBC等方式访问Hive. CLI和B ...
- ASP.NET AJAX应用
ASP.NET AJAX能够快速地创建具有丰富的用户体验的页面,而且这些页面由可靠和熟悉的用户接口元素组成,包括一个能快速响应的用户体验和熟悉的用户元素. 使用ASP.NET AJAX,可以改善We ...