首页 > 数据库 >hive on spark 优化-SQL层面

hive on spark 优化-SQL层面

时间:2024-05-04 16:55:36浏览次数:15  
标签:set Join -- Reduce hive 并行度 SQL spark

Hive On Spark 调优

本篇博客将从hive on spark的SQL层面,来对任务做一些优化。下面的优化,从这几个方面来讲:Group、Join、并行度、小文件。

Group、Join

$\color{ForestGreen}{小提示:}$

Group和Join的不同之处在于:

  • Group 需要Reduce
  • Join 可以没有Reduce

其实无论是 Group还是Join,它们均有一些通用的解决方案:

  • 我们在map阶段下手。提前进行聚合。这样就会减少Shuffle。

    这里面两者较为不同的是实现方式。

    因为$\color{ForestGreen}{Group}$是一张表。所以就只是在map阶段进行预聚合。

    但$\color{ForestGreen}{Join}$是两张表。所以它想做到预聚合,这就需要缓存一张表。

  • 在reduce阶段做文章。再开一个MR任务。也就是二次聚合。

    只不过,这两者的实现方式,也是较为不同。

    $\color{ForestGreen}{Group}$是在map阶段添加随机数。然后在第一个Reduce中,聚合一部分。然后去掉随机数。再进行最后的聚合。

    $\color{ForestGreen}{Join}$是在map和第一个Reduce里面不做任何修改。只是将Reduce中那些Key特别多的。单独再开一个任务,执行Map Join。

这样对于Group的优化就讲完了。
对于Join 还有一些优化:

SMB Join:要求分桶有序,并且两张表的桶数是倍数关系。

并行度

一般Map阶段的并行度我们通常不需要管他。我们主要关注的是Reduce阶段的并行度。

Reduce并行度相关的参数:

--指定Reduce端并行度,默认值为-1,表示用户未指定
set mapreduce.job.reduces;
--Reduce端并行度最大值
set hive.exec.reducers.max;
--单个Reduce Task计算的数据量,用于估算Reduce并行度
set hive.exec.reducers.bytes.per.reducer;

但是我们一般都不会手动指定。都是自动指定。

但是现在的自动指定也有一些问题:只能统计表级别的信息,所以对于进入Reduce端的数据量,它统计的并不准确。

需要开启以下参数:

--执行DML语句时,收集表级别的统计信息
set hive.stats.autogather=true;
--执行DML语句时,收集字段级别的统计信息
set hive.stats.column.autogather=true;
--计算Reduce并行度时,从上游Operator统计信息获得输入数据量
set hive.spark.use.op.stats=true;
--计算Reduce并行度时,使用列级别的统计信息估算输入数据量
set hive.stats.fetch.column.stats=true;

小文件

小文件又可以分为Map端和Reduce端的小文件处理方式:

  • Map端:对小文件进行合并。

    --可将多个小文件切片,合并为一个切片,进而由一个map任务处理
    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    
  • Reduce端:将输出的小文件,合并成大文件。

    --开启合并Hive on Spark任务输出的小文件
      set hive.merge.sparkfiles=true;
    

标签:set,Join,--,Reduce,hive,并行度,SQL,spark
From: https://www.cnblogs.com/lhk20213937/p/18172390

相关文章

  • 复杂sql优化一例
    sqlinsertintoregister_book_tmp(org_code,org_name,project_number,project_name,product_num,product_name,detail_option,market_yn,asset_number,asset_name,......
  • 如何选择配置 MySQL innodb_log_file_size
    配置InnoDB的redo空间大小是写密集型工作负载最重要的配置选项之一。不过,这需要权衡利弊。配置的redo空间越大,InnoDB就能更好地优化写IO。不过,增加redo空间也意味着在系统断电或因其他原因崩溃时需要更长的恢复时间。 对于特定的innodb_log_file_size值,要预测系统......
  • 构建包含mysql和redis服务的docker镜像
    直接上dockerfile代码1FROMcentos:centos7.9.20092RUNyuminstall-ywget&&\3wgethttps://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm&&\4yum-ylocalinstallmysql80-community-release-el7-11.noarch.rpm......
  • MySQL 数据库自增主键生成的优缺点
    MySQL数据库中使用自增主键(AUTO_INCREMENT)作为表的主键有以下显著的优点和缺点:**优点**:1.**简化开发**:开发人员不需要手动指定每条记录的唯一标识,减少了出错的可能性。2.**性能优化**:自增主键通常会导致数据在物理存储上近乎顺序地排列,这能够提升基于主键的查询效率,特别......
  • mysql 锁,和加锁机制
    背景间隙锁是MySQL在RR可重复读隔离级别下用来修复幻读才引入的一种锁,间隙锁也只有在RR可重复读隔离级别下才会存在,如果是在RC读已提交隔离级别下,是没有间隙锁的存在的。另外,我们也知道,幻读这种现象也只有在当前读的时候才会发生,在一致性快照读的情况下是没有幻读现象的。那么间......
  • C# 搭建一个 基于ISqlSugarClient 三层架构框架 涉及数据库仓储 然后中间又有业务逻辑
    要在C#中搭建基于ISqlSugarClient的三层架构框架,你需要定义数据访问层(DAL)、业务逻辑层(BLL)和表现层(UI)。下面是一个完整的例子,涉及数据库仓储、业务逻辑层,以及依赖注入。这个例子基于ASP.NETCoreMVC构建,使用ISqlSugarClient来处理数据访问。这个例子中,我们将使用User作为一个简单......
  • SQL注入-基于Pikachu的学习
    zhSQL注入SQL数据库的基本语句SQL教程|菜鸟教程(runoob.com)史上最全SQL基础知识总结(理论+举例)-CSDN博客SQL注入原理SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分......
  • MySQL 8.4 初探
    MySQL8.4现已正式发布,这是一个具有重大意义的版本,因为它被指定为长期支持(LTS)版本。LTS软件的引入意味着MySQL8.0.34+将成为一个仅修复错误的版本。创新版本可能每季度发布一次,新的长期支持版本大约每两年发布一次。8.4版本将持续到2026年初。但请记住,将它们纳入主流长期......
  • MySQL-08.索引的创建和设计原则
    C-08.索引的创建和设计原则1.索引的声明和使用1.1索引的分类MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。从功能逻辑上分类,索引主要有4种,分别是普通索引,唯一索引,主键索引,全文索引。按照物理实现方式,索引可以分为2种,聚簇索引和非聚簇......
  • MySQL分页查询优化
    CREATETABLEteacher( `id`BIGINT(20)NOTNULLAUTO_INCREMENTPRIMARYKEY,`teacher_id`CHAR(30)NOTNULLUNIQUEKEY, `name`VARCHAR(30)NOTNULL)ENGINE=INNODB;insertintoteacher(teacher_id,name)values('aaa','aaa');inserti......