我们有一个作业,它从一个包含大约30亿行的配置单元表中读取数据,并在一个已排序的嵌套表中插入数据。
源表和目标表中的文件都采用Parquet格式。
这项工作要花很长时间才能完成。三天后我们不得不停止工作。
我们最近迁移到了一个新的集群。旧的集群是5.12,最新的集群是6.3.1。在5.12集群中,此作业通常运行良好并在6小时内完成。但是,在新集群中花费的时间太长。
为了解决这个问题,我们尝试了以下方法results:-
拆下减速器上的盖。删除set hive.exec.reducers.max=200;
设置mapreduce.job.running.reduce.limit=100;
在源代码处合并文件以确保我们没有读取小文件。源表中的每个文件大小都增加到1g。
减少源表中的行数以减少Map程序正在读取的数据。
将最大拆分大小减少到64mb以增加Map器的数量。
插入新表。
插入未排序或未装箱的新表。
我们正在尝试运行的查询:-
set hive.exec.dynamic.partition=true;
set hive.exec.max.dynamic.partitions=100000;
set hive.exec.max.dynamic.partitions.pernode=100000;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.created.files=900000;
set mapreduce.input.fileinputformat.split.maxsize=64000000;
set mapreduce.job.running.reduce.limit=100;
set hive.enforce.bucketing=true;
set hive.enforce.sorting=true;
INSERT OVERWRITE TABLE dbname.features_archive_new PARTITION (feature, ingestmonth)
Select mpn,mfr,partnum,source,ingestdate,max(value) as value,feature,ingestmonth
from dbname.features_archive_tmp
where feature = 'price'
and ingestmonth like '20%'
group by mpn,mfr,partnum,source,ingestdate,feature,ingestmonth;
1条答案
按热度按时间kqqjbcuj1#
我们发现Cloudera6.3中的HiveVersion2.x正在使用矢量化,而旧的Cloudera5.12中的Hive1.x没有使用矢量化。
所以设置下面的属性为我们解决了这个问题。我对此没有任何解释。矢量化应该加快查询速度,而不是使其变慢。
hive.vectorized.execution.enabled=false;