hadoop spark合并小文件
一.输入文件类型设置为 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合并小文件的更多相关文章
- Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)
不多说,直接上代码. 代码 package zhouls.bigdata.myWholeHadoop.HDFS.hdfs7; import java.io.IOException;import ja ...
- 关于hadoop处理大量小文件情况的解决方法
小文件是指那些size比HDFS的block size(默认64m)小的多的文件.任何一个文件,目录和bolck,在HDFS中都会被表示为一个object存储在namenode的内存中,每一个obje ...
- HDFS 07 - HDFS 性能调优之 合并小文件
目录 1 - 为什么要合并小文件 2 - 合并本地的小文件,上传到 HDFS 3 - 合并 HDFS 的小文件,下载到本地 4 - 通过 Java API 实现文件合并和上传 版权声明 1 - 为什么 ...
- [转载]mapreduce合并小文件成sequencefile
mapreduce合并小文件成sequencefile http://blog.csdn.net/xiao_jun_0820/article/details/42747537
- Hive 利用 on tez 引擎 合并小文件
Hive 利用 on tez 引擎 合并小文件 标签(空格分隔): Hive \[f(N) + \sum_{i=2}^N f(N-i+1)*X_i\] SET hive.exec.dynamic.pa ...
- hadoop 使用map合并小文件到SequenceFile
上一例是直接用SequenceFile的createWriter来实现,本例采用mapreduce的方式. 1.把小文件整体读入需要自定义InputFormat格式,自定义InputFormat格式需 ...
- Hadoop合并小文件的几种方法
1.Hadoop HAR 将众多小文件打包成一个大文件进行存储,并且打包后原来的文件仍然可以通过Map-Reduce进行操作,打包后的文件由索引和存储两大部分组成: 缺点: 一旦创建就不能修改,也不支 ...
- Spark SQL 小文件问题处理
在生产中,无论是通过SQL语句或者Scala/Java等代码的方式使用Spark SQL处理数据,在Spark SQL写数据时,往往会遇到生成的小文件过多的问题,而管理这些大量的小文件,是一件非常头疼 ...
- Hadoop处理大量小文件的问题和解决方法
小文件指的是那些size比HDFS的block size(默认64M)小的多的文件.如果在HDFS中存储小文件,那么在HDFS中肯定会含有许许多多这样的小文件(不然就不会用hadoop了).而HDFS ...
随机推荐
- sql语句递归查询(start with)
在做项目中遇到一个问题,就是同一个表中的数据存在级联关系,但是只要查出来的末级数据,纠结了好久,好不容易找到了一个博主的分享,在这里做个记录,也是和大家一起分享学习一下这位大神的技术,共勉 写代码时碰 ...
- python 知识回顾
第一章:搭建编程环境1.在Windows系统中搭建Python编程环境. 1.1 安装Python 访问http://python.org/downloads/ ,点击下载到本地,后安装. 1.2安装 ...
- tomcat宕机自动重启脚本
#!/bin/bash# 获取tomcat进程ID /usr/share/tomcatTomcatID=$(ps -ef |grep tomcat |grep -w 'tomcat'|grep -v ...
- 引入 ServletContextListener @Autowired null 解决办法
public class ScheduleController implements ServletContextListener { @Autowired private ScheduleServi ...
- Linux学习笔记之Linux文件系统详解
0x00 机械硬盘 机械磁盘由磁头(head).磁道(track).柱面(cylinder).扇区(sector)和盘片(platter)组成.其中,磁头悬浮在盘片上,并且每张盘片上下各有一个磁头:每 ...
- ASP.NET SignalR 系列(八)之跨域推送
前面几章讲的都是同域下的推送和订阅.这种讲讲如何跨域 对于SignalR来说,默认是不允许跨域的,因为安全问题.虽如此,但同时提供了跨域方案. 两种跨域方式: 1:JSONP2:CORS JSONP的 ...
- 千万不要用window自带文本编辑器编辑配置文件或者代码
1 引言 用windows自带的text文本在最前面会带入看不到的BOM,导致异常 2 代码 package main import ( "strings" "fmt&q ...
- elementUI一次请求上传多个文件
elementui <el-upload class="upload-demo" ac ...
- python可视化_matplotlib
对于Python数据可视化库,matplotlib 已经成为事实上的数据可视化方面最主要的库,此外还有很多其他库,例如vispy,bokeh, seaborn,pyga,folium 和 networ ...
- windows自动化-脚本案例
; Script Start - Add your code below here Run("D:\Navicat Premium\navicat.exe") Sleep(1000 ...