分享

spark-sql 小文件问题

JME 发表于 2015-4-7 00:41:50 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 12 105663
我在使用spark-sql 的 时候,有个问题一直困扰我.spark-sql 为什么不能像hive一样,自定义永久函数.而是需要每次都加载本地的udf jar包.还有执行spark-sql的时候产生了大量的小文件,如何执行结果合并一个文件,如,hive每次执行完,可以合并小文件.求大神指点.

已有(12)人评论

跳转到指定楼层
arsenduan 发表于 2015-4-7 07:23:50
合并多个小文件作为查询结果:如果查询结果包括很多的小文件,hive可以合并这些小文件为大文件避免HDFS元数据容量溢出。sparkSQL目前还没有发现这个特性
回复

使用道具 举报

JME 发表于 2015-4-7 09:33:56
arsenduan 发表于 2015-4-7 07:23
合并多个小文件作为查询结果:如果查询结果包括很多的小文件,hive可以合并这些小文件为大文件避免HDFS元数 ...

那不是说spark-sql 基本就废了,因为 计算结果大量出现小文件.

回复

使用道具 举报

arsenduan 发表于 2015-4-7 10:51:32
JME 发表于 2015-4-7 09:33
那不是说spark-sql 基本就废了,因为 计算结果大量出现小文件.

新版本可能会解决这方面的问题
回复

使用道具 举报

oufuji 发表于 2015-12-18 10:43:38
我用spark-sql执行从hive表里面查询结果生成新表,31tasks后,新表目录下31个小文件。确实挺郁闷的。
回复

使用道具 举报

bingyuac 发表于 2016-9-23 19:38:04
大神们,怎么解决呀?spark-sql每次生成200个文件
回复

使用道具 举报

einhep 发表于 2016-9-23 20:10:55
bingyuac 发表于 2016-9-23 19:38
大神们,怎么解决呀?spark-sql每次生成200个文件

hive不是可以结合spark的吗?
如果spark不行,可以尝试换用hive跑在spark上试试
回复

使用道具 举报

bingyuac 发表于 2016-9-25 17:19:57
einhep 发表于 2016-9-23 20:10
hive不是可以结合spark的吗?
如果spark不行,可以尝试换用hive跑在spark上试试

我用的就是spark-sql操作hive的表。但是每次spark-sql的执行结果都是200个文件(特别小的文件)
回复

使用道具 举报

yuwenge 发表于 2016-11-13 17:33:15
bingyuac 发表于 2016-9-25 17:19
我用的就是spark-sql操作hive的表。但是每次spark-sql的执行结果都是200个文件(特别小的文件)

因为多线程并行往hdfs写造成的(因为每个DataFrame/RDD分成若干个Partition,这些partition可以被并行处理)。

其结果就是一个存下来的文件,其实是hdfs中一个目录,在这个目录下才是众多partition对应的文件,最坏的情况是出现好多size为0的文件。

如果确实想避免小文件,可以在save之前把DaraFrame的partition设为0: (当然,这必然影响程序效率)
1. 如果是Spark 1.3.x,  可以调用函数如下:

    【DataFrame2】=【DataFrame1】.repartition(1);

    【DataFrame2】.save(path);

2. 如果是Spark 1.4.0, 可以调用如下函数:

    【DataFrame2】=【DataFrame1】.coalecse(1, false)

回复

使用道具 举报

玉溪 发表于 2016-11-14 14:24:52
这个问题是硬伤哦,不知道2.0里解决没有?谁用2.0了 说下呗
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条