sparksql/hive小文件问题 [数据库教程]

database

针对hive on mapreduce

1:我们可以通过一些配置项来使Hive在执行结束后对结果文件进行合并:

参数详细内容可参考官网:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

1

2

3

4

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

例如:

set hive.merge.mapfiles = true:在只有map的作业结束时合并小文件,

set hive.merge.mapredfiles = true:在Map-Reduce的任务结束时合并小文件,默认为False;

set hive.merge.size.per.task = 256000000; 合并后每个文件的大小,默认256000000

set hive.merge.smallfiles.avgsize=256000000; 当输出文件的平均大小小于该值时并且(mapfiles和mapredfiles为true)

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

 

1

2

3

4

5

6

7

8

9

10

11

12

13

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执行insert overwrite操作时,仅加了set spark.sql.hive.mergeFiles=true; 也可以有效阻止小文件的产生,可能是因为我的数据量本身就比较大

参考:

https://www.cnblogs.com/zz-ksw/p/11293891.html

https://blog.csdn.net/a2011480169/article/details/100401858

spark sql/hive小文件问题

以上是 sparksql/hive小文件问题 [数据库教程] 的全部内容, 来源链接: utcz.com/z/535032.html

回到顶部