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 "	".join([s, 1])

实现reduce接口(reduce.py)

import sys

cur_word = None
sum = 0

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

print "	".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

原文地址:https://www.cnblogs.com/wadeyu/p/9624454.html