sparksql运算调优纪事(一)——hive小文件处理

业务目的

全量离线运算统计,结果写入oracle

依赖版本

spark 2.0.1
hive 1.1.0

问题

  1. 执行时task数量过多
  2. hive动态分区小文件过多
  3. 测试环境5运算节点,内存分别为12G,运行30万测试数据不断发生内存溢出问题

逐步调优

1、执行时task数量过多,总数达到了108000个,OMG,每个任务都是内存溢出,因为是用sparksql读hive表,所以spark的spark.default.parallelism强制指定task数并没有用,考虑–conf spark.sql.shuffle.partitions=30,在查询hive on hbase外部表时有效,但遇到hive分区表无效,此外考虑通过spark中repartition来处理,但是sparksql原始查询还是会根据hive分区表的情况开启task,问题定位到hive分区表。

2、目前是将数据动态分区,执行insert overwrite,产生了大量小文件
hive小文件
如图可以看到小文件数量达到100个,而且大小都不到10K,这样一方面对于namenode来说维护成本过高,另一方面在对hive分区表全量数据进行运算清洗时,消耗巨大,导致task数极其不合理。

处理方式:

set mapred.max.split.size=256000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
set mapred.reduce.tasks=20;
set 
回答: 在SQL中,repartition是用来重新划分数据分区的操作。根据引用\[1\]中的解释,repartition根据传入的partitioning expressions将数据重新划分到指定数量的分区中。这个操作类似于Hive SQL中的"DISTRIBUTE BY"。repartition方法返回个新的Dataset,其中的数据是按照哈希分区进行划分的。另外,引用\[2\]中提到,repartition方法内部实际上用了coalesce方法,参数shuffle为true。而引用\[3\]中提到的另种动态划分的方法是使用Oracle的rownum。这种方法可以将总数为5000万条记录划分到N个分区中,只要N远远小于总数记录,划分的结果理论上是比较平均的。所以,在SQL中,repartition可以用来重新划分数据分区,以实现更好的数据分布和负载均衡。 #### 引用[.reference_title] - *1* *3* [sparksql运算纪事(三)——repartition数据倾斜处理](https://blog.csdn.net/fzuzhanghao1993/article/details/104377584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SparkSql中的repartition 与 coalesce](https://blog.csdn.net/u014527619/article/details/88734697)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值