问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

hadoop map任务怎么一次读取一整块数据而非一次读取一行数据

发布网友 发布时间:2022-04-14 05:10

我来回答

2个回答

懂视网 时间:2022-04-14 09:32

代码里面按行读取:

 @Override
 protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  FileSystem fs = FileSystem.get(context.getConfiguration());
  for (FileStatus status : fs.listStatus(new Path(value.toString()))) {
  // process file
  }
 }

都不能满足需求,还是自己实现一个 OneMapOneDirectoryInputFormat 吧,也很简单:

import java.io.IOException;
import java.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.lib.input.CombineFileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.CombineFileSplit;
/**
 * 一个map处理一个目录的数据
 */
public abstract class OneMapOneDirectoryInputFormat extends CombineFileInputFormat {
 private static final Log LOG = LogFactory.getLog(OneMapOneDirectoryInputFormat.class);
 @Override
 protected boolean isSplitable(JobContext context, Path file) {
 return false;
 }
 @Override
 public List getSplits(JobContext job) throws IOException {
 // get all the files in input path
 List stats = listStatus(job);
 List splits = new ArrayList();
 if (stats.size() == 0) {
  return splits;
 }
 LOG.info("fileNums=" + stats.size());
 Map> map = new HashMap>();
 for (FileStatus stat : stats) {
  String directory = stat.getPath().getParent().toString();
  if (map.containsKey(directory)) {
  map.get(directory).add(stat);
  } else {
  List fileList = new ArrayList();
  fileList.add(stat);
  map.put(directory, fileList);
  }
 }
 // 设置inputSplit
 long currentLen = 0;
 List pathLst = new ArrayList();
 List offsetLst = new ArrayList();
 List lengthLst = new ArrayList();
 Iterator itr = map.keySet().iterator();
 while (itr.hasNext()) {
  String dir = itr.next();
  List fileList = map.get(dir);
  for (int i = 0; i < fileList.size(); i++) {
  FileStatus stat = fileList.get(i);
  pathLst.add(stat.getPath());
  offsetLst.add(0L);
  lengthLst.add(stat.getLen());
  currentLen += stat.getLen();
  }
  Path[] pathArray = new Path[pathLst.size()];
  CombineFileSplit thissplit = new CombineFileSplit(pathLst.toArray(pathArray),
   getLongArray(offsetLst), getLongArray(lengthLst), new String[0]);
  LOG.info("combineFileSplit(" + splits.size() + ") fileNum(" + pathLst.size()
   + ") length(" + currentLen + ")");
  for (int i = 0; i < pathArray.length; i++) {
  LOG.info(" -> path[" + i + "]=" + pathArray[i].toString());
  }
  splits.add(thissplit);
  pathLst.clear();
  offsetLst.clear();
  lengthLst.clear();
  currentLen = 0;
 }
 return splits;
 }
 private long[] getLongArray(List lst) {
 long[] rst = new long[lst.size()];
 for (int i = 0; i < lst.size(); i++) {
  rst[i] = lst.get(i);
 }
 return rst;
 }
}

这个InputFormat的具体使用方法就不说了。其实与“一个Hadoop程序的优化过程 – 根据文件实际大小实现CombineFileInputFormat”中的MultiFileInputFormat比较类似。

热心网友 时间:2022-04-14 06:40

1.Child类根据前面输入的三个参数,即tasktracher的地址、端口、taskid。通过TaskUmbilicalProtocol协议,从TaskTracker获得需要执行的Task,在Child的main函数中调用执行。
2. 在Chilld中,执行Task的run方法。Task 的run方法。是真正执行用户定义的map或者rece任务的入口,通过TaskUmbilicalProtocol向tasktracker上报执行进度。
3. 在MapTask的run中执行runMapper方法来调用mapper定义的方法。
4. 在runNewMapper方法中构造mapper实例和mapper执行的配置信息。并执行mapper.run方法来调用到用户定义的mapper的方法。
5. mapper的run方法中,从输入数据中逐一取出调用map方法来处理每一条数据
6. mapper的map方法是真正用户定义的处理数据的类。也是用户唯一需要定义的方法。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么车险可以分期花呗 请问“有几个虫子怕什么"改为陈述句是"有几个虫子不可怕"。为什么要加... 一只狼身边有一只羊为什么狼不吃羊? 路边有一只羊,过来一只狼,却没有吃羊,为什么? ...有没有一个厂叫【福高】厂的,是做电子产品的。。3Q 明道冒险王百度云如何下载 冒险王2cps联系谁? 350分到400分的二本大学 廊坊高考400分能上什么学校 河北2023年高考400分左右能上什么大学 资产总额=权益总额=债权人权益+所有者权益 什么是权益总额,权益总额都包括哪些??? 权益总额怎么算出来? 权益总额是等于负债加所有者权益吗 权益总额是什么?如果资产增加,负债也增加,权益总额会增加吗? 企业期末所有者权益总额等于什么? 权益总额包括什么 权益总额怎么算 会计中权益总额是什么 企业期末所有者权益总额等于什么 怎么办理助学贷款啊? Hadoop任务分配,怎么确保每个机器1个MAP,不重复? 我想在小县城开家茶餐厅 主要针对年轻人和学生 开个茶餐厅,请问需要准备哪些设备? 茶餐厅的利润一般控制在多少 一般开一个茶餐厅需要什么费用,费用高吗?加盟好还是自己开好呢? 开一家小规模的茶餐厅需要什么?具体哪些证件? 开家茶餐厅需要多少钱?需要注意什么? 谁有为职场加分的超强ppt设计素材 开一间100平方左右的茶餐厅需要投资多少钱? 微信好友的照片怎么下载到自已手机上 .test 格式是什么样的文件 java 如何使用@test 刚打完苹果肌可以低头拖地吗 打完苹果肌可以戴眼镜吗 打完苹果肌可以吃减肥药吗 哈士奇怎么训练? 成年哈士奇怎么训练 为什么配1L百分之75酒精需要700ml无水乙醇 加300ml水? 医用酒精的浓度是百分之七十五,它是由酒精和水按几比几配制的_百度问一问 简述10kg75%乙醇配制过程 配置百分之75的消毒酒精500ml需要百分之95药用酒精多少ml怎么配置 75%酒精的配制 浓度 时间 百分之七十五的酒精怎样稀释到百分之六十五?需加多少水?怎样算的急 ipad在屏幕使用时间设置了应用限额,怎么超过了时间还能使用?- 问一问 Hadoop中有没有一种程序只有Map函数没有Reduce函数 宁海县东方低压电器有限公司怎么样? 南通银华低压电器有限公司怎么样? 常州市河口低压电器有限公司怎么样? 北京ABB低压电器有限公司怎么样?