Hive优化(再一遍系统复习)

Hive优化(或者面试问你工作中遇到的问题就可以答hive优化)

  1. select * 是不走MR程序的
  2. 可以开启本地模式local(当文件小于默认128M且文件数少于4个,不走MR)
  3. 表的优化
    (1) 小表 join 大表
    将key相对分散,并且数据量小的表放在jon左边,这样可以有效减少内存溢出(OOM)错误发生几率;在进一步可以开启MapJoin让小维度的表先进入内存,在map端完成reduce(注:现在用的hive版本本身已经进行了优化,所以小表放在前或者后没有明显区别)
    (2)大表 Join 大表
    1.空key过滤(一般数据清洗已经被过滤掉了,脏数据需要进行过滤)
    2.空key转换
    有时某个key为空,但是并不是异常数据,此时可以给空key字段赋一个随机值,使数据随机均匀地分布在reduce上(要不然空key数据会都被分配到一个reduce里,造成数据倾斜)
  4. MapJoin(默认是开启的)(小表join大表时使用,可以有效提高效率)
    内存足够大可以把阈值调大(默认25M以下认为是小表)
    set hive.mapjoin.smalltable.filesize = ?;
    MapJoin工作机制:join机制在map阶段完成,把小表全部加载到内存在map端进行join,避免reduce处理。
  5. Group By
    (1) (默认情况,map阶段同一key数据分发给一个reduce,当一个key数据过大时就会发生数据倾斜)
    (2) 并不是聚合操作都要在reduce完成,也可以开启map端进行预聚合(combiner)(默认是开启的)
    (3)在发现有数据倾斜的时候可以打开负载均衡(默认是false)
    hive.groupby.skewindata = true;(确定存在数据倾斜时打开)
    开启后会生出两个MRJob,第一个job中,map的输出结果会随机分布到reduce中,每个reduce做部分聚合,并输出结果;第二个Job再根据预处理的结果按照group by key分布到reduce中,最后完成最终聚合。
  6. count(distinct) 去重统计(尽量不用,用groupby来代替)
    先group by 再count,避免oom或者数据倾斜
    只有一个reducer在进行count(distinct)的计算
  7. 尽量避免使用笛卡尔积,join的时候不加on条件或者无效on,hive只能使用1个reduce来完成笛卡尔积(生产环境中会关闭掉笛卡尔积 [会设置成严格模式])
  8. 行列过滤
    (1)列处理:少用select *
    (2)行处理:当使用外关联时,如果将副表过滤,条件写在where后面,那么就会全表关联,之后在过滤,那么副表就要先子查询在进行join。
  9. 动态分区调整(根据分区字段进行分区):需要配置参数,最大分区数、每个reduce分区数等参数。根据字段的不同个数来进行设定,每个reduce分区数少于不同字段个数会报错。
    10.MR优化
    (1)合理设置map数
    (2)合理设置reduce数
    (3)并行执行
    设置参数hive.exec.parallel = true;
    hive会将一个查询转换成一个或多个阶段,阶段可以是MR、抽样阶段、合并阶段、limit阶段。多个阶段并行度越高,job完成越快。
    (4)严格模式(严格模式下,笛卡尔积不被允许,分区表未指定分区不被允许等),在生成环境中是开启的,默认是false。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

volatile学习(可见性,不保证原子性,禁止指令重排(双端检索机制))

volatile是java虚拟机提供的轻量级的同步机制: 1.保证可见性:线程之间可见性(及时通知) 2.不保证原子性 3.禁止指令重排 先了解一下jvm同步 由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(或者称为…

CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点

1、CAS底层原理? 自旋锁(cas思想)unsafe类,保证原子性靠的是unsafe类 1.首先可以看到: atomicInteger.getAndIncrement();getAndIncrement()的底层是 public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset,…

cas引出的ABA问题?如何解决?- 理解原子引用、时间戳(版本号)原子引用

ABA问题: 假如有两个线程1,2; cas下:1.线程取值完等待,2线程取值并把A改成B,有把B改成A,这是1线程执行会任务A还是原来的A没有发生改变,如果不在乎中间结果,只看收尾&am…

ArrayList、HashMap、HashSet是线程不安全的,高并发下如何解决?

1.故障现象 :ArrayList的add()方法并没有使用synchronized所以是线程不安全的,会造成java.util.ConcurrentmodificationException(并发修改异常) 2.导致原因:并发争抢修改导致 3.解决办法(以ArrayList为例,其他类似&…

java -锁(公平、非公平锁、可重入锁【递归锁】、自旋锁)

1.公平锁、非公平锁 2.可重入锁(递归锁) 3.自旋锁 AtomicReference atomicReference new AtomicReference();//原子引用线程下面代码5秒钟自旋了10万次,还是很消耗CPU的 package HighConcurrency;import java.util.concurrent.TimeUnit; imp…

CountDownLatch,同步辅助类

public class CountDownLatchextends Object一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 假设定义一个计数器为 5。每个线程完成任务后计数减1计数器减为 0 则通知等待的线程。 用给定的计数 初始化 Count…

CyclicBarrier-同步辅助类

与CountDownLatch相反,CyclicBarrier是做加法 public class CyclicBarrierextends Object一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必…

阻塞队列-BlockningQueue

阻塞队列的前言介绍引用于https://www.cnblogs.com/aspirant/p/8657801.html,写的挺好有兴趣可以看一看 一. 前言 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的…

多线程下的生产者消费者(一个初始值为0的变量,两个线程一个加1一个减1,轮询5轮)

在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了。配合Object的wait()、notify()系列方法可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式 下面用的是lock锁 …

synchronized和ReentrantLock区别,用新的lock有什么好处?举例说说

原始构成:synchronized是JVM层面的,底层通过monitorenter和monitorexit来实现的。Lock是JDK API层面的。(synchronized一个enter会有两个exit,一个是正常退出,一个是异常退出(保证肯定可以退出)…

阻塞队列,来写生产者消费者,生产一个消费一个

用阻塞队列来写,就不需要程序员来关心什么时候阻塞线程await,什么时候唤醒线程notify()。 类似消息中间件 package JUC;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import…

Callable接口-创建线程的第三种方法

Callable和Runable相比 //Runnable和Callable区别 //1.Callable带返回值 //2.run()不会抛异常,call()会抛异常 //3.实现的接口不同 package JUC;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concur…

线程池ThreadPool,线程池底层ThreadPoolExecutor方法七大参数,拒绝策略,以及实际开发中高并发下用到哪个线程池?

为什么要用线程池 基本的三个线程池的底层就是ThreadPoolExecutor类 ExecutorService threadPool Executors.newFixedThreadPool(int);//固定线程数的线程池,,执行长期的任务,性能好 ExecutorService threadPool Executors.newSingleThrea…

【转】2.1.1 购买阿里云服务器(Ubuntu系统)

购买阿里云服务器 优惠购买链接 戳我购买 Cpu和内存 M2对服务器配置要求比较高, cpu要大于等于1, 内存要大于等于2 选择Ubuntu镜像 最好用官方提供的公共镜像,不要用第三方的。 其他的配置 其他的配置按你自己的需求来选择。 控制台 购买完成后…

死锁编码及定位分析(故障排查)

什么是死锁? 在Java中使用多线程,就会有可能导致死锁问题。死锁会让程序一直卡住,不再程序往下执行。我们只能通过中止并重启的方式来让程序重新执行。 造成死锁的原因: 当前线程拥有其他线程需要的资源当前线程等待其他线程已…

【转】在win10接双显示器(扩展模式)怎么把鼠标游标切换到第二台显示器上?

作者:朱宁 链接:https://www.zhihu.com/question/50002939/answer/120465673 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 使用软件 DisplayFusion Pro 这个软件体量比较大,蓝…

JAVA的Future类

学习callable中用到了Future,找了个博客,可以看下 https://blog.csdn.net/u014209205/article/details/80598209

java单例模式(饿汉式和懒汉式的几种不同写法)

1.饿汉式(直接创建)三种创建方法代码里面都有 第三种静态代码块方式,需要创建个properties文件 package java2;import java.io.IOException; import java.util.Properties;/*** 单例模式设计步骤:* 1.构造器私有化* 2.内部创…

【转】一键将Web应用发布到云-Azure Web App!

我们现在越来越多的传统应用,逐步向云端迁移,原先私有云的部署模式,逐步向云端PaaS IaaS转变。例如: 我们在云端Azure中申请VM虚拟机,将我们的Web应用部署到VM的IIS中,同时做云服务的高可用性集和NLB&…

【转】微软Azure Functions使用入门

微软公司于近期发布了Azure Functions以支持AWS Lambda。本文将介绍如何开始使用这个事件驱动服务,以及这项服务是否适合您。 无论是超大规模云供应商、软件开放人员还是企业管理员,目前最热门的技术之一就是无服务器计算。也就是所谓的功能即服务&…