hive hive.optimize.ppd=false导致map数量很大

在Hive 0.9.0版本中,设置hive.optimize.ppd=false会导致WHERE子句不被识别,并且会显著增加Map任务的数量。对比未设置此参数的情况,Map任务从90个激增到4363个,而Reducer任务则保持在999个。因此,在新版本的Hive中,建议使用默认的hive.optimize.ppd=true以确保查询优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive官方https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

Prior to Hive 0.6.0, lateral view did not support the predicate push-down optimization. In Hive 0.5.0 and earlier, if you used a WHERE clause your query may not have compiled. A workaround was to add set hive.optimize.ppd=false; before your query. The fix was made in Hive 0.6.0; see https://issues.apache.org/jira/browse/HIVE-1056: Predicate push down does not work with UDTF's.
在0.5.0版本前使用hive.optimize.ppd=false是能解决where条件不识别的。但我在使用0.9.0版本时使用了该参数,导致where不识别。
不使用参数日志:

Starting Job = job_201312261829_7430, Tracking URL = http://master:50030/jobdetails.jsp?jobid=job_201312261829_7430
Kill Command = /home/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill job_201312261829_7430
Hadoop job information for Stage-1: number of mappers: 90; number of reducers: 287

使用该参数日志:

Starting Job = job_201312261829_7433, Tracking URL = http://master:50030/jobdetails.jsp?jobid=job_201312261829_7433
Kill Command = /home/hadoop/hadoop-1.0.3/libexec/../bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill job_201312261829_7433
Hadoop job information for Stage-1: number of mappers: 4363; number of reducers: 999


所以在新版本的hive中使用hive.optimize.ppd=true;默认值即可
1.集群的CDH版本为6.3.2,内置spark引擎版本约为spark2.4.0,目前hive默认的查询引擎为mr,且可供查询时临时切换的引擎只有spark; 3.该集群有3台namenode、51台datanode节点,单台namenode配置:64C256G16T,单台datanode配置:64C512G96T; 4.在运行以上sql任务时,集群同时还运行其他任务,期间Yarn内存总使用率约为50%,Yarn内核总使用率约为60%。 5.hive sql脚本(已优化)如下: -- 基础优化 SET hive.optimize.ppd=true; SET hive.execution.engine=spark; SET spark.master=yarn; SET spark.submit.deployMode=cluster; -- 资源分配(根据集群调整) -- 动态分配方案 SET spark.dynamicAllocation.enabled=true; SET spark.dynamicAllocation.minExecutors=25; SET spark.dynamicAllocation.maxExecutors=70; SET spark.dynamicAllocation.executorIdleTimeout=60s; SET spark.dynamicAllocation.schedulerBacklogTimeout=30s; -- 资源分配设置 SET spark.executor.memory=16g; SET spark.executor.cores=8; SET spark.driver.memory=10g; SET spark.yarn.executor.memoryOverhead=6g; -- 堆外内存(关键防OOM),提升shuffle安全边际 -- 性能优化参数 SET spark.sql.adaptive.enabled=true; -- 启用AQE,自适应优化执行计划 SET spark.sql.adaptive.coalescePartitions.enabled=true; SET spark.sql.adaptive.advisoryPartitionSizeInBytes=256000000; -- 256MB SET spark.sql.adaptive.shuffle.targetPostShuffleInputSize=268435456; -- 256MB SET spark.speculation=true; SET spark.sql.parquet.enableVectorizedReader=true; -- 加速Parquet -- 倾斜优化 SET spark.sql.adaptive.skewedJoin.enabled=true; -- 倾斜处理 SET spark.sql.adaptive.skewedPartitionFactor=3; SET spark.sql.adaptive.skewedPartitionThresholdInBytes=256MB; SET spark.sql.aggregate.ignoreInvalidSalt=true; --启用谓词下推 SET spark.sql.parquet.filterPushdown=true; -- Shuffle优化 SET spark.sql.shuffle.partitions=1500; SET spark.shuffle.file.buffer.size=1mb; SET spark.shuffle.compress=true; SET spark.shuffle.spill.compress=true; -- 内存与GC优化 SET spark.memory.fraction=0.8; SET spark.memory.storageFraction=0.5; SET spark.executor.extraJavaOptions=" -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=35 -XX:ConcGCThreads=8 -XX:G1HeapRegionSize=32m -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=50"; -- Off-Heap内存优化 SET spark.memory.offHeap.enabled=true; SET spark.memory.offHeap.size=2g; -- 网络超时设置 SET spark.network.timeout=300s; SET spark.sql.broadcastTimeout=1800; -- 广播超时 -- 预计算日期参数(避免每行重复计算) SET hivevar:start_dt=regexp_replace(add_months('${etldate}',-3),'-',''); SET hivevar:end_dt=regexp_replace('${etldate}','-',''); SET hivevar:total_days=datediff('${etldate}',add_months('${etldate}',-3)); -- 创建新表 CREATE TABLE dws.B STORED AS PARQUET AS SELECT cust, SUM(nvl(bal, 0)) / ${total_days} AS avg_bal -- 使用预计算常量 FROM dwd.A WHERE dt <= '${end_dt}' AND dt > '${start_dt}' -- 直接使用预计算的分区值 AND cust IS NOT NULL AND cust <> '' AND ( -- 优化OR条件结构 (type_cd = 'D' AND stat_cd IN ('2','5','6')) OR (type_cd = 'W' AND stat_cd <> '4') OR (type_cd NOT IN ('D','W')) GROUP BY cust; 6.上述sql中表A分区字段为dt,格式为yyyyMMdd的字符串,表A为每日更新的全量数据,且数据量较大,单分区上亿,表A为parquet格式,参数etldate为跑批日期,格式为yyyy-MM-dd字符串; 对于以上hive sql脚本,假设表A数据不存在严重倾斜,但也不是十分均匀。现在我设置的运行参数如上所述,请为我详细分析: 以上参数设置是否合理? 参数间是否有冲突? 是否有多余的、可以省略设置的参数? 是否有遗漏未设置的参数? 以我的集群当前的运行情况和资源占用情况,以上参数对资源分配是否合理?
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值