在做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表后小文件数量多,如何合并?的更多相关文章

  1. [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 ...

  2. spark相关介绍-提取hive表(一)

    本文环境说明 centos服务器 jupyter的scala核spylon-kernel spark-2.4.0 scala-2.11.12 hadoop-2.6.0 本文主要内容 spark读取hi ...

  3. 【原创】大叔经验分享(65)spark读取不到hive表

    spark 2.4.3 spark读取hive表,步骤: 1)hive-site.xml hive-site.xml放到$SPARK_HOME/conf下 2)enableHiveSupport Sp ...

  4. Hive merge(小文件合并)

    当Hive的输入由非常多个小文件组成时.假设不涉及文件合并的话.那么每一个小文件都会启动一个map task. 假设文件过小.以至于map任务启动和初始化的时间大于逻辑处理的时间,会造成资源浪费.甚至 ...

  5. hive优化之小文件合并

    文件数目过多,会给HDFS带来压力,并且会影响处理效率,可以通过合并Map和Reduce的结果文件来消除这样的影响: set hive.merge.mapfiles = true ##在 map on ...

  6. HIVE SQL产生的文件数量及参数调优

    产生背景:sqoop抽取oracle数据到hive表时,只能写入到固定分区(--hive-partition-key #hive分区字段 --hive-partition-value #hive分区值 ...

  7. Spark SQL解析查询parquet格式Hive表获取分区字段和查询条件

    首先说一下,这里解决的问题应用场景: sparksql处理Hive表数据时,判断加载的是否是分区表,以及分区表的字段有哪些?再进一步限制查询分区表必须指定分区? 这里涉及到两种情况:select SQ ...

  8. Hive如何处理小文件问题?

    一.小文件是如何产生的 1.动态分区插入数据,产生大量的小文件,从而导致map数量剧增. 2.reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的). 3.数据源本身就包含大量的小 ...

  9. 数仓面试高频考点--解决hive小文件过多问题

    本文首发于公众号:五分钟学大数据 小文件产生原因 hive 中的小文件肯定是向 hive 表中导入数据时产生,所以先看下向 hive 中导入数据的几种方式 直接向表中插入数据 insert into ...

随机推荐

  1. 解决python本地离线安装requests问题

    使用python36进行本地requests安装的时候,由于安装requests需要联网,导致安装失败,现象如下: 一开始以为,需要安装什么证书,其实只是需要一个python的证书库,(⊙﹏⊙)b 执 ...

  2. MSF添加ms17-010的exp脚本及攻击复现

    原文地址:https://bbs.ichunqiu.com/thread-23115-1-1.html 本来今晚在准备复现最近的CVE-2017-11882,由于本人是小白一枚,不知道这么添加msf的 ...

  3. 分享基于Qt5开发的一款故障波形模拟软件

    背景介绍 这是一款采用Qt5编写的用于生成故障模拟波形的软件.生成的波形数据用于下发到终端机器生成对应的故障类型,用于培训相关设备维护人员的故障排查技能.因此,在这款软件中实现了故障方案管理.故障波形 ...

  4. AngularJs踩过的坑

    1. 使用checkbox和radio时, 不能使用ng-model直接绑定原始对象, 需要绑定一个对象的某个子属性, 才能把值绑定到scope <label><input type ...

  5. 简单爬虫 -- 以爬取NASA AOD数据(TIFF文件)为例

    目录: 网站分析 爬取下载链接 爬取TIFF图片 1.网站分析 主页面:https://neo.sci.gsfc.nasa.gov/view.php?datasetId=MYDAL2_M_AER_OD ...

  6. vue/axios请求拦截

    import axios from 'axios';import { Message } from 'element-ui';import Cookies from 'js-cookie';impor ...

  7. java基础(5)----面向对象

    编程思想: 简单的说一下,我们学习编程,最重要的就是要有编程思想,而编程思想无非就是面向过程和面向对象,以下谈谈我对编程思想的理解. 面向过程: 从过程入手,第一步,第二步--.借助过程与过程的配合, ...

  8. js中非死循环引起的栈调用溢出问题

    一般情况下,仅从代码上看只要不出现死循环,是不会出现堆栈调用溢出的.但是某些情况下列外,比如下面这段代码: var a = 99; function b (){ a --; if (a > 0) ...

  9. NetFPGA-1G-CML Demo --- reference_router_nf1_cml

    环境 deepin 15.4 vivado 15.2 ise 14.6 前期准备 Github Wiki链接:https://github.com/NetFPGA/NetFPGA-public/wik ...

  10. 限定 edittext 的 输入内容

    <EditText                 android:id="@+id/idNumber"                 style="@style ...