Mapreduce的学习:
首先是在eclipse上配置各种文件
MR原语:
输入(格式化k,v)数据集àmap映射成一个中间数据集(k,v)àreduce
“相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算
排序
比较
遍历
计算
在hdfs中默认的将文件切成很多的小片。切成片解耦,有了偏移量,就可以参与计算了。
因此,map的多少是由切片的大小决定的,切片的大小是由数据决定的。
源语:相同的key为一组。
Reduce的数量是由数组的组数决定的。
是由人来决定的,人决定了维度的大小。
一个数组,必须从第一行遍历到最后一组,如果分组的话,时间上就可以减半。
还要排序有序,1万组数据,如果排序了,只需要一个小时,如果不排序,则需要一万个小时。
Reducetask,分区,一个分区里可以包含多个数据。
block > split
1:1
N:1
1:N
split > map
1:1
map > reduce
N:1
N:N
1:1
1:N
group(key)>partition
1:1
N:1
N:N
1:N? >违背了原语
partition > outputfile
一个数组快可以对应很多个,或者一个切片
一个split对应一个map
一个map对应一个或者n个reduce
Map的输出正好是reduce的输入。
Shuffer:洗牌
数据向计算移动。
如何让shuffer的效率最高。
split一条一条,以一条记录为依据,也就是换行符。
映射成key -value的形式。
相同的key为一组。
面试的时候,buffer额调优,会是加分项。
有很多的机械读写,线性读写。
相同的key,具有相同的哈希值,就会去到相同的分区里。
排序的顺序是:先按分区排序,先按P排序,再按K排序
P .K排序。
相同分区排在一起,分区内相同的key排在一起。
Map中:
逻辑切片——————>通过key在map中化分组————》算出分区号,在内存中准备buffer,等到累积到一定的量的时候,写入map中————》在map中,相同的P排在一起,相同的key排在前一起。
Map和reduce是线性依赖关系。
Reduce可以先拉数据,对内是有序的,对外是无序的。然后是归并,再次是计算。
源语:相同的key为一组。调用一次。
相同的key为一组,存在内存中。
MapReduce不需要太大的内存。
一个reduce是一个分区,一个分区对应一个文件。
Map端需要读懂数据
理解:
Map:
读懂数据
映射为KV模型
并行分布式
计算向数据移动
Reduce:
数据全量/分量加工
Reduce中可以包含不同的key
相同的Key汇聚到一个Reduce中
相同的Key调用一次reduce方法
排序实现key的汇聚
K,V使用自定义数据类型
作为参数传递,节省开发成本,提高程序自由度
Writable序列化:使能分布式程序数据交互
Comparable比较器:实现具体排序(字典序,数值序等)
排序:字典序,数值序。
体现的是计算向数据的移动。
切片决定map,数据集是人给的,数据集决定切片。
Config,配置文件,jar包,三个
1.调度
2.资源管理
MRv1角色:
JobTracker
核心,主,单点
调度所有的作业
监控整个集群的资源负载
TaskTracker
从,自身节点资源管理
和JobTracker心跳,汇报资源,获取Task
Client
作业为单位
规划作业计算分布
提交作业资源到HDFS
最终提交作业到JobTracker
弊端:
JobTracker:负载过重,单点故障
资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
不同框架对资源不能全局管理
Yarn:分布式资源管理系统
Nodemanager:节点管理
Resourcemanager:资源管理
Applicationmaster应用程序主
Container:容器
Client:客户,顾客
JVM:java virtual machine
Map :地图
Resource:资源
Submission:提交
Request:请求
Submission:提交
Partitioner:分区器
CPU
Mem
I/o
Linux
Group
Nn:namenode
Nm:nodemanager
Iterator:迭代器
Sort:排序
Spill:溢写
Shuffer
Intwritable
Text
Object
Comparator:比较器
Get
Set
Reflect:反射
Init:初始化
test
Api
Zk:
Zkfc:
客户端(作业)
客户端随着作业而启动。Aplicationmaster也是随着作业而启动的。
1.X:各种端点问题
2.X:出现了yarn
MRv2:On YARN
YARN:解耦资源与计算
ResourceManager
主,核心
集群节点资源管理
NodeManager
与RM汇报资源
管理Container生命周期
计算框架中的角色都以Container表示
Container:【节点NM,CPU,MEM,I/O大小,启动命令】
默认NodeManager启动线程监控Container大小,超出申请资源额度,kill
支持Linux内核的Cgroup
MR :
MR-ApplicationMaster-Container
作业为单位,避免单点故障,负载到不同的节点
创建Task需要和RM申请资源(Container)
Task-Container
Client:
RM-Client:请求资源创建AM
AM-Client:与AM交互
YARN
YARN:Yet Another Resource Negotiator;
Hadoop 2.0新引入的资源管理系统,直接从MRv1演化而来的;
核心思想:将MRv1中JobTracker的资源管理和任务调度两个功能分开,分别由ResourceManager和ApplicationMaster进程实现
ResourceManager:负责整个集群的资源管理和调度
ApplicationMaster:负责应用程序相关的事务,比如任务调度、任务监控和容错等
YARN的引入,使得多个计算框架可运行在一个集群中
每个应用程序对应一个ApplicationMaster
目前多个计算框架可以运行在YARN上,比如MapReduce、Spark、Storm等
Linux的命令总结
配置文件:
cp mapred-site.xml.template mapred-site.xml
vi mapred-site.xml配置
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
vi yarn-site.xml
分发:
scp mapred-site.xml yarn-site.xml 192.168.198.22:`pwd`
展开客户端:
zkCli.sh
执行:ls /
Yarn 的启动命令:
Start-yarn.sh
Resourcemanager的启动命令:
yarn-daemon.sh start resourcemanager
查看:
Hdfs dfs -cat /user/root/test.txt
统计并输出的命令:
hadoop jar hadoop-mapreduce-examples-2.6.5.jar wordcount /user/root/test.txt /data/wc/output
查看文件:
Hdfs dfs -ls /data/wc/output
如果想将两个文件放在一个目录中
创建目录
Mkdir mrout
Cd mrout
Hdfs dfs -get /data/wc/output/* ./
Ll查看
实操部分:
倒排缩影,
Sxt;(a,x)(1,88,107)
偏移量
谷歌公司爬虫,爬出所有的文件,存储起来
参数传递的方式:
应用传递和值传递
应用传递,传递地址
Map是计算向数据的移动的过程
Shuffer是数据向计算的移动的过程
Map的输出是reduce的输入。
shuffer的过程,从哪里开始,到哪里结束。
Shuffer:map输出——p(计算key,value)的计算——>buffer————>sort————>reduce
不好意思,我看的源码,没想到您的理解层次很深。
Map易于程序人员开发分布式开发技术
导入源码包:
ctrl+单词
然后,导入源码包的地址,
导出jar包,选择export,然后选择JAR file,然后选择导出的地址,填写文件名,然后选择finish
启动namenode的命令:
start-all.sh
Hadoop运行jar包的命令:
hadoop jar MyWc.jar com.sxt.hadoop.mr.MyJOB
启动DataNode的命令:
hadoop-daemon.sh start datanode
停止DataNode的命令:
hadoop-daemon.sh stop datanode
Map默认的输入格式化是:
textInputFormat
客户端:切片清单
行的结尾是换行符<br>
Combiner就是一个萎缩版的reduce.
16B int
key:起始位置,4B
val:起始位置
val:结束位置
p:分区信息
只有在map阶段才是真正的排序
Secondarysort:不是二次排序,而是在reduce阶段的分组。
源语:相同的key为一组,调用一次reduce方法。
排序比较 三种
分组比较 两种
Map的输出是reduce的输入。
Next key value
Java中迭代的方式:
加强for循环
iterator
Reduce方法中的迭代器,为假的迭代器
Iterator<IntWritable> it =values.iterator();
While(it.hasNext()){
IntWritable n =it.next();
}