一.输入文件类型设置为 CombineTextInputFormat

hadoop

job.setInputFormatClass(CombineTextInputFormat.class)

spark

 val data = sc.newAPIHadoopFile(args(1),
classOf[CombineTextInputFormat],
classOf[LongWritable],
classOf[Text], hadoopConf)
.map { //TODO }

(hadoop2.7及其以上版本有这个类,虽然2.6也可能用这个类,但不兼容,会出一些bug导致任务失败;或者直接就报错找不到类)

二.再配置以下参数:

(如果设置了CombineTextInputFormat而不配置分片大小的参数,所有输入会合并为一个文件,也就是说,不管你数据多大,只有一个Map,血泪的教训啊!)

1.运行时加参数

-D mapreduce.input.fileinputformat.split.minsize=134217728
-D mapreduce.input.fileinputformat.split.maxsize=512000000
-D mapred.linerecordreader.maxlength=32768 

例如: hadoop jar xx.jar -D mapreduce.input.fileinputformat.split.minsize=134217728  -D mapreduce.input.fileinputformat.split.maxsize=512000000 <input> <output>

运行时添加参数这种方法需要在Diver 的main方法第一行添加如下代码(很重要):

String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();

不然直接拿会把运行参数-D当成 args[0],用GenericOptionsParser解析后otherArgs[0]参数是才是<input>;

不习惯运行时添加参数可以直接在Diver类中写死,代码中的设置会覆盖运行时添加的参数。

2.代码中设置参数

 var hadoopConf = new Configuration()
hadoopConf.set("mapreduce.input.fileinputformat.split.maxsize", "512000000")
hadoopConf.set("mapreduce.input.fileinputformat.split.minsize", "268435456")
hadoopConf.set("mapreduce.input.fileinputformat.split.minsize.per.node", "134217728") //下面这两参数可以不设置,详情看文章末尾
hadoopConf.set("mapreduce.input.fileinputformat.split.minsize.per.rack", "268435456")

maxsize和minsize是设置分片上下限的。

(这里还个参数,一般用不上  -D mapred.linerecordreader.maxlength=32768)设置每行最大长度。

MapReduce中获取job实例的时候把hadoopConf传入

Job job = Job.getInstance(hadoopConf,"MyJob");

Spark

//还是上面的spark示例代码 创建RDD的时候传入
val data = sc.newAPIHadoopFile(args(1),
classOf[CombineTextInputFormat],
classOf[LongWritable],
classOf[Text], hadoopConf)
.map { //TODO }

 完毕,打包运行代码吧!

other:

hadoopconf 的其他两个参数可以不设置,了解一下

  • 如果指定了mapreduce.input.fileinputformat.split.maxsize,那么在同一个节点上的Blocks合并,一个超过maxsize就生成新分片。
  • mapreduce.input.fileinputformat.split.minsize.per.node,那么会把1.中处理剩余的Block,进行合并,如果超过minsize,那么全部作为一个分片。否则这些Block与同一机架 Rack上的块进行合并。
  • 每个节点上如上同样的方式处理,然后针对整个Rack的所有Block,按照1.方式处理。剩余部分,如果指定了mapreduce.input.fileinputformat.split.minsize.per.rack,并且超过minsize.per.rack,则全部作为一个分片,否则这些Block保留,等待与所有机架上的剩余Block进行汇总处理。


每个机架上都按照1,2,3方式处理,汇总所有处理剩下的部分,再按照1的逻辑处理。再剩余的,作为一个分片。

hadoop spark合并小文件的更多相关文章

  1. Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)

    不多说,直接上代码.  代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...

  2. 关于hadoop处理大量小文件情况的解决方法

    小文件是指那些size比HDFS的block size(默认64m)小的多的文件.任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个obje ...

  3. HDFS 07 - HDFS 性能调优之 合并小文件

    目录 1 - 为什么要合并小文件 2 - 合并本地的小文件,上传到 HDFS 3 - 合并 HDFS 的小文件,下载到本地 4 - 通过 Java API 实现文件合并和上传 版权声明 1 - 为什么 ...

  4. [转载]mapreduce合并小文件成sequencefile

    mapreduce合并小文件成sequencefile http://blog.csdn.net/xiao_jun_0820/article/details/42747537

  5. Hive 利用 on tez 引擎 合并小文件

    Hive 利用 on tez 引擎 合并小文件 标签(空格分隔): Hive \[f(N) + \sum_{i=2}^N f(N-i+1)*X_i\] SET hive.exec.dynamic.pa ...

  6. hadoop 使用map合并小文件到SequenceFile

    上一例是直接用SequenceFile的createWriter来实现,本例采用mapreduce的方式. 1.把小文件整体读入需要自定义InputFormat格式,自定义InputFormat格式需 ...

  7. Hadoop合并小文件的几种方法

    1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支 ...

  8. Spark SQL 小文件问题处理

    在生产中,无论是通过SQL语句或者Scala/Java等代码的方式使用Spark SQL处理数据,在Spark SQL写数据时,往往会遇到生成的小文件过多的问题,而管理这些大量的小文件,是一件非常头疼 ...

  9. Hadoop处理大量小文件的问题和解决方法

    小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.如果在HDFS中存储小文件,那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop了).而HDFS ...

随机推荐

  1. golang --for语句

    一条for 语句可以携带一条for子句. for子句可以包含初始化子句.条件子句.后置子句. package main import ( "fmt" ) func main() { ...

  2. 获取html 中的内容 将前台的数据获取到后台 用 jquery 生成一个 form表单 提交数据

    使用js创建一个form表单 ,使用post上传到后台中 下面是代码.在获取html内容的时候使用了js节点来获取内容. parent:父节点.上一级的节点 siblings:兄弟节点.同一级别的节点 ...

  3. 解决 win10 家庭版环境下 MySQL 的ODBC驱动下载及安装

    目录 写在前面 下载安装 1.首先,我们需要去官网下载ODBC驱动. 配置 1.打开控制面板.查看方式:选择大图标. 2.选择管理工具的ODBC 数据源(64 位). 3.在驱动程序目录下.我们可以看 ...

  4. 在HTML网页中嵌入脚本的方式

    在HTML标记的事件属性中直接添加脚本 <!doctype html> <html> <head> <meta charset="utf-8&quo ...

  5. Linux下mongoDB下载与安装

    原文连接:(http://www.studyshare.cn/blog/details/1168/0)一.下载 官网下载:点击下载 选择合适的版本 百度网盘下载:点击下载  提取码:rm12 此处提供 ...

  6. Mycat分布式数据库架构解决方案--Mycat实现数据库分表

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 准备工 ...

  7. statsvn使用小记

    准备工作 1.安装TortoiseSVN,在安装时需要安装svn命令行工具: 2.拉取svn代码: svn co https://svn.myserver.cn/svn/myproject1\trun ...

  8. pyspider最佳实践

    pyspider是好东西,非常稳定,很久很久以前架了一个,心冷了一段时间,但人家尽忠职守地持续运行,一直在抓取东西. 结合chrome,抓取代码简直不要太好写,没想到,最头大的,还是它的调度.明明感觉 ...

  9. 【转载】Windows系统电脑如何更换盘符号

    在笔记本电脑或者办公电脑的使用过程中,有时候需要更换盘符号,例如在重装系统后,硬盘相应的分区盘符号可能会发生错乱变化,此时如果想更换回重装系统之前的盘符号,可以通过计算机管理里面的磁盘管理来实现更换盘 ...

  10. 金融finaunce财经

    金融 (经济学术语) 金融是货币资金融通的总称.主要指与货币流通和银行信用相关的各种活动.主要内容包括: 货币的发行.投放.流通和回笼:各种存款的吸收和提取:各项贷款的发放和收回:银行会计.出纳.转账 ...