Spark:spark df插入hive表后小文件数量多,如何合并?
在做spark开发过程中,时不时的就有可能遇到租户的hive库目录下的文件个数超出了最大限制问题。
一般情况下通过hive的参数设置:
val conf = new SparkConf().setAppName("MySparkJob")
//.setMaster("local[1]").setMaster("spark://172.21.7.10:7077").setJars(List("xxx.jar")).set("spark.executor.memory", "10g")
val sc = new SparkContext(conf)
val hiveContext = new HiveContext(sc)
hiveContext.sql("use myhivedb")
// toDF() method need this line...
import hiveContext.implicits._
hiveContext.sql("set hive.mapred.supports.subdirectories=true")
hiveContext.sql("set mapreduce.input.fileinputformat.input.dir.recursive=true")
hiveContext.sql("set mapred.max.split.size=256000000")
hiveContext.sql("set mapred.min.split.size.per.node=128000000")
hiveContext.sql("set mapred.min.split.size.per.rack=128000000")
hiveContext.sql("set hive.hadoop.supports.splittable.combineinputformat=true")
hiveContext.sql("set hive.exec.compress.output=true")
hiveContext.sql("set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec")
hiveContext.sql("set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat")
hiveContext.sql("set hive.merge.mapfiles=true")
hiveContext.sql("set hive.merge.mapredfiles=true")
hiveContext.sql("set hive.merge.size.per.task=256000000")
hiveContext.sql("set hive.merge.smallfiles.avgsize=256000000")
hiveContext.sql("set hive.groupby.skewindata=true")
通过df.repartition(xxx).persist()来实现小文件合并
但是并不是所有的小文件都会合并的,例如:
val my_df = my_temp1_df.unionAll(my_temp2_df)
my_df.registerTempTable("temp_temphivetable")
hiveContext.sql("insert into temphivetable select * from temp_temphivetable")
// -rwxrwx---+ 3 jc_rc jc_rc_group 187.9 K 2017-06-28 17:58 /my tenant name/myhivedb/temphivetable/part-37944.gz
// -rwxrwx---+ 3 jc_rc jc_rc_group 188.9 K 2017-06-28 17:56 /my tenant name/myhivedb/temphivetable/part-37945.gz
当设置:repartition(1000)时
// 当设置:repartition(1000)时,
// -rwxrwx---+ 3 jc_rc jc_rc_group 10.9 M 2017-07-01 16:31 /my tenant name/myhivedb/temphivetable/part-00998.gz
// -rwxrwx---+ 3 jc_rc jc_rc_group 10.9 M 2017-07-01 16:31 /my tenant name/myhivedb/temphivetable/part-00999.gz
val my_df = my_temp1_df.unionAll(my_temp2_df).repartition(1000).persist()
my_df.registerTempTable("temp_temphivetable")
hiveContext.sql("insert into temphivetable select * from temp_temphivetable")
当设置:repartition(100)时
// 当设置:repartition(100)时,
// -rwxrwx---+ 3 jc_rc jc_rc_group 103.0 M 2017-07-01 17:53 /my tenant name/myhivedb/temphivetable/part-00098.gz
// -rwxrwx---+ 3 jc_rc jc_rc_group 103.2 M 2017-07-01 17:53 /my tenant name/myhivedb/temphivetable/part-00099.gz
val my_df = my_temp1_df.unionAll(my_temp2_df).repartition(1000).persist()
my_df.registerTempTable("temp_temphivetable")
hiveContext.sql("insert into temphivetable select * from temp_temphivetable")
hivesql下采用snappy方式压缩并且合并:
set hive.exec.reducers.bytes.per.reducer=500000000;
set hive.mapred.supports.subdirectories=true;
set mapreduce.input.fileinputformat.input.dir.recursive=true;
set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=128000000;
set mapred.min.split.size.per.rack=128000000;
set hive.hadoop.supports.splittable.combineinputformat=true;
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set hive.merge.mapfiles=true;
set hive.merge.mapredfiles=true;
set hive.merge.size.per.task=256000000;
set hive.merge.smallfiles.avgsize=256000000;
set hive.groupby.skewindata=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.parallel=true;
set hive.exec.parallel.thread.number=32;
SET hive.exec.compress.output=true;
SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
SET mapred.output.compression.type=BLOCK;
set hive.exec.compress.intermediate=true;
set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
set hive.intermediate.compression.type=BLOCK;
使用代码进行重新分区让其合并再写入:
val aDF =hiveContext.table("info_user").repartition(2).persist()
aDF.registerTempTable("info_user")
这里也可以是从是hive sql 中转到另外一张表,让后再写入到目标表的方式。
Spark:spark df插入hive表后小文件数量多,如何合并?的更多相关文章
- [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子
[Spark][Hive][Python][SQL]Spark 读取Hive表的小例子$ cat customers.txt 1 Ali us 2 Bsb ca 3 Carls mx $ hive h ...
- spark相关介绍-提取hive表(一)
本文环境说明 centos服务器 jupyter的scala核spylon-kernel spark-2.4.0 scala-2.11.12 hadoop-2.6.0 本文主要内容 spark读取hi ...
- 【原创】大叔经验分享(65)spark读取不到hive表
spark 2.4.3 spark读取hive表,步骤: 1)hive-site.xml hive-site.xml放到$SPARK_HOME/conf下 2)enableHiveSupport Sp ...
- Hive merge(小文件合并)
当Hive的输入由非常多个小文件组成时.假设不涉及文件合并的话.那么每一个小文件都会启动一个map task. 假设文件过小.以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费.甚至 ...
- hive优化之小文件合并
文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...
- HIVE SQL产生的文件数量及参数调优
产生背景:sqoop抽取oracle数据到hive表时,只能写入到固定分区(--hive-partition-key #hive分区字段 --hive-partition-value #hive分区值 ...
- Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件
首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...
- Hive如何处理小文件问题?
一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...
- 数仓面试高频考点--解决hive小文件过多问题
本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...
随机推荐
- Problems at works
1.ssh无法连接服务器:因部署ftp服务,误将/var目录的所有者和所属组改成了ftp,以致于SSH无法二次连接: 2.集群服务器的hadoop的datanode节点死亡,在对应节点拉起即可.若无法 ...
- 记录一则enq: TX - row lock contention的分析过程
故障描述:与客户沟通,初步确认故障范围大概是在上午的8:30-10:30之间,反应故障现象是Tomcat的连接数满导致应用无法连接,数据库alert中无明显报错,需要协助排查原因. 1.导入包含故障时 ...
- Linux 绝对路径与相对路径
根据文件名写法的不同,可将所谓的路径(path)定义为绝对路径(absolute)和相对路径(relative). 绝对路径:由根目录(/)开始写起的文件名或目录名称. 相对路径:相对于当前路径的文件 ...
- redis-cli的一些有趣也很有用的功能
redis-cli我们最常用的两个参数就是-h.-p.-a选项,分配用来指定连接的redis-server的host和port. 通过redis-cli –help发现,redis-cli还提供了其他 ...
- 【Bootstrap】优秀小插件收集
Bootstrap中不乏很多优秀的小插件来让界面更加漂亮.比如之前做过笔记的bootstrap-fileinput,select2,datetimepicker等都是属于这一系列的.这些相对而言比较大 ...
- 【Python】 编码,en/decode函数以及print语句的一些探索
昨天晚上在整理hashlib和hmac模块的时候,又看到了编码这块的内容.越看越觉得之前的理解不对,然后想研究一下自己想出来,但是越陷越深..总之把昨晚+今天一个上午的这些自己想到的东西写下来 ● 几 ...
- 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
在Linux VPS下产生的私钥文件putty是不认识的,putty只认识自己的ppk格式,要在这两种格式之间转换,需要PuTTYgen这个程序. puttygen是putty的配套程序,putty的 ...
- shell死循环脚本示例
1.设计一个脚本,监控远程的一台机器(假设ip为192.168.0.28)的存活状态,当发现宕机时发一封邮件给你自己. 提示:1. 你可以使用ping命令 ping -c10 www.baidu. ...
- KS检验统计量的扩展应用(CMap)
KS检验统计量的扩展应用 KS(Kolmogorov-Smirnov)检验是比较两个经验分布之间是否存在差异. 我们设X1, X2,-, Xm, Y1, Y2,-, Ym为两个独立随机样本,分别满足假 ...
- python 特殊方法实例
import collections from random import choice card = collections.namedtuple('Card',['rank','suit']) # ...