0911 hfds的java api shuffle大致过程

1 hdfs java API 

   new Configuration(true)  加载配置信息ture参数表示加载默认配置信息

   FileSystem.get(conf)  获取FileSystem对象对hdfs文件系统进行操作

   fs.mkdir(path) 创建文件路径

   fs.delete(PATH,boolean) 删除路径 ture可以迭代删除

   fs.listStatus(path)  路径下文件列表

   fs.rename(path)  改名 or 更换路径

   fs.create(path)  上传文件本地流 往hdfs的输出流上写操作

   IOUtils.copyBytes(fis, fos, 1024);  专门进行读写操作的工具类 输入流 输出流 字节大小

   fs.open(path)  打开文件 下载hdfs上的文件 hdfs输入流 本地输出流

   fs.getFileStatus(path) 获取文件元数据 

   fs.getFileBlockLocations(fss,0 ,len ) 文件的元数据信息 字节起始位置 读取长度  获取在这个长度内数据在那个DN上的信息

   FSDataInputStream.seek(0)  参数是字节偏移量 从0 到 字节末尾 即可读取整个文件

2 shuffle 大致过程

0911 hfds的java api shuffle大致过程

mr首先将进入的block快进行逻辑切分,一个切片对应一个map任务,map默认按行读取切片内容 按照kv形式发给map任务<"偏移量","字符串">  map进行计算 完成后 发给环形缓冲区 在缓冲区中计算分区编号(key的hash对reduce任务取模) 默认比例0.8 默认缓冲区100M 当环形缓冲区达到80M大小时  发生溢写 由内存写入到磁盘 在溢写的过程中 对分区编号进行排序(应该是归并排序) 在每个分区内对key进行快速排序(字典排序) 如果溢写产生的小文件超过3个 则进行归并 归并后也是分区编号有序 分区内字典排序  当一个map处理完一个切片数据后 所有的reduce任务来该map的机器上 通过http get请求各自分区编号的数据 

下载到reduce的本地  当所有的map处理完数据 reduce计算则开始