热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hive表列数限制_?Hive的优化和压缩

使用之前的数据库执行语句explainselectcount(*)fromemp;explain可以帮助我们看到有多少个任务会出现下面的信息根标签,操作语法树等信息根
3f374e899a6e2d8a01165b5886c766ca.png

使用之前的数据库

5298e08e0133a50e46a91e316e7ad383.png

执行语句

explain select count(*) from emp;

explain可以帮助我们看到有多少个任务

会出现下面的信息根标签,操作语法树等信息

d1f476925f9c3c68137fb656325bed91.png

根标签

e374998a681cd4971a36e581029511bb.png

操作语法树

7e6ae66c384c97954f41e8c092e74254.png

之前在做日志分析的时候,创建表的语句,也有很多信息

9ef7154d101fc320ad99d14760753d6e.png

依赖,是会构成有向无环图的, 根据有向无环图会按照顺序执行job。这样也会造成执行时间比较长,我们就需要做优化

9fe3dd9b26eb9b2aaf81769abbe5ebd5.png

优化一:大表拆小表

比如临时表、分区表、外部表。其中分区表:加载的表会更少,会直接加载到某个数据,不需要加载所有数据,提高检索速度。

优化二:sql语句

将复杂的语句,比如子查询简化拆分成多个简单的语句。

join和filter的使用,先过滤再join

优化三:合理设置map和reduce个数

reduce数目:可以通过参数设置,默认是一个

** hive中:set mapreduce.job.reduces=

** mapreduce编码中:job.setNumReduceTasks(tasks);

map的数目: 一个分片就是一个块,一个maptask,不可以通过参数去设置

在源码中有个计算方式,大体是:

** Math.max(minSize, Math.min(maxSize, blockSize));

minSize默认参数值是0M

maxSize默认参数值是256M

blockSize默认参数值128M

可以打开FileInputFormat类中的computeSplitSize的方法

修改块的大小是不可行的,因为集群投入生产,格式化后就不能再修改了,可以通过代码指定

** FileInputFormat.setMaxInputSplitSize(job, size);

** FileInputFormat.setMinInputSplitSize(job, size);

通过split的最大最小值来改变map任务数

优化四:开启并行执行

有多个job之间无依赖关系可以一起执行,充分利用资源,在工作中都会把它打开

hive.exec.parallel

设置同时运行的线程数,根据集群资源设置,默认是8

hive.exec.parallel.thread.number

优化五:jvm重用

mapreduce.job.jvm.numtasks默认是1,运行一个job会启动一个jvm上运行

用完就销毁,可以设置重用,节省资源,可以按照比例调整数目,会影响map任务,shuffer会有小幅度的下降

reduce影响不大,一般可以设置为3或5

还有一个推测执行(不建议使用,了解为主):

比如:运行十个map,十个reduce,等map结束后,等了一段时间后,九个执行reduce完毕,有一个还没结束,分布的数据量都是差不多的。推测执行:mapreduce会再重新开启一个跟这个一模一样的任务,,两个相同的任务完成同一件事,谁先完成,就会把另一个kill。缺点:会消耗更多的资源,一般不建议开启,有可能数据会重复写入,造成异常。

优化六:hive本地模式(了解为主)

hive的本地模式:hive.exec.mode.local.auto默认flase

hive底层运用的是hadoop集群,本地模式不会在集群所有机器上运行,会选择一台作为本地运行,一般处理小数据量级的

速度会很快

限制:job的输入数据不能大于128MB,map的个数不能超过4个,reduce的个数不能超过1个

优化七:

hive数据倾斜:在MR程序中由于某个key值分布不均匀,导致某个reduce运行速度严重过慢,严重影响了整个job的运行

原因有很多,解决办法也很多,有几个比较典型。

解决一:默认的分区是采用hash取值,可以自定义实现分区规则来避免产生倾斜

解决二:在key中加入随机数的侧率,打乱分区

在hive中

产生倾斜的主要语句:join、group by、distinct。

join,连接某个key值时,key值得数据量很多。

join:map join 、 reduce join 、SMB join(sort merge bucket)

map join:适合小表join大表的场景 【读取小表缓存到内存中,在map端完成reduce,减轻reduce压力】

开启mapjoin,默认值是true,开启了map join,符合条件就会去执行

6545e34d7315ac7f863bf10f8ef1ca5e.png

属性配置

hive.auto.convert.join

true

执行map join的条件,默认是10M

9bc76ad71f2e9c3ad43184941b0a1087.png

属性配置

hive.auto.convert.join.noconditionaltask.size

10000000

reduce join:适合大表join大表的场景 【加上随机数,把倾斜的数据分到不同的reduce上】

SMB join:适合大表join大表的场景,简称:桶join,创建桶表

分区与分区之间的join,减少了join的范围。

桶join只适合桶与桶之间的join,适合抽样的统计。

注意:桶表之间的join,两张表的桶的个数要么是一致,要么就是成倍数关系

如何判断是大key导致的问题?

通过时间判断:如果每个reduce的运行时间都很长,那么可能是reduce数目设置过少造成的;如果大部分的reduce任务在几分钟之内完成了,而某一个reduce可能30分钟还没完成,可能是倾斜;可能也是某个节点造成的问题,可以考虑使用推测执行,如果推测执行的任务也很慢,就有可能是倾斜问题或者如果推测执行的新任务在短时间内完成,可能就是节点造成的某个任务运行过慢。

自定义counter判断:判断统计查看每个任务的信息,输入记录条数和输出字符数。

Hadoop和 hive 压缩

Hadoop数据压缩

MR操作过程中进行大量数据传输。

压缩技术能够有效的减少底层存储(HDFS)读写字节数。

压缩提高了网络带宽和磁盘空间的效率。

数据压缩能够有效的节省资源!

压缩是mr程序的优化策略!

通过压缩编码对mapper或者reducer数据传输进行数据的压缩,以减少磁盘IO。

bin/hadoop checknative可以查看hadoop是否开启了压缩

d87df01251b1c21786f4249abc73e495.png

我们准备几个软件

ceff6b185544506c5f9b4d692facabb7.png

解压

tar -zxvf cdh5.3.6-snappy-lib-natirve.tar.gz

5ab0f492cc4d43bd42454ceb66ed7b10.png

将hadoop中对应的目录native直接删除覆盖

06fdebf610642fe4514f88dcb2433065.png

这是hadoop中的目录

98e63733969b92fca728007fc03cfd28.png

我们将原先的删除备份

697eeec4a239852628715c5bbf5c63f5.png

再将解压的拷贝过来

3293fd7fdb6259f18454cbe1fd18b5c3.png

bin/hadoop checknative可以查看hadoop是否开启了压缩

06b290137de91472e82b39748fe238cc.png

压缩要支持可分割性

那什么叫可分割性呢,我们来看一个小例子

我桌面上有一个Tomcat文件,我们进行压缩

b57fc88b12f28f0395ba6aba31d3d04d.png

我们压缩的时候,进行分卷

d2cc6ee258d64d17390a097be07ea8f0.png

这是压缩完的

b043b9e2e8e2e7ade411a4c7de3c610e.png

我解压一个是可以的

60fc19cd607ca4c2619ba19348e28dd2.png

但是我删除一个,就不可以了,这就是不可分割性

41efab8494b4418dd68c82dda0636dec.png

MR 压缩设置

设置这两个参数

map:输出

mapreduce.map.output.compress=true

mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec

reduce:输出

mapreduce.output.fileoutputformat.compress=true

mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec

代码中设置

FileOutputFormat.setCompressOutput(job, true)

FileOutputFormat.setOutputCompressorClass(job, SnappyCodec.class);

可以利用wordcount查看下

跑一个普通的看看(数据量大的效果比较明显):

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount /input /output

设置后再查看

bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.0-cdh5.3.6.jar wordcount -Dmapreduce.map.output.compress=true -Dmapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec -Dmapreduce.output.fileoutputformat.compress=true -Dmapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec /input /output2

Hive的压缩设置

map:输出

hive.exec.compress.intermediate

true

配置Map

set hive.exec.compress.intermediate=true;

set mapreduce.map.output.compress=true;

set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

reduce:输出

hive.exec.compress.output

true

配置reduce

set mapreduce.output.fileoutputformat.compress=true;

set mapreduce.output.fileoutputformat.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;

set hive.exec.compress.output=true;

hive的高压缩存储格式

[STORED AS file_format]

file_format:

d21b019d3b699396f6d6860179ce64ba.png

hive默认的存储格式是TEXTFILE

我们创建数据

【原文本数据】

create table file_source(

id string,

url string,

referer string,

keyword string,

type string,

guid string,

pageId string,

moduleId string,

linkId string,

attachedInfo string,

sessionId string,

trackerU string,

trackerType string,

ip string,

trackerSrc string,

COOKIE string,

orderCode string,

trackTime string,

endUserId string,

firstLink string,

sessionViewNo string,

productId string,

curMerchantId string,

provinceId string,

cityId string,

fee string,

edmActivity string,

edmEmail string,

edmJobId string,

ieVersion string,

platform string,

internalKeyword string,

resultSum string,

currentPage string,

linkPosition string,

buttonPosition string

)row format delimited fields terminated by 't';

6f3c6d6d325c374d6b3ae4afc4e5205a.png

导入数据

load data local inpath '/data/test/data1' into table file_source;

94b5a82c124e0392968351359073770a.png

创建表

create table file_textfile(

id string,

url string,

referer string,

keyword string,

type string,

guid string,

pageId string,

moduleId string,

linkId string,

attachedInfo string,

sessionId string,

trackerU string,

trackerType string,

ip string,

trackerSrc string,

COOKIE string,

orderCode string,

trackTime string,

endUserId string,

firstLink string,

sessionViewNo string,

productId string,

curMerchantId string,

provinceId string,

cityId string,

fee string,

edmActivity string,

edmEmail string,

edmJobId string,

ieVersion string,

platform string,

internalKeyword string,

resultSum string,

currentPage string,

linkPosition string,

buttonPosition string

)

row format delimited fields terminated by 't'

stored as textfile;

096706160cc66263571b410fa91b60e3.png

导入数据

insert overwrite table file_textfile select * from file_source;

eaf8480e3ead701d615674bc4de880f4.png

创建表

create table file_parquet(

id string,

url string,

referer string,

keyword string,

type string,

guid string,

pageId string,

moduleId string,

linkId string,

attachedInfo string,

sessionId string,

trackerU string,

trackerType string,

ip string,

trackerSrc string,

COOKIE string,

orderCode string,

trackTime string,

endUserId string,

firstLink string,

sessionViewNo string,

productId string,

curMerchantId string,

provinceId string,

cityId string,

fee string,

edmActivity string,

edmEmail string,

edmJobId string,

ieVersion string,

platform string,

internalKeyword string,

resultSum string,

currentPage string,

linkPosition string,

buttonPosition string

)

row format delimited fields terminated by 't'

stored as PARQUET;

fde9eb02d324b1ec2ff6bd991948f042.png

导入数据

insert overwrite table file_parquet select * from file_source;

67a6008808dcde6363bef0e3130c5cb3.png

创建表

create table file_orc(

id string,

url string,

referer string,

keyword string,

type string,

guid string,

pageId string,

moduleId string,

linkId string,

attachedInfo string,

sessionId string,

trackerU string,

trackerType string,

ip string,

trackerSrc string,

COOKIE string,

orderCode string,

trackTime string,

endUserId string,

firstLink string,

sessionViewNo string,

productId string,

curMerchantId string,

provinceId string,

cityId string,

fee string,

edmActivity string,

edmEmail string,

edmJobId string,

ieVersion string,

platform string,

internalKeyword string,

resultSum string,

currentPage string,

linkPosition string,

buttonPosition string

)

row format delimited fields terminated by 't'

stored as orc;

4d1cad587179dfc35070cfbd6c18cfe4.png

导入数据

insert overwrite table file_orc select * from file_source;

72cff2b9cbcc1811af88a085775f1f7b.png

【结果比较】

原始数据 37.6 MB

textfile 27.48 MB

parquet 16.14 MB

orc 4.4 MB

27fcc2265bfefbe4d15a1ed30d5a82c3.png
c317c4b48d16664a6b1128c671d6da49.png
2726ac738638270966ab35a787ad67ac.png
4672dbdde31fe53ad84512bd44b377ed.png

总结:

textfile 存储空间消耗比较大,并且压缩的text 无法分割和合并 查询的效率最低,可以直接存储,加载数据的速度最高

sequencefile 存储空间消耗最大,压缩的文件可以分割和合并 查询效率高,需要通过text文件转化来加载

rcfile 存储空间最小,查询的效率最高 ,需要通过text文件转化来加载,加载的速度最低

text,seqfile能不用就尽量不要用 最好是选择orc



推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
author-avatar
keleisibuo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有