hive调优之参数设置

一、使用spark引擎

0、Hive on Spark

https://www.cnblogs.com/lq0310/p/9855245.html

1、spark资源申请

set spark.yarn.jar=hdfs://ip:port/spark/sparkJarForHive/*.jar
set hive.execution.engine=spark;
set spark.home=/etc/sparkForHive
set spark.master=yarn
set spark.app.name=测试

set spark.executor.instances=40;
set spark.executor.memory=30g;
set spark.executor.memoryOverhead=5g;
set spark.executor.cores=4;
set spark.default.parallelism=300;
set spark.sql.shuffle.partitions=300;
set spark.driver.memory=12g;
set spark.driver.memoryOverhead=1g;
set hive.spark.client.server.connect.timeout=300000;

1、集群资源,33节点,2.5TB内存
2、需求申请500G左右内存
3、申请 cores=4 ,一般core申请4-5个
4、申请的 executor = 集群节点数/cores数 = 33/4 = 8 ,这样每个 executor 的内存 = 需求内存大小/executor数 ,即每个executor 的内存有 500G/8=40G
5、executor.memoryOverhead 一般为每个executor的内存大小的12%-20% ,即 40G * 15% = 6G , 所以实际设置为5G
6、executor.memory = 40G - 6G = 33G ,所以实际设置为 30G
7、每个executor 可以运行 4 个任务,每个core 一个 task。那么每个task的平均内存是 35/4 = 9G , X=500G。如果 X > 50G ,driver内存申请12G;如果 50G>X > 12G ,driver内存申请4G;如果 12G>X > 1G ,driver内存申请1G;如果 1G>X ,driver内存申请256MB。
8、根据 第7点,我们实际申请 driver.memory=12G,memoryOverhead = memory*15% ,实际申请 driver.memoryOverhead= 1G

关于spark资源申请的个人总结:

  • 1)资源申请一定是越多越好,资源越多任务跑得越快,此时限制任务速度的是资源分配方式、硬件等方面。
  • 2)资源不足的情况下,根据团队规定,单个任务资源申请不超过总资源的15%。
  • 3)普通任务(10分钟内跑完)可申请总资源的5%。如总内存2.5T,总核900,一般每个节点申请3~5核,所以申请 cores=4,那么 instances=9005%/4=11,executor.memory=25005%/11=11G。
  • 4)每个任务的虚拟核数和内存大小比例应根据任务实际运行情况而定,有些任务并不需要太多的核,如一些stage中大部分时间只有一个节点的核在工作。
  • **5)根据观察任务所使用的最大内存调整内存和核心数比,一是为了防止发生内存溢出,二是数据如果shuffle发生了落盘,运行效率会降低。

2、spark参数简介

总虚拟核数=instances数*executor.cores
总内存大小=instances数*(executor.memory+executor.memoryOverhead)+(driver.memory+driver.memoryOverhead)
memoryOverhead堆外内存,设置为memory的10%~20%,可以不用设置,spark有动态占用机制。

--表示启用多少个executor,表示启用多少个节点跑任务。
set spark.executor.instances=40;

--每个executor的内存
set spark.executor.memory=30g;

--每个executor的cores数量,表示每个executor并行执行的task数。
set spark.executor.cores=4;

--spark堆外内存
set spark.executor.memoryOverhead=5g;

--spark内存管理机制:spark中的统一内存,2.x版本默认为0.6,表示占用的executor内存的60%。
--统一内存中包含 存储内存 和 计算内存。除统一内存外,其他内存占40%,用于存储元数据。
set spark.memory.fraction=0.6;

--spark存储内存,默认占统一内存的50%。其余50%为计算内存。
set spark.storage.storageFraction=0.5;

--shuffle进行聚合时,占用executor的20%的内存去执行,超出内存大小的数据量会进行落盘,导致性能降低。
spark.shuffle.memoryFraction=0.2;

3、hive常用调优参数

--开启小文件合并
hive.merge.sparkfiles=true;
hive.merge.rcfile.block.level=true;

--上述设置为文件预合并大小为256MB
hive.merge.size.per.task=256000000;

--作业输出文件小于上述设置160MB时,会合并为更大的文件(mapfiles为true,对于map reduce作业,如果为hive.merge.mapredfiles为true。)
hive.merge.smallfiles.avgsize=16000000;

--是否自动转换成mapjoin。转换前会有reduce,中间结果会进行落盘;转换后没有了reduce阶段,map直接输出join结果,此时又多少maptask就产生多少个文件
hive.auto.convert.join=true;

--大表小表的阀值设置(默认25M一下认为是小表),一旦开启map端join配置,Hive会自动检查小表是否大于此参数配置的大小,如果大于则转为普通的join,如果小于则转为map端join。
hive.mapjoin.smalltable.filesize=25000000;

--是否将多个mapjoin合并成1个
hive.auto.convert.join.noconditionaltask=true;

--多个mapjoin合并成1个时,所有小表的文件大小综合的最大值(1G)
hive.auto.convert.join.noconditionaltask.size=1000000000;

--开启hive中间文件压缩
hive.exec.compress.intermediate=true;
hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
hive.intermediate.compression.type=BLOCK;

--hive的默认查询执行引擎一次处理一行,而矢量化查询执行是一种hive特性,目的是按照每批1024行读取数据,并且一次性对整个记录整合(而不是对单条记录)应用操作,注意:要使用矢量化查询执行,就必须以ORC格式存储数据。
hive.vectorized.execution.enabled=true;

--谓词下推,默认为:false。
hive.optimize.ppd=true;

--列裁剪,默认为false。如(select * from table)作为子查询,会把全部的字段查询出来,启用该参数,hive值查询需要使用到的列。(hive2.x版本中启用时会有问题,所以在sql开发中应尽量手动裁剪列)
hive.optimize.cp=true;

--矢量化读取数据,数据的存储格式需要是orc格式,开启此参数后,在spark引擎中的读数表现为,至少提升一倍以上的读书效率
hive.vectorized.execution.enabled=true;
hive.vectorized.execution.reduce.enabled=false;

Spark开启动态资源设置
set spark.dynamicAllocation.enabled=true; --开启动态调度资源,Spark会根据任务工作的负载情况,进行动态调整应用程序的资源占用
set spark.dynamicAllocation.shuffleTracking.enabled=true; --启用shuffle文件跟踪,此配置不会回收保存了shuffle数据的executor
set spark.dynamicAllocation.shuffleTracking.timeout=30s; --即使executor上存在shuffle数据,也会被回收。
set spark.dynamicAllocation.maxExecutors=15; --最大申请executor数
set spark.dynamicAllocation.minExecutors=1; --最小保留executor数
set spark.dynamicAllocation.executorIdleTimeout=30s; --executor空闲超过30s则释放
set spark.dynamicAllocation.cachedExecutorIdleTimeout=30s; --缓存数据块的executor已经空闲了超过这个时间,executor将被释放
set spark.shuffle.service.enabled=true; --executor将被释放后,数据存在shuffle service中

posted @ 2023-01-05 15:50  落花桂  阅读(484)  评论(0编辑  收藏  举报
返回顶端
Live2D