场景:写入大量分区
1.内存优化
列式存储的文件在写入文件之前都会将一定数量的数据缓存在内存中,由于hive每个动态分区目录都会打开一个文件写入器(file writer),所以当存在很多分区的时候,有可能会导致mapper OOM,所以需要增加内存。或者限制每次任务的分区数。另外缓冲区(file buffer)的大小最好跟block一样大,set parquetbuffer/orcbuffer size=blocksize
2.【重点】开启hive.optimize.sort.dynamic.partition
通过explain 发现 动态分区跟sqoop一样 一般是没有reduce的, 每个partition每个map会打开一个filewriter,所以可以强制开启reduce,这样,通过shuffle我们可以为 reducer 中的每个分区保持一个filewriter,从而减少 map内存压力。注意:在hive4.0以后会删除并被替换为 hive.optimize.sort.dynamic.partition.threshold
俄乌大战之际来一张生动的图片
3. distribute by
每个分区的数据量不大的时候可以使用