Hadoop_FileInputFormat分片

本文详细介绍了Hadoop中InputFormat和OutputFormat的作用及其抽象类特性,并深入探讨了提交任务时获取split切片信息的过程。此外,还分析了Hadoop处理小文件时存在的问题及解决方案。

Hadoop学习笔记总结

01. InputFormat和OutFormat

1. 整个MapReduce组件

qa1Mx67.png

InputFormat类和OutFormat类都是抽象类。
可以实现文件系统的读写,数据库的读写,服务器端的读写。
这样的设计,具有高内聚、低耦合的特点。

2. 提交任务时,获取split切片信息的流程

  1. JobSubmitter初始化submitterJobDir资源提交路径,是提交到HDFS保存文件路径,一些Jar包和配置文件:
    612168-20161210115446804-1441171706.png

  2. 接下来,是JobSubmitter中将切片信息写入submitJobDir目录。
    int maps = writeSplits(job, submitJobDir);

  3. writeSplits方法中,首先会通过反射拿到用户设置的InputFormat子类的实例(默认为TextInputFormat类),然后调用FileInputFormat的getSplit方法(父类公共方法)再获得切片的信息,封装到InputSplit中,返回List。

     InputFormat<?, ?> input =
       ReflectionUtils.newInstance(job.getInputFormatClass(), conf);
     List<InputSplit> splits = input.getSplits(job);
  4. 最后将切片描述信息写到submitterJobDir资源提交路径中。

     JobSplitWriter.createSplitFiles(jobSubmitDir, conf, jobSubmitDir.getFileSystem(conf), array);
  5. InputSplit包含block块所在位置主机,路径,偏移量等信息。分片数据不包含数据本身,而是指向数据的引用。

  6. input.getSplits()方法解析
    t4PFatP.png
    由FileInputFormat类中getSplits方法决定。
    计算公式:

     //computeSplitSize中
     minSize=max{getFormatMinSplitSize(),mapred.min.split.size} (getFormatMinSplitSize()大小默认为1B)
     maxSize=mapred.max.split.size(不在配置文件中指定时大小为Long.MAX_VALUE)
     //blockSize是默认的配置大小:128MB
    
     //分片大小的计算公式
     splitSize=max{minSize,min{maxSize,blockSize}}

    默认情况下,minSize < blockSize < maxSize
    所以,默认不在配置文件配置split最大值和最小值,分片大小就是blockSize,128MB。

公式的含义:取分片大小不大于block,并且不小于在mapred.min.split.size配置中定义的最小Size。

举例说明如何控制分片大小:
612168-20161210115430413-826821983.png

3. 为什么Hadoop不擅长小文件

逻辑上,FileInputFormat生成的分块是一个文件或者该文件的一部分,如果是很多小文件,就生成了很多的逻辑block。默认情况下,一个分片就是一个block,因而,会有很多个map任务,每次map操作都有很多额外的开销。

因此,运行大量小文件的任务,会增加运行作业的额外开销;浪费NameNode内存。

解决:CombineFileInputFormat

参考《Hadoop权威指南》
初接触,记下学习笔记,还有很多问题,望指导,谢谢。

转载于:https://www.cnblogs.com/wangrd/p/6155313.html

### Hadoop中切片与分片的概念区别 #### 1. 定义 在Hadoop生态系统中,“分片”通常指的是HDFS中的物理存储单元——Block,而“切片”则是指逻辑上的划分单位——Split。 - **分片 (Block)** 分片是指HDFS中文件的物理存储单位。当一个大文件被上传到HDFS时,会被分割成固定大小的数据块(Block),这些数据块会分布存储在整个分布式集群的不同节点上。默认情况下,HDFS的一个Block大小为128MB(可配置)。这种物理分片是为了满足分布式存储的需求[^1]。 - **切片 (Split)** 切片是MapReduce框架为了提高计算效率,在逻辑层面对输入数据进行的进一步划分。它并不改变数据的实际存储位置或形式,而是通过定义逻辑边界来告诉MapTask如何读取和处理数据。切片的数量决定了MapTask的任务数量,即每个切片对应一个MapTask[^2]。 #### 2. 关系与差异 尽管两者都涉及“分”的概念,但它们的应用层次不同: - **物理 vs 逻辑** - Block属于物理层面的操作,关注的是数据的持久化存储。 - Split则是一种逻辑抽象,主要用于指导MapReduce作业如何并行处理数据。 - **大小控制** - Block的大小由`dfs.blocksize`参数决定,通常是全局性的设置。 - Split的大小可以通过`mapreduce.input.fileinputformat.split.maxsize`等参数动态调整,允许针对具体任务优化性能[^3]。 - **灵活性** - 对于小文件较多的情况,如果按照Block直接映射到MapTask,可能会导致过多的小任务影响整体性能。此时可以采用CombineTextInputFormat等方式将多个小文件组合成一个较大的Split,从而减少不必要的开销[^4]。 #### 3. 使用场景 - **Block适用场景** 当需要考虑大规模数据集的安全性和可靠性时,合理配置Block大小至关重要。更大的Block能够降低元数据管理成本以及网络传输次数;然而过大的Block可能不利于随机访问操作。 - **Split适用场景** 在设计高效的大数据分析流程时,适当调节Split策略有助于平衡负载均衡与资源利用率之间的矛盾。例如对于包含众多小型独立记录的日志分析项目来说,运用定制化的InputFormat实现更精细粒度的分区往往能带来显著收益。 ```python from hadoop.conf import Configuration config = Configuration() # 设置split的最大尺寸 config.set('mapreduce.input.fileinputformat.split.maxsize', '134217728') # 单位字节, 这里设为128MB ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值