mapreduce计算框架 大数据学习第二天

总体

不移动数据移动计算

首先把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的个数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值