adoop深入学习:InputFormat组件

MapReduce(一):FileInputFormat源码解析 FileInputFormat切片机制 1 job提交流程源码详解 主要代码流程: waitForCompletion() submit(); // 1建立和集群的连接,将相关信息交给集群,使用了动态代理 connect(); // 1)创建提交job的代理 new Cluster(getConfiguration()); // (1)判断是本地yarn还是远程 in... 阅读详情
在本节里,我们着重学习MapReduce编程接口模型中的InputForamt组件。 
        InputFormat主要用于描述输入数据的格式,提供了以下两个功能: 
        1)、数据切分,按照某个策略将输入数据且分成若干个split,以便确定Map Task的个数即Mapper的个数,在MapReduce框架中,一个split就意味着需要一个Map Task; 
        2)为Mapper提供输入数据,即给定一个split,(使用其中的RecordReader对象)将之解析为一个个的key/value键值对。 

        下面我们先来看以下1.0版本中的老的InputFormat接口:
Java代码   收藏代码
  1. public interface InputFormat<K,V>{  
  2.      
  3.    //获取所有的split分片     
  4.    public InputSplit[] getSplits(JobConf job,int numSplits) throws IOException;   
  5.     
  6.    //获取读取split的RecordReader对象,实际上是由RecordReader对象将  
  7.    //split解析成一个个的key/value对儿  
  8.    public RecordReader<K,V> getRecordReader(InputSplit split,  
  9.                                JobConf job,  
  10.                                Reporter reporter) throws IOException;   
  11. }  


         InputSplit  
        getSplit(...)方法主要用于切分数据,它会尝试浙江输入数据且分成numSplits个InputSplit的栓皮栎split分片。InputSplit主要有以下特点: 
        1)、逻辑分片,之前我们已经学习过split和block的对应关系和区别,split只是在逻辑上对数据分片,并不会在磁盘上讲数据切分成split物理分片,实际上数据在HDFS上还是以block为基本单位来存储数据的。InputSplit只记录了Mapper要处理的数据的元数据信息,如起始位置、长度和所在的节点; 
 
         2)、可序列化,在Hadoop中,序列化主要起两个作用,进程间通信和数据持久化存储。在这里,InputSplit主要用于进程间的通信。 
         在作业被提交到JobTracker之前,Client会先调用作业InputSplit中的getSplit()方法,并将得到的分片信息序列化到文件中,这样,在作业在JobTracker端初始化时,便可并解析出所有split分片,创建对象应的Map Task。 
         InputSplit也是一个interface,具体返回什么样的implement,这是由具体的InputFormat来决定的。InputSplit也只有两个接口函数:
Java代码   收藏代码
  1. public interface InputSplit extends Writable {  
  2.   
  3.   /** 
  4.    * 获取split分片的长度 
  5.    *  
  6.    * @return the number of bytes in the input split. 
  7.    * @throws IOException 
  8.    */  
  9.   long getLength() throws IOException;  
  10.     
  11.   /** 
  12.    * 获取存放这个Split的Location信息(也就是这个Split在HDFS上存放的机器。它可能有 
  13.    * 多个replication,存在于多台机器上 
  14.    *  
  15.    * @return list of hostnames where data of the <code>InputSplit</code> is 
  16.    *         located as an array of <code>String</code>s. 
  17.    * @throws IOException 
  18.    */  
  19.   String[] getLocations() throws IOException;  
  20. }  

         在需要读取一个Split的时候,其对应的InputSplit会被传递到InputFormat的第二个接口函数getRecordReader,然后被用于初始化一个RecordReader,以便解析输入数据,描述Split的重要信息都被隐藏了,只有具体的InputFormat自己知道,InputFormat只需要保证getSplits返回的InputSplit和getRecordReader所关心的InputSplit是同样的implement就行了,这给InputFormat的实现提供了巨大的灵活性。 
         在MapReduce框架中最常用的FileInputFormat为例,其内部使用的就是FileSplit来描述InputSplit。我们来看一下FileSplit的一些定义信息:
Java代码   收藏代码
  1. /** A section of an input file.  Returned by {@link 
  2.  * InputFormat#getSplits(JobConf, int)} and passed to 
  3.  * {@link InputFormat#getRecordReader(InputSplit,JobConf,Reporter)}.  
  4.  */  
  5. public class FileSplit extends org.apache.hadoop.mapreduce.InputSplit   
  6.                        implements InputSplit {  
  7.   // Split所在的文件  
  8.   private Path file;  
  9.   // Split的起始位置  
  10.   private long start;  
  11.   // Split的长度  
  12.   private long length;  
  13.   // Split所在的机器名称  
  14.   private String[] hosts;  
  15.     
  16.   FileSplit() {}  
  17.   
  18.   /** Constructs a split. 
  19.    * @deprecated 
  20.    * @param file the file name 
  21.    * @param start the position of the first byte in the file to process 
  22.    * @param length the number of bytes in the file to process 
  23.    */  
  24.   @Deprecated  
  25.   public FileSplit(Path file, long start, long length, JobConf conf) {  
  26.     this(file, start, length, (String[])null);  
  27.   }  
  28.   
  29.   /** Constructs a split with host information 
  30.    * 
  31.    * @param file the file name 
  32.    * @param start the position of the first byte in the file to process 
  33.    * @param length the number of bytes in the file to process 
  34.    * @param hosts the list of hosts containing the block, possibly null 
  35.    */  
  36.   public FileSplit(Path file, long start, long length, String[] hosts) {  
  37.     this.file = file;  
  38.     this.start = start;  
  39.     this.length = length;  
  40.     this.hosts = hosts;  
  41.   }  
  42.   
  43.   /** The file containing this split's data. */  
  44.   public Path getPath() { return file; }  
  45.     
  46.   /** The position of the first byte in the file to process. */  
  47.   public long getStart() { return start; }  
  48.     
  49.   /** The number of bytes in the file to process. */  
  50.   public long getLength() { return length; }  
  51.   
  52.   public String toString() { return file + ":" + start + "+" + length; }  
  53.   
  54.   ////////////////////////////////////////////  
  55.   // Writable methods  
  56.   ////////////////////////////////////////////  
  57.   
  58.   public void write(DataOutput out) throws IOException {  
  59.     UTF8.writeString(out, file.toString());  
  60.     out.writeLong(start);  
  61.     out.writeLong(length);  
  62.   }  
  63.   public void readFields(DataInput in) throws IOException {  
  64.     file = new Path(UTF8.readString(in));  
  65.     start = in.readLong();  
  66.     length = in.readLong();  
  67.     hosts = null;  
  68.   }  
  69.   
  70.   public String[] getLocations() throws IOException {  
  71.     if (this.hosts == null) {  
  72.       return new String[]{};  
  73.     } else {  
  74.       return this.hosts;  
  75.     }  
  76.   }  
  77.     
  78. }  

         从上面的代码中我们可以看到,FileSplit就是InputSplit接口的一个实现。InputFormat使用的RecordReader将从FileSplit中获取信息,解析FileSplit对象从而获得需要的数据的起始位置、长度和节点位置。 

          RecordReader  
         对于getRecordReader(...)方法,它返回一个RecordReader对象,该对象可以讲输入的split分片解析成一个个的key/value对儿。在Map Task的执行过程中,会不停的调用RecordReader对象的方法,迭代获取key/value并交给map()方法处理:
Java代码   收藏代码
  1. //调用InputFormat的getRecordReader()获取RecordReader<K,V>对象,  
  2. //并由RecordReader对象解析其中的input(split)...  
  3. K1 key = input.createKey();  
  4. V1 value = input.createValue();  
  5. while(input.next(key,value)){//从input读取下一个key/value对  
  6.     //调用用户编写的map()方法  
  7. }  
  8. input.close();  

         RecordReader主要有两个功能: 
         ●定位记录的边界:由于FileInputFormat是按照数据量对文件进行切分,因而有可能会将一条完整的记录切成2部分,分别属于两个split分片,为了解决跨InputSplit分片读取数据的问题,RecordReader规定每个分片的第一条不完整的记录划给前一个分片处理。 
         ●解析key/value:定位一条新的记录,将记录分解成key和value两部分供Mapper处理。 
         
          InputFormat  
         MapReduce自带了一些InputFormat的实现类: 


         下面我们看几个有代表性的InputFormat: 
          FileInputFormat  
         FileInputFormat是一个抽象类,它最重要的功能是为各种InputFormat提供统一的getSplits()方法,该方法最核心的是文件切分算法和Host选择算法:
Java代码   收藏代码
  1. /** Splits files returned by {@link #listStatus(JobConf)} when 
  2.    * they're too big.*/   
  3. @SuppressWarnings("deprecation")  
  4. public InputSplit[] getSplits(JobConf job, int numSplits)  
  5.     throws IOException {  
  6.     FileStatus[] files = listStatus(job);  
  7.       
  8.     // Save the number of input files in the job-conf  
  9.     job.setLong(NUM_INPUT_FILES, files.length);  
  10.     long totalSize = 0;                           // compute total size  
  11.     for (FileStatus file: files) {                // check we have valid files  
  12.       if (file.isDir()) {  
  13.         throw new IOException("Not a file: "+ file.getPath());  
  14.       }  
  15.       totalSize += file.getLen();  
  16.     }  
  17.       
  18.     long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);  
  19.     long minSize = Math.max(job.getLong("mapred.min.split.size", 1),  
  20.                             minSplitSize);  
  21.   
  22.     // 定义要生成的splits(FileSplit)的集合  
  23.     ArrayList<FileSplit> splits = new ArrayList<FileSplit>(numSplits);  
  24.     NetworkTopology clusterMap = new NetworkTopology();  
  25.     for (FileStatus file: files) {  
  26.       Path path = file.getPath();  
  27.       FileSystem fs = path.getFileSystem(job);  
  28.       long length = file.getLen();  
  29.       BlockLocation[] blkLocations = fs.getFileBlockLocations(file, 0, length);  
  30.       if ((length != 0) && isSplitable(fs, path)) {   
  31.         long blockSize = file.getBlockSize();  
  32.         //获取最终的split分片的大小,该值很可能和blockSize不相等  
  33.         long splitSize = computeSplitSize(goalSize, minSize, blockSize);  
  34.   
  35.         long bytesRemaining = length;  
  36.         while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {  
  37.           //获取split分片所在的host的节点信息  
  38.           String[] splitHosts = getSplitHosts(blkLocations,   
  39.               length-bytesRemaining, splitSize, clusterMap);  
  40.           //最终生成所有分片  
  41.           splits.add(new FileSplit(path, length-bytesRemaining, splitSize,   
  42.               splitHosts));  
  43.           bytesRemaining -= splitSize;  
  44.         }  
  45.           
  46.         if (bytesRemaining != 0) {  
  47.           splits.add(new FileSplit(path, length-bytesRemaining, bytesRemaining,   
  48.                      blkLocations[blkLocations.length-1].getHosts()));  
  49.         }  
  50.       } else if (length != 0) {  
  51.         //获取split分片所在的host的节点信息  
  52.         String[] splitHosts = getSplitHosts(blkLocations,0,length,clusterMap);  
  53.         //最终生成所有分片  
  54.         splits.add(new FileSplit(path, 0, length, splitHosts));  
  55.       } else {   
  56.         //Create empty hosts array for zero length files  
  57.         //最终生成所有分片  
  58.         splits.add(new FileSplit(path, 0, length, new String[0]));  
  59.       }  
  60.     }  
  61.     LOG.debug("Total # of splits: " + splits.size());  
  62.     return splits.toArray(new FileSplit[splits.size()]);  
  63. }  

          1)、文件切分算法 
          文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段,FileInputSplit以文件为单位切分生成InputSplit。有三个属性值来确定InputSplit的个数: 
          ●goalSize:该值由totalSize/numSplits来确定InputSplit的长度,它是根据用户的期望的InputSplit个数计算出来的;numSplits为用户设定的Map Task的个数,默认为1。 
          ●minSize:由配置参数mapred.min.split.size决定的InputFormat的最小长度,默认为1。 
          ●blockSize:HDFS中的文件存储块block的大小,默认为64MB。 
          这三个参数决定一个InputFormat分片的最终的长度,计算方法如下: 
                       splitSize = max{minSize,min{goalSize,blockSize}}  
计算出了分片的长度后,也就确定了InputFormat的数目。 

          2)、host选择算法 
          InputFormat的切分方案确定后,接下来就是要确定每一个InputSplit的元数据信息。InputSplit元数据通常包括四部分,<file,start,length,hosts>其意义为: 
          ●file标识InputSplit分片所在的文件; 
          ●InputSplit分片在文件中的的起始位置; 
          ●InputSplit分片的长度; 
          ●分片所在的host节点的列表。 
           InputSplit的host列表的算作策略直接影响到运行作业的本地性 。我们知道,由于大文件存储在HDFS上的block可能会遍布整个Hadoop集群,而一个InputSplit分片的划分算法可能会导致一个split分片对应多个不在同一个节点上的blocks,这就会使得在Map Task执行过程中会涉及到读其他节点上的属于该Task的block中的数据,从而不能实现数据本地性,而造成更多的网络传输开销。 
          一个InputSplit分片对应的blocks可能位于多个数据节点地上,但是基于任务调度的效率,通常情况下,不会把一个分片涉及的所有的节点信息都加到其host列表中,而是选择包含该分片的数据总量的最大的前几个节点,作为任务调度时判断是否具有本地性的主要凭证。 
         FileInputFormat使用了一个启发式的host选择算法:首先按照rack机架包含的数据量对rack排序,然后再在rack内部按照每个node节点包含的数据量对node排序,最后选取前N个(N为block的副本数)node的host作为InputSplit分片的host列表。当任务地调度Task作业时,只要将Task调度给host列表上的节点,就可以认为该Task满足了本地性。 
         从上面的信息我们可以知道,当InputSplit分片的大小大于block的大小时,Map Task并不能完全满足数据的本地性,总有一本分的数据要通过网络从远程节点上读数据,故为了提高Map Task的数据本地性,减少网络传输的开销,应尽量是InputFormat的大小和HDFS的block块大小相同。 

           TextInputFormat  
          默认情况下,MapReduce使用的是TextInputFormat来读分片并将记录数据解析成一个个的key/value对,其中key为该行在整个文件(注意而不是在一个block)中的偏移量,而行的内容即为value。 
           CombineFileInputFormat  
          CombineFileInputFormat的作用是把许多文件合并作为一个map的输入,它的主要思路是把输入目录下的大文件分成多个map的输入, 并合并小文件, 做为一个map的输入。适合在处理多个小文件的场景。 
           SequenceFileInputFormat  
          SequenceFileInputFormat是一个顺序的二进制的FileInputFormat,内部以key/value的格式保存数据,通常会结合LZO或Snappy压缩算法来读取或保存可分片的数据文件。
Blender - Shrinkwrap - 更方便的制作贴合模型的表面来建模 Shrinkwrap 修改器 使用 Blender 想要快速建模可以贴合现有模型表面的效果:衣服、皮肤、等效果,可以使用 Shrinkwrap 修改器,这个修改器的名字其实按照英文上的理解,翻译为:收缩的包裹效果 应用 如这块铁皮,它要贴合机身弯曲的效果,可以先建好一个铁皮,再 Shrinkwrap 到一个指定的网格上 留意的参数 Target 要贴合的对象(目前我已知是可以贴合到网格对象上,实在是方便) VertexGroup 顶点组,和之前讲到过的,顶点组可以组设顶点的权重,意思这个可. 阅读详情

相关推荐

从零到一:Firefly-RK3399上的Ubuntu镜像构建与GPU加速实战

本文详细介绍了在Firefly-RK3399开发板上从零构建深度优化的Ubuntu系统镜像的全过程,包括交叉编译环境配置、内核定制、GPU加速环境部署(Mesa Panfrost驱动、OpenCL/Vulkan支持)以及深度学习推理优化(TFLite + LinuxNN)。通过实战案例展示了如何充分发挥Mali-T860 GPU的硬件潜力,提升边缘AI应用的性能和能效。

pz8901234的博客 1022

【MapReduce】基础案例 ---- 自定义InputFormat实现类(小文件合并成SequenceFile文件)

文章目录自定义InputFormat 实现类自定义InputFormat实现类基本步骤案例:将多个小文件合并成一个SequenceFile文件分析代码实现WholeFileInputformatWholeRecordReaderMapper阶段Reducer阶段Driver阶段DeBug调试 自定义InputFormat 实现类 无论HDFS还是MapReduce,在处理小文件时效率都非常低,但又难免面临处理大量小文件的场景,此时,就需要有相应解决方案。可以自定义InputFormat实现小文件的..

懂得一千零一种,赋予你失败的方法! 952

使用KITTI数据集测试不同算法的性能

该文章将使用同一个kitti数据集来测试不同算法的性能,目前已经测试的算法包括:LIO-SAM,FAST-LIO2,Point-LIO,Faster-LIO。

wwtx的博客 2586

MapReduce的输入输出格式

InputFormat TextInputFile 最普通的文本文档格式,MR中默认的 InputFormat,不需要特殊指定 每条记录是一行输入。键是LongWritable 类型,存储该行在整个文件中的字节偏移量。 值是这行的内容,不包括任何行终止符(换行符合回车符),它被打包成一个 Text 对象。 SequenceFileInputFormat 序列化文件格式,文件中两个字段,分别代表key和value。 KEYIN VALUEIN (根据文件字段的实际类型确定) KeyValueFileInput

学习记录 1584

​基于stm32的智能空气加湿器设计(含源代码和Proteus仿真)

课程设计分享

LoongSTUDIO的博客 2929

MySQL服务启动失败?手把手教你排查NET HELPMSG 3534错误(附完整修复流程)

本文针对Windows平台上MySQL服务启动失败并提示NET HELPMSG 3534错误的常见问题,提供了系统性的排查与修复指南。文章深入剖析了错误本质,并手把手教你通过查看MySQL错误日志、检查并初始化数据目录、修正Windows服务配置、排查my.ini配置文件陷阱等核心步骤,彻底解决这一棘手问题,帮助开发者和运维人员快速恢复数据库服务。

wdx0123456的博客 897

MapReduce组件总结

1. HDFS 1.1 简介 HDFS是一个分布式文件系统,用于存储大且多的文件。适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析。 1.2 优点 高容错:数据会自动拷贝副本,当某一个副本丢失,它也可以自动恢复 适合处理大数据:数据规模可以支持GB,TB,甚至PB级别数据。 可构建在廉价的机器上,成本低。 1.3 缺点 不支持低延迟数据访问 无法高效的存储小文件:会占用NameNode大量内存来存储文件目录和块信息,而NameNode的内存是有限的 不支持并发写入文件,

weixin_38312502的博客 2792

从 ABAP 视角看 JSON :7.40 版本带来的那些改变

摘要:ABAP 对 JSON 的原生支持 随着企业系统与外部 API 的交互增多,ABAP 从 NetWeaver 7.40 开始原生支持 JSON 格式。通过复用现有 XML 基础设施,ABAP 团队引入 JSON-XML 概念,使用 sXML Library 和 IF_SXML=>CO_XT_JSON 常量处理 JSON 数据。开发人员可通过 CALL TRANSFORMATION 语句实现 ABAP 数据与 JSON 的双向转换,大幅简化了与外部系统的数据交互。这种标准化的 JSON 处理方式提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

hadoop的inputformat问题

一、概述 MapReduce开始阶段阶段,InputFormat类用来产生InputSplit,并把基于RecordReader它切分成record(即KEYIN-VALUEIN),形成Mapper的输入。 Hadoop本身提供了若干内置的InputFormat,其中如果不明确指定默认使用TextInputFormat。 二、常见子类 TextInputFormat:作为默认的文件输入...

大头鱼 1220

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

Keras中神经网络可视化模块keras.utils.visualize_util安装配置方法

jacke121的专栏 2759

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1629

SequenceFileInputFormat用法

SequenceFileInputFormat只能处理SequenceFile类型的文件。 代码: package inputformat; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.

鲍礼彬的优快云博客 ~_~ 5728

SAP VC 可配置物料超级BOM简介

在有些业务中比如:汽车、笔记本、电脑、电梯等产品中,其中组成产品的型号个框架是确认的 ,但是框架内部的BOM是可变的,在客户下销售订单的时候,选取对应的组件 ,让后通过MRP的计算优生产线对这样的销售订单提供生产。这个时候我们需要选择我们需要的内存和硬盘的型号,还记得我们前面创建的特征值对应的吗,A对应的8G、B对应16G、X对应1T硬盘、Y对应2T硬盘,这里我们填写对应的值,我们这里选择16G的内存和2T的硬盘,B和Y。3、当我们选择了可配置物料的生产模式时,基本上就选择了按单生产的生产模式了。

我小时候很黑的博客 1万+

MapReduce中FileInputFormat解析

1、概述 在map阶段,文件先被切分成split块,而后每一个split切片对应一个Mapper任务。 FileInputFormat这个类先对输入文件进行逻辑上的划分,以128M为单位,将原始数据从逻辑上分割成若干个split,每个split切片对应一个Mapper任务。 2、切片与与MapTask并行度决定机制 数据块:Block 是 HDFS 物理上把数据分成一块一块。数据块是 HDFS 存储数据单位。 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行 存储。数据切片是Ma

南洲.的博客 3305

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

FileInputFormat类中split切分算法和host选择算法介绍

在hadoop源码的org.apache.hadoop.mapred包中,有个FileInputFormat类,这个类的主要作用是提供统一的getSplits函数。该函数实现中最核心的两个算法是split切分算法 和 host选择算法。 1、什么是split? 它是在逻辑上对输入数据进行的分片,并不会在磁盘上将其切分成分片进行存储。每个split都作为一个独立单位分配给一个task去

你心中的灯 3585

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

自定义hadoop的InputFormat

小小的抱怨一番这两天处理从文件中

zhongyifly的专栏 8044

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

InputFormat&OutputFormat

本文的主要目的是从源码级别讲解Hadoop中InputFormat和OutputFormat部分,首先简介InputFormat和OutputFormat,然后介绍两个重要的组件,RecordWriter和RecordReader,再以FileInputFormat和FileOutputFormat为例,介绍一组InputFormat和OutputFormat的实现细节,最后以SqoopInput

来啊 快活啊 2820

InputFormat的作用

InputFormat: 从文件中读取数据,转化成key-value格式。 对于常用的数据类型,hadoop已经有了这个接口的实现。 特殊文件格式的话,只有你自己知道怎么读取这种文件格式,你可以自己来定义。   method: 1. get InputSplit 框架调用此方法获得有几个逻辑块, 这样就知道需要多少个mapper了, 数据产生地点产生Mapper的实例。 2.c...

u011495642的博客 5682

InputFormat接口实现类

输入的文件格式包括:基于行的日志文件、二进制格式文件等。很明显,键并不是行号。一般情况下,很难取得行号,因为文件按字节而不是按行切分为分片。值是这行的内容,不包括任何行终止符(换行符和回车符)。MapReduce任务的输入文件一般是存储在。类型,存储该行在整个文件中的字节偏移量。以下是一个示例,比如,一个分片包含了如下。此时的键是每行排在制表符之前的。以下是一个示例,输入是一个包含。表示一个(水平方向的)制表符。,则每个输入分片包含两行。以下是一个示例,仍然以上面的。每条记录是一行输入。

qq_15304885的博客 1306

MapReduce框架原理-InputFormat数据输入

一、InputFormat简介 InputFormat是一个抽象类,没有实现怎么切片,怎么转换,由它的子类实现。其中InputFormat的默认实现类是FileInputFormat,其也是一个抽象类,没有具体实现,最终是由FileInputFormat的子类去实现的。子类一共有五个,每一个子类的分片机制和转换成key-value键值对数据的格式都不一样,其中默认使用的是TextInputFormat<K,V> InputFormat是一个抽象类,里面有两个方法: getSplit...

zyd_994264926326的博客 1501

自定义InputFormat和OutputFormat案例

一、自定义InputFormat   InputFormat是输入流,在前面的例子中使用的是文件输入输出流FileInputFormat和FileOutputFormat,而FileInputFormat和FileOutputFormat它们默认使用的是继承它们的子类TextInputFormat和TextOutputFormat,以Text的方式去读取数据。   当我们遇到许多小文...

SHZHJ2000的博客 325

MapReduce编程组件之InputFormat(1)

具体的子类对象是由InputFormat决定的,默认的输入格式是TextInputFormat,因此默认的RecordReader也是相对应的LineRecordReader。从MapContentImpl类中的方法可见,content.getCurrentKey(),content.getCurrentValue()以及nextKeyValue(),其实都是对RecordReader方法的封装,即MapContext是直接使用传入的RecordReader来对InputSplit进行“K-V对”读取的。

Jenny19992018的博客 2529

Hadoop_MapReduce 自定义InputFromat合并小文件

自定义InputFromat适用场景分析实现思路代码实现:自定义InputFromat自定义RecordReader定义map定义主类 适用场景 无论hdfs还是mapreduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案 分析 小文件的优化无非以下几种方式: 1、在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS 2、在业务处理之前,在HDFS上使用mapreduce程序对小文件进行合并 3、在mapreduce处理时,可采用combine

qq_45798620的博客 425

MapReduce输入格式(InputFormat)深度解析:原理与常见类型

特点:Hadoop默认的输入格式,适用于普通的文本文件。属性说明键类型LongWritable(行在文件中的字节偏移量)值类型Text(一行文本内容,不包括换行符)分片方式按字节大小切分,但会保证行完整性适用场景日志文件、CSV文件、任何按行分割的文本示例输入文件内容:Map任务输入:当内置的InputFormat无法满足需求时,可以通过继承FileInputFormat并实现自定义RecordReader来创建自己的InputFormat。假设需要处理一种自定义格式的文件,每条记录以";张三;25。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2164

Mapreduce程序中的FileInputFormat.addInputPaths和FileInputFormat.addInputPath方法

好几天没动笔了,今天写个简单的~~ 写MR过程中经常会遇到多个源路径的输入,我们可以在MR程序主函数中通过FileInputFormat.addInputPaths(job, conf.get("input_dir"))方法来实现, 在提交脚本中将多个源的路径用“,”分隔,input_dir=$INPUT_FILE_PATH1,$INPUT_FILE_PATH2   这样在执行MR的时候,输

yongjian_luo的专栏 7265

MapReduce编程——输入类FileInputFormat(切片)及其4个实现类(kv)的用法

一个完整的MapReduce程序包括四个阶段:Map Task阶段、Shuffle阶段、Reduce Task阶段 InputFormat是一个抽象类,用于获取Input输入数据,并将其切分和打成<k,v>键值对;这个类中有两个抽象方法,源码如下: public abstract class InputFormat<K, V> { public Input...

攻城狮Kevin 2333
上一篇: ChainMapper和ChainReducer
下一篇: 计算机科学中最重要的32个算法
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值