Mapreduce执行过程

Mapreduce执行过程

splitSize=Mash.max(minSize,Math.min(maxSize,blockSize))

数据块大小一般与分片大小相同

Block数据块------分片

FileSplit FilrInputFormat 继承,重写可以设置字节的K.V

分片------K.V(一条数据,一对K.V)

K.V---------Mapper类

分区器HashPartitioner

Mapper----------K.V.P(P:分区号,值一定为一个整数)

K.V.P-------内存缓冲区(默认100M,当内存缓冲区大小到达60%时,自动触发溢写线程)

溢写Spill To Disk---------1.[调用排序算法(快排算法)]如果没有用户自定义的比较器,就会调用K自己的比较器

溢写--------2.[调用合并程序]用户自定义的Combiner类,如果用户没有定义合并器,则这步不存在

溢写--------3.分区[分区1磁盘文件,分区2磁盘文件 ........]当磁盘中某个分区的文件数量>=3个,自动触发文件合并程序(合并程序继续调用排序算法(归并算法,内部有序,总体无序),合并成一个有序的分区磁盘文件

分区磁盘文件触发拷贝线程(自动去所有map输出的机器上拷贝某一个分区1的所有数据,可能存在跨机器网络抓取数据)

继续调用排序算法------迭代器(iterator)-----分组(1,用户自定义的分组比较器,2,用户自定义的排序比较器,3,K自己的比较器。没有1,才选2,没有1,2,才选3)-------再次形成一个迭代器(分组机制,相邻且相同的数据才形成一个迭代器,1条,2条,3条相同形成一个组,3条和4条比较不同,则4条分为另一组内,4条和5条比相同,则分为一组,不同,则4条单独成一组,依次比较分组,形成各组假迭代器。)如果排序不对,则分组一定不对

假迭代器循环调用传参--------自己定义的Reducer类(循环执行,一个假迭代器执行一次),

Reducer1只抓去^所有^块的分区1的数据

Reducer2只抓去^所有^块的分区2的数据

Reducer通过FileOutputFormat类生成HDFS结果文件

特殊情况:当Mapper类输出的K.V.P已经是最终结果,则直接生成结果

hadoop-hdfs-API

在windows上部署hadoop包

windows配置环境变量

hadoop的bin目录,HADOOP_USER_NAME root

配置eclipse,从Linux上拉取core-sit.xml,hdfs-site.xml文件

java代码

Configuration conf;加载配置文件

FileSystem fs ;客户端

fs =FileSystem.get(conf);

创建目录

@Test public void mkdir() throws Exception{ Path ifile=new Path("/ooxx"); if(fs.exists(ifile)){ fs.delete(ifile,true); } fs.mkdirs(ifile); }

上传文件 @Test public void upload() throws Exception{ Path f = new Path("/ooxx/hello.txt/"); FSDataOutputStream output = fs.create(f); InputStream input = new BufferedInputStream(new FileInputStream(new File("D:\reqlog.txt"))); IOUtils.copyBytes(input, output, conf,true);

}

}

查看块的信息

@Test

public void blks(){

Path i = new Path("/ooxx/hello.txt/");

FileStatus ifile = fs.getFileStatus(i);

BlockLocation[] blks = fs.getFileBlockLocations(ifile,0,ifile.getLen());

for (BlockLocation b : blks){

system.out.println(b);

}

}

hdfs dfs -mkdir -p /user/root 命令行上传文件

Hoodoop YARN

资源框架

用户写的分析程序------class------jar------>

ResourceManager(资源管理)监控所有NodeManager1,NodeManager2....所有资源,开始分配资源,通知NM启动AppMaster进程(执行jar包程序)

AppMaster向RM申请资源,并提交分片位置,RM按照就近原则返回资源的清单(1,node1,1个CPU,1G内存,2,node2,2,2),AppMaster按清单通知(所有的DataNode节点上都有NodeManager)node01启动相应的进程YarnChild进程

App Master资源调度 调动container(容器,资源约束)

一个作业有一个AppMaster调度,各作业间不受影响

1:1=NodeManager(监管本台机器上的资源):DataNode

 

posted @ 2019-06-13 20:40  虎呗  阅读(154)  评论(0编辑  收藏  举报