Hive性能调优详解系列之hive建表设计层面调优_数仓工程师必备hive调优方案

记录大数据量写入Hive慢的解决过程 最近在做一个大数据类项目,用到了Hadoop Hive SparkStreaming kafka等技术,整体面很广,本片仅介绍在开发过程中遇到的大数据量写入遇到的写入特别慢的解决过程。 说明: 我之前没接触过Hive相关,所以可能有些地方不是很准确,或者是还有其它解决方案,欢迎大家指出以备完善。 场景: 现在有个场景:50W数据写入hive库,会使用哪种方案。我之前没接触过Hive相关知识,最开始的方法是将数据转换为SQL,使用jdbc直接insert到Hive里面。我做了个测试一晚上跑了不到30W,速度太 阅读详情

一.调优概述

Hive作为大数据领域常用的数据仓库组件,在平时设计和查询时要特别注意效率。影响Hive效率的几 乎从不是数据量过大,而是数据倾斜、数据冗余、Job或I/O过多、MapReduce分配不合理等等。对Hive的调优既包含Hive的建表设计方面,对HiveHQL语句本身的优化,也包含Hive配置参数和底层引擎MapReduce方面的调整。
所地这次调优主要分为以下四个方面展开:
1、 Hive的建表设计层面
2、 HQL语法和运行参数层面
3、 Hive架构层面
4、 Hive数据倾斜
总之,Hive调优的作用:在保证业务结果不变的前提下,降低资源的使用量,减少任务的执行时间。

二.调优须知

  • 对于大数据计算引擎来说:数据量大不是问题,数据倾斜是个问题。
  • Hive的复杂HQL底层会转换成多个MapReduce Job并行或者串行执行,Job数比较多的作业运行效率相对比较低,比如即使只有几百行数据的表,如果多次关联多次汇总,产生十几个Job,耗时很长。 原因MapReduce作业初始化的时间是比较长的。
  • 在进行Hive大数据分析时,常见的聚合操作比如sum, count, max, min,
    UDAF等,不怕数据倾斜问题,MapReduce在Mappe阶段的预聚合操作,使数据倾斜不成问题。
  • 好的建表设计,模型设计事半功倍。
  • 设置合理的MapReduce的Task并行度,能有效剧性能。(比如,10w数据量级计算,用100个reduceTask,那是相当的浪费,1个足够,但是如果是亿级的数据量,那么1个Task又会很少,至少保证1个tast处理10w+即可)
  • 数据量较大的情况下,慎用count(distinct), group by容易产生倾斜问题。
  • 对小文件进行合并,是行之有效的提高调度效率的方法,假如所有的作业设置合理的文件数,对任 务的整体调度效率也会产生积极的正向影响
  • 优化时把握整体,单个作业最优不如整体最优。

3.调优具体细节

3.1. Hive建表设计层面

Hive的建表设计层面调优,主要以建表的类型, 文件存储格式,压缩格式等多方面进行参考。
1.利用分区表优化

分区表是在某一个或者几个维度上对瞄进行分类存储,一个分区对应一个目录。如果筛选条件里有分区字段,那么Hive只需要遍历对应分区目录下的文件即可,不需要遍历全局数据,使得处理的数据量 大大减少,从而提高新旬效率。

也就是说:当一个Hive表的查询大多数情况下,会根据某一个字段逬行筛选时,那么非常适合创建为 分区表,该字段即为分区字段。

seiectl:	seiect	....	where	country	=	"china"
seiect2:	seiect	....	where	country	=	"chinaH
seiect3:	seiect	....	where	country	=	"china"
select4:	seiect	....	where	country	=	"china"

分门别类:这个city字段的每个值,就单独形成为一个分区。其实每个分区就对应带HDFS的一个目录 在创建表时通过启用partitioned by实现,用来partition的维度并不是实际数据的某一列,具体分 区的标志是由插入内容时给定的。

当要查询某一分区的内容时可以采用where语句,形似where tablename. partition_column = a 来实现。

1.创建含分区的表:

create TABLE page_vi ew(vi ewTime INT, useri d BIGINT,
page_url string, referrer_url string,
ip string comment * ip Address of the user*)
PARTITIONED BY(date string, country STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '1'
STORED AS TEXTFILE;

2.载入内容,并指定分区标志:

load data local inpath '/home/bigdata/pv_2018-07-08_us.txt' into table page_view partition(date='2018-07-08*, country='US');

3.查询指定标志的分区内容:

select page_vi ews.* from page_vi ews
WHERE page_vi ews.date >= '2008-03-01'
AND page_vi ews.date <= '2008-03-31'
AND page_vi ews.refe r re r_u rl like '%xyz.com';

简单总结:

1.当你意识到一个字段经常用来where,建分区表,使用这个字段当做分区字段
2.在查询的时候,使用分区字段来过滤,就可以避免全表扫描。只需要扫描这张表的一个分区的数据即可

2.利用分桶表优化
分区与分桶有哪些区别,如下:

分区:按照字段值来进行:一个分区,就只是包含这个这一个值的所有记录不是当前分区的数据一定不在当前分区当前分区也只会包含当前这个分区值的数据。
分桶:默认规则:Hash散列 一个分桶中会有多个不同的值,如果一个分桶中,包含了某个值,这个值的所有记录,必然都在这个分桶。

目前分桶具有两大场景作用,如下。

1.采样
2.join

如下代码显示就是以userid作为分桶bucket,共设置32个buckets

create table page_view(vi ewTime INT, userid bigint, page_url string, referrer_url string, ip string comment 'IP Address of the user*)
comment 'This 1s the page view table*
PARTITIONED BY(dt STRING, country STRING)
CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '1' COLLECTION ITEMS TERMINATED BY * 2 * MAP KEYS TERMINATED BY '3'
STORED AS SEQUENCEFILE;

分桶的语法:

CLUSTERED BY(USerid) SORTED BY(viewTlme) INTO 32 BUCKETS

clustered BY(userid) 表示按照 userid 来分桶 SORTED BY(vi ewTi me) 按照vi ewti
me来进行桶内排序 INTO 32 BUCKETS 分成多少个桶

两个表以相同方式(相同字段)划分桶,两个表的桶个数是倍数关系

create table order(cid int,price float) clustered by(ci d) into 32 buckets;
create table customer(id int,fi rst string) clustered by(id) into 32 buckets; select pri ce from order t join customer s on t.cid = s.id

通常情况下,Sampling在全体数据进行采样,这样效率自然就低,它要去访问所有数据。而如果一 个表已经对某一列制作了 bucket,就可以采样所有桶中指定序号的某个桶,这就减少了访问量。
总结三种采样

分桶抽样: select * from student tablesample(bucket 3 out of 32);
随机釆样:rand()函数 select * from student order by rand() limit 100;//效率低
select * from student distribute by rand() sort by rand() 1imit100; // 推荐 用这种
数据块抽样:tablesample()函数
select * from student tablesample(10 percent) ; # 百分上十
select * from student tabl esample(5 rows) ; # 行数
select * from student tablesample(5 M) ; # 大小

3.选择合适的文件存储格式
在HiveSQL的create table语句中,可以使用stored as …指定表的存储格式。
Apache Hive 支持Apache Hadoop中使用的几种熟悉的文件格式,比如TextFile、SequenceFile、RCFile、 Avro、ORC、ParquetFile等。
存储格式一般需要根据业务进行参考,在我们的实操中,绝大多数表都采用TextFile与Parquet两种存储 格式之一。TextFile是最简单的存储格式,它是纯文本记录,也是Hive的默认格式。虽然它的磁盘开销 比较大,查询效率也低,但它更多地是作为跳板来使用。RCFile、ORC、Parquet等格式的表都不能由 文件直接导入数据,必须由TextFile来做中转。Parquet和ORC都是Apache旗下的开源列式存储格式。 列式存储比起传统的行式存储更适合批量OLAP查询,并且也支持更好的压缩和编码。
创建表时,特别是宽表,尽量使用ORC、ParquetFile这些列式存储格式,因为列式存储的表,每一 列的数据在物理上是存储在一起的,Hive查询时会只遍历需要列数据,大大减少处理的数据量。
第一种:TextFile

1.存储方式:行存储。默认格式,如果建表时不指定默认为此格式。,
2.每一行都是一条记录,每行都以换行符”\n”结尾。数据不做压缩时,磁盘会开销比较大,数据解析开销也比较大。
3.可结合Gzip、Bzip2等压缩方式一起使用(系统会自动检查,查询时会自动解压),推荐选用可切分的压缩算法。

第二种:Sequence File

1.一种Hadoop API提供的二进制文件,使用方便、可分割、个压缩的特点。
2.支持三种压缩选择:NONE、RECORD’ BLOCK: RECORD压缩率低,一般建议使用BLOCK压缩。

第三种:RC File

1.存储方式:数据按行分块,每块按照列存储。 首先,将数据按行分块,保证同一个record在一个块上,避免读一个记录需要读取多个block。 其次,块数据列式存储,有利于数据压缩和快速的列存取。
2.相对来说,RCFile对于提升任务执行性能提升不大,但是能节省一些存储空间。可以使用升级版的ORC格式。

第四种:ORC File

1.存储方式:数据按行分块,每块按照列存储
2.Hive提供的新格式,属于RCFile的升级版,性能有大幅度提升,而且数据可以压缩存储,压缩快,快速 列存取。
3.ORC File会基于列创建索引,当查询的时候会很快。

第五种:Parquet File

1.存储方式:列式存储。
2.Parquet对于大型查询的类型是高效的。对于扫描特定表格中的特定列查询,Parquet特别有用。Parquet一般使用snappy、Gzip压缩。默认snappy:
3.Parquet支持impala查询引擎。
4.表的文件存储格式尽量采用Parquet或ORC,不仅降低存储量,还优化了查询,压缩,表关联等性能。

4.选择合适的压缩格式
Hive语句最终是转化为MapReduce程序来执行的,而MapReduce的性能瓶颈在与网络IO和磁盘 IO,要解决性能最主要的是减少数据量,压缩虽然减少数据量,但是压缩过程要消耗CPU,但是在Hadoop中,往往性能瓶颈不在于CPU, CPU压力并不大,所 以压缩充分利用了比较空闲的CPU。
常用压缩方法对比

压缩格式是否可拆分是否自带压缩率速度是否hadoop自带
gzip否是很高比较快是
––––––
lzo是是比较高很快否,要安装
–––––
snappy否是比较高很快否,要安装
––––––
bzip2是否最高慢是
––––––

如何选择压缩方式

1.压缩比率
2.压缩解压速度
3.是否支持split

支持分割的文件可以并行的有多个mapper程序处理大数据文件,大多数文件不支持可分割是因为这些文件只能从头开始读。
是否压缩

1.计算密集型,不压缩,否则进一步增加了CPU的负担
2.网络密集型,推荐压缩,减小网络数据传输

各个压缩方式所对应的Class类
压缩格式 类

zlib org.apache.hadoop.io.compress. Defaultcodec
gzip org.apache.hadoop.io.compress.GzipCodec
bzip2 org.apache.hadoop.io.compress.Bzip2Codec
Izo org.apache.hadoop.io.compress.lzo.LzoCodec
Iz4 org.apache.hadoop.io.compress.LzoCodec
snappy org.apache.hadoop.io.compress.SnappyCodec

压缩使用

Job输出文件按照Block以GZip的方式进行压缩:

默认值是false
set mapreduce.output.fi1 eoutputformat.compress=true;

默认值是Record
set mapreduce.output.fi1 eoutputformat.compress.type=BLOCK

默认值是org.apache.hadoop.io.compress.Defaultcodec
set mapreduce.output.fi1eoutputformat.compress.codec=org.apache.hadoop.io.compress.Gzipcodec

Map输出结果也以Gzip进行压缩:

##启用map端输出
set mapred.map.output.compress=true
默认值是 org. apache. hadoop .io. comp ress. Defaultcodec
set
mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.GzipCodec

对Hive输出结果和中间都进行压缩:

set hive.exec.compress.output=true ## 默认值是false, 不压缩 set
hive.exec.compress.intermediate=true ## 默认值是false,为true时MR设置的压缩才启用

总结

以上对Hive性能调优详解系列之hive建表设计层面调优,语法层面以及架构与数据倾斜会在其余系列篇章更新。
老姜的数据江湖专注大数据数仓、数据治理相关。哔哩号以及微信公众号:老姜的数据江湖。

Hive优化(提高hive运行速度) 一、Hive使用本地模式执行操作(Hive使用资源大于20M的时候还是会采用集群yarn的方式运行) 将hive的job交给yarn执行太慢,hive支持本地模式 設置本地模式之前的,耗時 9.068 設置本地模式之后的,耗時 0.29 设置hive基于本地模式的方法 1、设置临时的 在每次执行hql语句之前 都要先执行下面这句话 set hive.exec.mode.local.auto... 阅读详情

相关推荐

大数据从业者必知必会的Hive SQL调优技巧 | 京东云技术团队

在HDFS中,每个小文件对象约占150字节的元数据空间,如果有大量的小文件存在,将会占用大量的内存资源。根据集群的配置和资源情况,合理调整Hive查询的并行度和资源分配,可以提高查询的并发性和整体性能。COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。

JDDTechTalk的博客 1210

EMR 6.2 hive创建表执行时间过长,最后失败

EMR 6.2 hive创建表执行时间过长,最后失败,报错如下 Job Commit failed with exception 'org.apache.hadoop.hive.ql.metadata.HiveException(com.amazon.ws.emr.hadoop.fs.consistency.exception.ConsistencyException 解决 :关闭一致性视图 修改 /usr/share/aws/emr/emrfs/conf/emrfs-site.xml 文件 将.

Clarke 813

不用加速器!Google Earth Pro登录失败自救手册:从服务器连接到地图加载的完整排错流程

本文详细解析了Google Earth Pro登录失败的常见问题及解决方案,包括服务器连接失败、地图加载异常等。通过基础排查、内置修复工具使用和高级配置调整,帮助用户无需加速器即可解决启动问题、黑屏和转圈圈等困扰,提升软件使用体验。

weixin_29227425的博客 482

Spark 写 Hive table 非常慢【解决】

代码如下: dataFrame.createOrReplaceTempView("view_page_utm")val sql = s""" |insert overwrite table data_lake_v1.urchin_tracking_module PARTITION(cd='$date', tag ='ads') | select p_id, platform, ut...

weixin_30381793的博客 3577

【技术分享】ArcGIS Pro底图色彩优化实战:从DEM到山体阴影的进阶调色技巧

本文深入探讨了在ArcGIS Pro中优化地形底图色彩的进阶技巧。通过分析DEM与山体阴影的直方图,详细讲解了如何运用图层混合、亮度、对比度及伽马值等核心参数进行精细化调色,从而将灰暗平淡的地图转化为层次分明、视觉美观的专业成果。

5b6n7m8的博客 759

Docker容器n8n中 read/write files from disk 无法读取容器内文件解决方案

《n8n文件读写Docker部署常见问题解决方案》摘要:针对n8n 1.90.2版本在Docker环境下文件读写失败问题,本文分析常见错误包括路径错误(ENOENT)、权限不足(EACCES)及节点误用问题。核心解决方案为:1)通过-v参数挂载宿主机目录到容器(如/files);2)使用新版Read/WriteFilesfromDisk节点操作文件;3)确保权限设置正确。提供可直接导入的示例工作流JSON,演示从CSV读取到结构化数据处理的全流程。特别强调已部署用户需重新挂载卷的正确操作方式,并附解决方案对

m0_74822402的博客 2184

Hive(15):Hive调优之建表优化

关系型数据库中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置。查询满足条件的一整行数据的时候,列存储则需要去每个聚集的字段找到对应的每个列的值,行存储只需要找到其中一个值,其余的值都在相邻地方,所以此时行存储查询的速度更快。每个字段的数据类型一定是相同的,列式存储可以针对性的设计更好的设计压缩算法。...

yang_shibiao的博客 988

【驭风计划 算法训练营】周测4:习题11-4、8-4、12-4

给出 nn 个非负整数 x1,x2,⋯,xnx1,x2,⋯,xn,有 qq 个询问,第 jj 个询问给出一个非负整数 yjyj,求其中,xor 表示按位异或运算。

Mege1的博客 1043

hive性能调优详解系列之hive语法和参数层面调优_数仓工程师必备hive调优方案

hive作为数仓工程师必不可缺少的计算组件,在工作中经常遇到一些调优问题,本篇文章是hive性能调优详解系列之第二篇hive语法层面调优。上一篇可点击hive建表设计层面调优 一.hive语法层面和参数调优 hive语法和参数调优将是hive调优一大重点,并能间接解决数据倾斜问题,同事提升运行效率也是重中之重。 1.1查看hive执行计划 Hive的SQL语句在执行之前需要将SQL语句转换成MapReduce任务,因此需要了解具体的转换过 程,可以在SQL语句中输入如下命令查看具体的执行计划。 ##查看执

老姜的数据江湖 2517

eNSP-交换机VLAN配置

VLAN

乌托托的博客 8806

OpenClaw的引导配置(onboard)流程

脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。

supersolon的专栏 1324

大数据hive性能调优详解系列之hive架构层面调优_数仓工程师必备hive调优方案

大数据技术框架中,hive组件作为数仓工程师必不可缺少的计算框架组件。本篇文章是hive性能调优详解系列之第三篇hive语法层面调优。 上两篇分别为 hive 建设表层面调优 hive 语法和参数层面调优 更多内容请关注哔哩:老姜的数据江湖,微信公众号同步; Hive架构层面 1.启用本地抓取 Hive的某些SQL语句需要转换成MapReduce的操作,某些SQL语句就不需要转换成MapReduce操作,例如: 1.只是select *的时候 2.where条件针对分区字段进行筛选过滤时 3.带有limi

老姜的数据江湖 579

K-近邻算法: k-nearest neighbor classification (kNN) 详细介绍

@创建于:2020.04.09 @修改于:2020.04.09,2024.06.22 文章目录1、kNN介绍2、k近邻法的三要素详解2.1 距离度量2.2 k值的选择2.3 分类决策规则3、k近邻法的实现:kd树4、Python实现过程5、优缺点6、常见问题 1、kNN介绍 kNN是一个基本而简单的分类算法,作为监督学习,那么KNN模型需要的是有标签的训练数据,对于新样本的类别由与新样本距离最近的k个训练样本点按照分类...

chenhepg的博客 9万+

大数据从业者必知必会的Hive SQL调优技巧

COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的。比如,select coll, col2 from your_table ,另外, where 条件中也尽量添加过滤条件,以去掉无关的数据行,从而减少整个 MapReduce 任务中需要处理、分发的数据量。

weixin_44066506的博客 1065

宇瞳杯安防镜头设计

宇瞳杯安防镜头设计

weixin_72050316的博客 1516

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Hive SQL调优技巧

数据分区是一种将数据按照某个字段进行分组存储的技术,可以有效减少查询时的数据扫描量。通过分区字段进行数据过滤,可以只对目标分区进行查询,加快查询速度。优化案例优化前:1.优化后:1.反面案例代码写死日期,一次性不合理扫描2年+日志数据。map数超20万,而且会越来越大,直到跑不出来。1.3.5 使用索引在Hive SQL中,可以通过创建索引来加速查询操作。通过在关键字段上创建索引,可以减少数据扫描和过滤的时间,提高查询性能。

2301_77257988的博客 503

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 大数据数仓建设流程方案,数仓设计流程,适用于实际工作场景
下一篇: hive性能调优详解系列之hive语法和参数层面调优_数仓工程师必备hive调优方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值