针对hive on mapreduce
1:我们可以通过一些配置项来使Hive在执行结束后对结果文件进行合并:
参数详细内容可参考官网:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
hive.merge.mapfiles 在 map-only job后合并文件,默认true
hive.merge.mapredfiles 在map-reduce job后合并文件,默认false
hive.merge.size.per.task 合并后每个文件的大小,默认256000000
hive.merge.smallfiles.avgsize 平均文件大小,是决定是否执行合并操作的阈值,默认16000000
2:如果结果表使用了压缩格式,则必须配合Sequence File来存储,否则无法进行合并
3:Hadoop的归档文件格式也是解决小文件问题的方式之一。而且Hive提供了原生支持,如果使用的不是分区表,则可创建成外部表,并使用har://协议来指定路径
4:对于通常的应用,使用Hive结果合并就能达到很好的效果。如果不想因此增加运行时间,可以自行编写一些脚本,在系统空闲时对分区内的文件进行合并,也能达到目的。
5:Reducer数量的减少也即意味着结果文件的减少,从而解决产生小文件的问题。
 
但是,对于通过sparksql来处理数据的话,在conf里添加上面参数调整是没有作用的,不过可以通过下面的方式来规避小文件:
1.通过使用repartition重分区动态调整文件输出个数
  比如 spark.sql("sql").repartition(1).write().mode(SaveMode.Overwrite).saveAsTable("test");
2.使用Adaptive Execution动态设置shuffle partition
 
		SparkConf conf = new SparkConf();
		conf.set("spark.sql.adaptive.enabled", "true");
		conf.set("spark.sql.adaptive.shuffle.targetPostShuffleInputSize", "67108864b");
		conf.set("spark.sql.adaptive.join.enabled", "true");
		conf.set("spark.sql.autoBroadcastJoinThreshold", "20971520");

		SparkSession spark = SparkSession
				.builder()
				.appName("JointSitePlan")
				.master("local")
				.config(conf)
				.enableHiveSupport()
				.getOrCreate();

  shuffle partition是通过参数spark.sql.shuffle.partitions来指定的,默认是200,但是对于数据不大,或者数据倾斜的情况,会生成很多的小文件,几兆甚至几KB大小,自适应执行则会根据参数 spark.sql.adaptive.shuffle.targetPostShuffleInputSize 动态调整reducer数量,详细可见 上一篇文章

 

spark sql/hive小文件问题的更多相关文章

  1. Spark SQL Hive Support Demo

    前提: 1.spark1.0的包编译时指定支持hive:./make-distribution.sh --hadoop 2.3.0-cdh5.0.0 --with-yarn --with-hive - ...

  2. local模式运行spark-shell时报错 java.lang.IllegalArgumentException: Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':

    先前在local模式下,什么都不做修改直接运行./spark-shell 运行什么问题都没有,然后配置过在HADOOP yarn上运行,之后再在local模式下运行出现以下错误: java.lang. ...

  3. hive小文件合并设置参数

    Hive的后端存储是HDFS,它对大文件的处理是非常高效的,如果合理配置文件系统的块大小,NameNode可以支持很大的数据量.但是在数据仓库中,越是上层的表其汇总程度就越高,数据量也就越小.而且这些 ...

  4. Caused by: java.sql.SQLException: Failed to start database 'metastore_db' with class loader org.apache.spark.sql.hive.client.IsolatedClientLoader$$anon$1@d7c365, see the next exception for details.

    解决方法:https://stackoverflow.com/questions/37442910/spark-shell-startup-errors 异常: 18/01/29 19:04:27 W ...

  5. Spark SQL读parquet文件及保存

    import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{Row, SparkSession} im ...

  6. 小记---------spark组件与其他组件的比较 spark/mapreduce ;spark sql/hive ; spark streaming/storm

    Spark与Hadoop的对比   Scala是Spark的主要编程语言,但Spark还支持Java.Python.R作为编程语言 Hadoop的编程语言是Java    

  7. spark SQL读取ORC文件从Driver启动到开始执行Task(或stage)间隔时间太长(计算Partition时间太长)且产出orc单个文件中stripe个数太多问题解决方案

    1.背景: 控制上游文件个数每天7000个,每个文件大小小于256M,50亿条+,orc格式.查看每个文件的stripe个数,500个左右,查询命令:hdfs fsck viewfs://hadoop ...

  8. Spark SQL -- Hive

    使用Saprk SQL 操作Hive的数据 前提准备: 1.启动Hdfs,hive的数据存储在hdfs中; 2.启动hive -service metastore,元数据存储在远端,可以远程访问; 3 ...

  9. Hive小文件处理

    小文件是如何产生的: 动态分区插入数据的时候,会产生大量的小文件,从而导致map数量的暴增 数据源本身就包含有大量的小文件 reduce个数越多,生成的小文件也越多 小文件的危害: 从HIVE角度来看 ...

随机推荐

  1. MyBatis从入门到精通:第一章数据库创建文件

    /*创建数据库mybatis,并指定编码方式为utf8,字符比较规则为utf8_general_ci*/ CREATE DATABASE mybatis DEFAULT CHARACTER SET u ...

  2. ADO.NET_包括DataReader和dataSet的使用

    今天总结了一下ADO.NET编程中DataReader和dataSet两个比较重要的对象的使用,完成了combobox,listbox,以及fpSpread动态添加数据的测试,对使用sqlComman ...

  3. [原创]Flask+uwsgi+virtualenv+nginx部署配置

    1.创建工程python2.7版本虚目录: #virtualenv -p /usr/bin/python2.7 CDN_resource #cd CDN_resource #source ./bin/ ...

  4. [git] 基础命令笔记

    --内容整理自廖雪峰的GIT教程-- git status 查看当前工作区状态,显示未跟踪的文件以及未上传的修改记录 git init 使当前文件夹变成Git可以管理的仓库 git add xxx 将 ...

  5. 【原创】用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!

    前言 每个浏览器新版本发布,都号称性能有显著提升,并且市面有各种测试工具,测试结果也是大相径庭,比如下面这篇文章: https://www.oschina.net/news/97924/browser ...

  6. 从微信小程序开发者工具源码看实现原理(四)- - 自适应布局

    从前面从微信小程序开发者工具源码看实现原理(一)- - 小程序架构设计可以知道,小程序大部分是通过web技术进行渲染的,也就是最终通过浏览器的dom tree + cssom来生成渲染树:既然最终是通 ...

  7. 数据库---T-SQL语句:查询语句(二)

    >查询: 一.查询所有数据: select * from Info    ---查询所有数据(行) select Name from Info  ---查询特定列(Name列) select N ...

  8. 了解下Java中的Serializable

      在项目中也写了不少的JavaBean,也知道大多的JavaBean都实现了Serializable接口,也知道它的作用是序列化,序列化就是保存,反序列化就是读取.主要体现在这两方面: 1.存储.将 ...

  9. 【iOS】ERROR ITMS-90032: "Invalid Image Path...

    用 Application Loader 提交苹果审核时出现了这个问题,具体如下: ERROR ITMS-: "Invalid Image Path - No image found at ...

  10. web图形验证码逻辑

    逻辑:前端生成一个UUID以URL方式发送给后端,后端准备Redis数据库缓存数据,后端拿到UUID后,调用captcha.generate_captcha()生成图片和图片的标签,Redis数据库保 ...