首页 > 其他分享 >Hive优化

Hive优化

时间:2024-06-12 10:35:32浏览次数:24  
标签:planner join fracture hive Hive key 优化

  1. hive的随机抓取策略
    理论上来说,Hive中的所有sql都需要进行mapreduce,但是hive的抓取策略帮我们
    省略掉了这个过程,把切片split的过程提前帮我们做了。
    set hive.fetch.task.conversion=none;
    (一旦进行这么设置,select字段名也是需要进行mapreduce的过程,默认是more)

  2. 本地运行模式
    大多数的 Hadoop Job 是需要 Hadoop 提供的完整的可扩展性来处理大数据集的。不过,有时 Hive 的输入数据量是非常小的。在这种情况下,为查询触发执行任务消耗的时间可能会比实际 job 的执行时间要多的多。对于大多数这种情况, Hive 可以通过本地模式在单台机器上处理所有的任务。对于小数据集,执行时间可以明显被缩短。用户可以通过设置 hive.exec.mode.local.auto 的值为 true ,来让 Hive 在适当的时候自动启动这个优化。

  3. 并行计算
    通过设置以下参数开启并行模式(默认是false)
    set hive.exec.parallel=true;
    注意:hive.exec.parallel.thread.number
    (一次SQl计算中允许并行执行的job个数最大值,默认是8个)

  4. 严格模式
    1.什么是Hive的严格模式
    ​ hive中的一种模式,在该模式下禁止一些不好SQL的执行。
    2.Hive的严格模式不允许哪些SQL执行
    2.1 禁止分区表全表扫描
    分区表往往数据量大,如果不加分区查询会带来巨大的资源消耗 。例如以下分区表
    SELECT DISTINCT(planner_id) FROM fracture_ins WHERE planner_id=5;
    ​ 报错如下:
    ​ FAILED: Error in semantic analysis: No Partition Predicate Found for Alias
    “fracture_ins” Table "fracture_ins
    ​ 解决如下:
    ​ SELECT DISTINCT(planner_id) FROM fracture_ins WHERE planner_id=5 AND
    hit_date=20120101;
    2.2 禁止排序不加limit
    ​ 排序最终是要都进到一个Reduce中操作,防止reducer额外执行很长一段时间
    ​ SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id;
    ​ 出现如下错误
    ​ FAILED: Error in semantic analysis: line 1:56 In strict mode,limit must be
    specified if ORDER BY is present planner_id
    ​ 解决方案就是增加一个limit关键字:
    ​ SELECT * FROM fracture_ins WHERE hit_date>2012 ORDER BY planner_id LIMIT 100000;
    2.3 禁止笛卡尔积
    ​ 笛卡尔积是什么: A={a,b}, B={0,1,2},则 A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b,
    1), (b, 2)}
    ​ SELECT * FROM fracture_act JOIN fracture_ads;
    ​ 解决方法
    ​ SELECT * FROM fracture_act JOIN fracture_ads WHERE fracture_act.planner_id =
    fracture_ads.planner_id;
    3.Hive的严格模式怎样开启
    // 查看当前严格模式的状态 set hive.mapred.mode; // 设置为严格模式 set hive.mapred.mode=strict; // 设置为非严格模式 set hive.mapred.mode=nonstrict;

  5. Hive排序
    order by 对于查询结果做全排序,只允许有一个reduce处理
    sort by 对于单个reduce进行排序 但是我们将每个reduce里面进行排序,没有考虑到每个reduce之间的排序。所以我们引出下一个distribute by 分区排序,通常结合sort by一起使用(distribute by column sort by column asc|desc)cluster by 相当于distribute by + sort by (注意,虽然是两个结合,但是我们也不去用它原因很简单,cluster by不能通过asc desc的方式指定排序方式规则)

  6. Hive join数据倾斜
    1、小表join小表 不管他
    2、小表join大表 map-join
    3、大表join大表 map-side
    考虑会不会发生reduce,并且考虑reduce压力是否大(是否会出现某个reduce数据量庞大的情况)
    关于小表join大表两种实现方式:
    1、sql方式,在sql语句中添加Mapjoin标记(mapjoin hint)语法糖
    select /+MAPJOIN(A)/ * from A join B on (A.key=B.key);
    select /+MAPJOIN(smallTable)/ smallTable.key bigTable.value from smallTable join
    bigTable on smallTable.key=bigTable.key;
    2、自动开启mapjoin
    通过修改以下配置启用自动的mapjoin:
    set hive.auto.convert.join=true;
    (注意:该参数为true的时候,Hive自动对左边的表统计量,如果
    是小表,就加入到内存,即对小表使用Mapjoin)
    3、尽可能使用相同的连接键,如果不同,多一个join就会多开启一个mapreduce,执行速度变得慢。
    4、大表join大表
    a: 空key过滤:
    有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的 reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。但是这个的前提条件是异常数据,但是我们一般拿到的数据都是经过ETL数据清洗过后的,一般影响不大,面试的时候可以说。
    b: 空key转换:
    有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋随机的值,使得数据随机均匀地分不到不同的 reducer上(加盐)。但是我们一般拿到的数据都是经过ETL数据清洗过后的,规则数据,一般影响不大,面试的时候可以说。
    5、Map-Side聚合
    通过设置以下参数开启在Map端的聚合set hive.map.aggr=true;(一定要进行开启,虽然进行了两个mapreduce,但是当数据倾斜发生的时候,很多时候会根本跑不出结果,卡死在99%或者100%,慢总比出不来结果要好)!!!!!!!

  7. 合并小文件
    1、hadoop不适合存储小文件
    2、MR不适合处理小文件
    3、Hive不适合处理小文件

  8. 控制map和reduce的数量(一般情况下我们不去动它)

  9. JVM重用
    当我们的小文件个数过多,task个数过多,需要申请的资源过多的时候,我们可以先申请一部分资源,全部执行完毕后再释放,
    比我们申请一个释放一个要快。
    通过 set mapred.job.reuse.jvm.num.tasks=n;来设置
    (n为task插槽个数)
    缺点:
    设置开启后,task插槽会一直占用资源,无论是否有task进行,直到所有的task,
    即整个job全部执行完毕后,才会释放所有的task插槽,所以我们要合理地设置这个n
    (比如,我们设置申请了10个,但是现在来了6个,剩下4个插槽会在job全部执行完毕之前一直占用资源)

标签:planner,join,fracture,hive,Hive,key,优化
From: https://www.cnblogs.com/yulugoat/p/18243422

相关文章

  • MySQL 分页优化
    不需要担心数据库性能优化问题的日子已经一去不复返了。随着时代的进步,随着野心勃勃的企业想要变成下一个Facebook,随着为机器学习预测收集尽可能多数据的想法的出现。作为开发人员,我们要不断地打磨我们的API,让它们提供可靠和有效的端点,从而毫不费力地浏览海量数据。如果你......
  • 如何评估pcdn调度算法的优化效果(贰)
    PCDN(PersonalizedContentDeliveryNetwork)调度算法的优化可以通过以下几个方面来进行:1、性能指标:首先确定要评估的关键性能指标(KPIs),如平均响应时间、内容分发速度、缓存命中率、用户满意度等。这些指标应直接反映算法优化后的效果。2、基准测试:在优化之前,进行基准测试以......
  • LINUX系统优化
    LINUX系统优化企业生产场景中Linux系统的分区方案及内核企业生产场景中Linux系统的分区方案常规的分区方案如下:方案1:针对网站集群架构中的某个节点服务器分区,该服务器上的数据有多份(其他节点也有)且数据不太重要,建议的分区方案如下。/boot:设置为100~200MB。swap:物理内......
  • [DP] DP优化总结
    写在前面$DP$,是每个信息学竞赛选手所必会的算法,而$DP$中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素$DP$的时间复杂度和空间复杂度进行优化与处理,以达到满足题目要求的目的;参考文献:动态规划算法的优化技巧毛子青c++DP总结《算......
  • [DP] [倍增优化] Luogu P1081 [NOIP2012 提高组] 开车旅行
    [NOIP2012提高组]开车旅行题目描述小\(\text{A}\)和小\(\text{B}\)决定利用假期外出旅行,他们将想去的城市从$1$到\(n\)编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市\(i\)的海拔高度为\(h_i\),城市\(i\)和城市\(j\)之间的距......
  • DP(优化)
    史不分好坏。是史就应该冲进......
  • 需求响应|动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)
        ......
  • 基于多时段动态电价的电动汽车有序充电策略优化(Matlab代码实现)
    ......
  • 深入解析MySQL Threads_running:监控、诊断与性能优化策略
    基本概念​在MySQL中,Threads_running是一个用于监控数据库并发连接数的指标。它表示当前正在执行的线程数。当该值超过数据库能够处理的最大连接数时,可能会导致数据库性能下降甚至崩溃。线程数过多会由于上下文切换、锁等待等问题从而导致性能急剧下降。设置Threads_......
  • 任务下发优化分析过程记录
    任务下发优化分析过程记录背景最近接手了一个任务下发平台,基本功能是接收任务脚本,下发给目标服务器执行.简化的业务流程如下:sequenceDiagramautonumberparticipantclientparticipantserverparticipantDBparticipantMQparticipanttargetclient->>+server:......