Mapreduce执行过程
splitSize=Mash.max(minSize,Math.min(maxSize,blockSize))
数据块大小一般与分片大小相同
Block数据块------分片
FileSplit FilrInputFormat 继承,重写可以设置字节的K.V
分片------K.V(一条数据,一对K.V)
分区器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