总体
不移动数据移动计算
首先把inputdata切片,每一个input split对应一个map,map把数据分成不同的部分先写到内存里,再排序后分批写入磁盘(dump)生成一个spill文件,再进行归并排序变成大的spill,按照key传给不同的reduce,reduce再合并不同map的数据成为大的分区,进行处理
排序目的把相同的key排到一起
用户需要实现什么?
基于函数式编程的方式,用户只需实现两个函数接口
Map(in_key,in_value)
->(out_key,intermediate_value)list
Reduce(out_key,intermediate_value list)
->out_value list
两个重要进程
jobtracker和tasktracker相当于主从节点,jobtracker给tasktracker分配任务,tasktracker周期性的向jobtracker发送自己的状态,自己的客户端直接和jobtracker交互发送任务,之后jobtracker给一个job id,生成一个hdfs目录,名称是job id,之后我们把代码拷进去,jobtracker接收到请求之后初始化之后分配工作
MapReduce是多进程而不是多线程,进程启动慢,所以MapReduce时效性不高不适合做低延迟作业
进程空间是独享的方便对每一个任务进行资源调配
和spark的不同,spark使用的是多线程模型而不是多进程编码模型
在大规模作业下MapReduce更稳定但是spark更快
sys 包中的sys.stdin表示标准输入,for xx in sys.stdin逐行读入
python中对字符串的常见处理
str.strip()表示去掉字符串前面后面的空格或者制表符之类的
str.split(' ')以传入的参数作为分隔符分割字符串返回字符串
str.join()传入一个字符串或者列表元组字典,返回以str为分隔符分割每一个元素的字符串
>>> a=','.join('abc')
>>> a
'a,b,c'
>>> a+' '
'a,b,c '
>>> a=a+' '
>>> a.strip()
'a,b,c'
>>> l=a.split(' ')
>>> l
['a,b,c', '']
>>> l=a.split(',')
>>> l
['a', 'b', 'c ']
for line in sys.stdin按行读入相当于每次循环执行line=sys.stdin.readline()
启动hadoop集群:[root@master hadoop-2.6.1]# sbin/start-all.sh
上传文件 [root@master hadoop-2.6.1]# hadoop fs -put README.txt /
Hadoop命令结尾有 /注意空格,用python开发一般是明文开发textFile
java开发一般是用sequenceFile
hadoop fs -text /xxx 查看文件
文件存储在HDFS中,每个文件切分成一定大小默认(64m)的block(默认三个备份),存储在多个节点(dataNode)上
InputFormat:从本地HDFS读取是一个java接口
进行数据分割(Data Split)和记录读取器(Record Reader)
split和块对应,但是保留记录的完整性(如按\n分割的行),每读一条记录调用一次map
shuffle shuffle是让MapReduce变快的重要地方
partion是shuffle的一部分,决定split由哪个reducer处理
partion在MemoryBuffer里做的每个map的结果和partion处理的key,value都存在缓存里,
溢写(spill):缓冲区大小默认100m如果到阈值(80%)就锁住dump出来,每次溢写都生成一个数据文件,溢写的文件写入到磁盘前会对数据进行key排序sort,以及合并combiner
缓冲区存 partion key value三元数据
combiner把相同key的数据的value合并
combiner相当于把部分的reducer的工作在map里做了,在一些数据倾斜的地方需要做combiner
但是combiner不能随便用,wordcount里可以,但是求中间值这种就不行。
在reducer里也有内存缓冲区也有spill和sort
系统设置里的ulimit可能会制约MapReduce,输入ulimit -a命令查看
配置map和reduce的个数
在mapred.site.xml配置文件里配置
mapred.tasktracker.map.tasks.maximum(默认2)
mapreduce.tasktracker.tasks.reduce.maximum(默认2)
cpu核-1
内存限制
多机集群分离
配置加载
简单的用-file分发
复杂的用hdfs,从map打开读取建立内存结构
Q: 所有的数据都要split吗?
A:不是压缩文件就不能做split,只能一个压缩文件一个map,通常是故意的为了控制map的个数