Hadoop学习
2024-03-09 12:13:06 0 举报
AI智能生成
Hadoop学习是指掌握大数据处理技术的过程,该技术以Hadoop框架为核心。Hadoop是一个由Apache开发的开源软件,主要用于分布式存储和计算,能够处理大数据量。学习Hadoop包括理解其核心组件如Hadoop分布式文件系统(HDFS)、MapReduce以及YARN等。学习者需要掌握如何配置Hadoop环境,如何使用MapReduce进行数据分析,以及如何优化Hadoop集群以提高性能。此外,学习Hadoop还需了解如何与其他大数据工具集成,如Hive、性能优化等,以提高数据处理的效率。
作者其他创作
大纲/内容
Hadoop三大组件
HDFS
定义
Hadoop Distribute File System,Hadoop 分布式⽂件系统
分布式存储服务
储存超大规模数据
组件
HDFSclient
文件切分:将文件切分成block上传存储在hadoop
上传,访问文件,与namenode交互,获取文件信息
与datanode交互,读写数据
提供命令管理HDFS
namenode
记录元数据信息,
分割多少块
每块大小
每个块的路径
配置副本策略
处理客户端读写请求
从datanode调用
datanode01
datanode02
datanode03
datanode ......
datanode
听命于namenode
存储实际数据块
执行数据块的 i/o 操作
secondary namenode
辅助namenode
分担工作量
并非NN的热备,NN挂掉时不能马上替换NN提供服务
Hadoop (HDFS)分布式文件系统基本操作
查看备注或连接
读写流程
写入数据(上传)
Client node通过Distributed FileSystem模块向Namenode请求上传文件
Namenode会检查目标文件是否已存在
正常就通知client node可以上传
存在则返回异常,停止上传
client node会向namenode请求第一个block上传到哪一个data node上
namenode会给client node返回若干个atanode节点的信息(根据当前HDFS文件系统设置)
distributed filesystem会向client node返回一个支持文件定位的输出流对象,
FSData Outputstream用于client node写数据
FSData Outputstream用于client node写数据
client node通过FSData Outputstream模块请求向Datenode 1(假设三个datanode)上传数据
datenode 1收到请求会继续调用datenode 2,然后 dn2调用dn3将这个通信管道建立完成
Datanode 1,2,3 逐级应答客户端
开始写入 ,client往Datanode 1上传第一个block,
以packet为单位,DN1收到一个packet就会传给DN2,2传给3
以packet为单位,DN1收到一个packet就会传给DN2,2传给3
dn1每传一个packet会放入一个应答队列,等待应答
当一个block传输完成之后,客户端再次向namenode请求上传第二个block的datanode节点列表
开始新一轮的数据上传操作
读取数据(下载)
Client node通过Distributed file system向namenode请求获得的文件的开始部分或全部block列表
(列表中对于每个返回的block都包含其对应数据所在的datenode地址)
(列表中对于每个返回的block都包含其对应数据所在的datenode地址)
对应的datenode会按照hadoop的定义的集群拓扑结构计算得出与client node之间的距离,排序
client node会优先从距离最近的datanode上读取数据,在极端条件下,如果client node
本身就是一个datanode且保存要读取的数据,那么它将从本地读取数据
本身就是一个datanode且保存要读取的数据,那么它将从本地读取数据
distributed filesystem会向client node返回一个支持文件定位的
输入流对象,FSDataInputstream,用于client node读取数据
输入流对象,FSDataInputstream,用于client node读取数据
FSDataInputstream包含
dfsinputstream对象
dfsinputstream对象
用来管理data node和。
和namenode之间的I/O
和namenode之间的I/O
开始读数据时clientnode会调用read()方法
dfsinputstream就会找出离client node最近的datanode,并连接datanode
若有读取失败等异常情况,
dfsinputstream会尝试连接下一个离它最近的datanode
dfsinputstream会尝试连接下一个离它最近的datanode
连接成功后在数据流中重复调用read函数,直到这个块儿全部读完为止
当第一个block块儿的数据读完就会关闭指向第一个block块儿的data node连接,接着读取下一个block块儿
第一批block都读取,完了dfsinputstream就会去namenode拿下一批block的地址信息,然后继续读
所有的block块儿都读完,这时就会关闭掉所有的流,最终读取出来的所有的block块儿合并成一个完整的最终文件
mapreduce
分布式处理和计算
map
将复杂任务分解成若干个简单的任务
把输入的数据经过切割,全部标记1,因此输出就是<单词,1>。
shuffle
本意是洗牌、混洗的意思
在MapReduce中,指的是将map端的无规则输出,按指定的规则“打乱”成具有一定规则的数据,以便reduce端接收处理
从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle
经过MR程序内部自带默认的排序分组等功能,把key相同的单词会作为一组数据构成新的kv对。
reduce
对map阶段的结果全局汇总
处理shuffle完的一组数据,该组数据就是该单词所有的键值对。对所有的1进行累加求和,就是单词的总次数。
技术层面运算过程
Map阶段执行过程
·第一阶段∶把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。
默认切片大小Split size = Block size ( 128M ),每一个切片由一个MapTask处理。( getSplits )·
默认切片大小Split size = Block size ( 128M ),每一个切片由一个MapTask处理。( getSplits )·
逻辑切片规划
/ 例如:→
/ 例如:→
txt1 300m
三个切片
三个map task
txt2 200m
两个切片
两个map task
·第二阶段:对切片中的数据按照一定的规则读取解析返回<key, value>键值对。
默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat )·
默认是按行读取数据。key是每一行的起始位置偏移量,value是本行的文本内容。(TextInputFormat )·
·第三阶段∶调用Mapper类中的map方法处理数据。每读取解析出来的一个<key , value> ,调用一次map方法。
第四阶段∶按照一定的规则对Map输出的键值对进行分区partition。默认不分区,因为只有一个reducetask.分区的数量就是reducetask运行的数量。
第五阶段:Map输出数据写入内存缓冲区memory buffer,达到比例溢出到磁盘上(溢写)。
溢出spill的时候根据key进行排序sort。默认根据key字典序排序。
溢出spill的时候根据key进行排序sort。默认根据key字典序排序。
·第六阶段:对所有溢出文件进行最终的merge合并,成为一个文件。
Reduce阶段执行过程
第一阶段:ReduceTask会主动从MapTask复制拉取属于需要自己处理的数据。
第二阶段︰把拉取来数据,全部进行合并merge,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法。最后把这些输出的键值对写入到HDFS文件中。
shuffle机制
Map端Shuffle过程
Collect阶段∶将MapTask的结果收集输出到默认大小为100M的环形缓冲区,保存之前会对key进行分区的计算,默认Hash分区
Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
Merge阶段︰把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
Reduce端Shuffle过程
Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据。
Merge阶段∶在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。
Sort阶段∶在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,
ReduceTask只需保证Copy的数据的最终整体有效性即可。
ReduceTask只需保证Copy的数据的最终整体有效性即可。
shuffle机制弊端
Shuffle是MapReduce程序的核心与精髓,是MapReduce的灵魂所在
Shuffle也是MapReduce被诟病最多的地方所在。
MapReduce相比较于Spark、Flink计算引擎慢的原因,跟Shuffle机制有很大的关系。
MapReduce相比较于Spark、Flink计算引擎慢的原因,跟Shuffle机制有很大的关系。
Shuffle中频繁涉及到数据在内存、磁盘之间的多次往复。
Yarn
是hadoop集群中的资源管理调度系统
调度资源
管理任务
主从结构,master/slave
主要组件
ResourceManager(RM)
ResourceManager(RM) 负责处理客户端请求,对各NM上的资源进行统一管理和调度。
给 ApplicationMaster分配空闲的Container运行并监控其运行状态。
给 ApplicationMaster分配空闲的Container运行并监控其运行状态。
主要由两个组件构成:
调度器和应用程序管理器:
调度器和应用程序管理器:
调度器(Scheduler)
调度器根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序。
调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container。
Shceduler不负责监控或者跟踪应用程序的状态。
总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在 Container中的资源。
调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container。
Shceduler不负责监控或者跟踪应用程序的状态。
总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为应用程序分配封装在 Container中的资源。
应用程序管理器(Applications Manager)
应用程序管理器负责管理整个系统中所有应用程序,
包括应用程序提交、与调度器协商资源以启动ApplicationMaster、
监控 ApplicationMaster运行状态并在失败时重新启动等,
跟踪分给的Container的进度、状态也是其职责。
包括应用程序提交、与调度器协商资源以启动ApplicationMaster、
监控 ApplicationMaster运行状态并在失败时重新启动等,
跟踪分给的Container的进度、状态也是其职责。
NodeManager(NM)
NodeManager是每个节点上的资源和任务管理器。
它会定时地向 ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态;
同时会接收并处理来自ApplicationMaster的Container启动/停止等请求。
它会定时地向 ResourceManager汇报本节点上的资源使用情况和各个Container的运行状态;
同时会接收并处理来自ApplicationMaster的Container启动/停止等请求。
ApplicationMaster(AM)
用户提交的应用程序均包含一个ApplicationMaster,负责应用的监控,跟踪应用执行状态,重启失败任务等。
ApplicationMaster是应用框架,它负责向 ResourceManager协调资源,
并且与NodeManager协同工作完成Task的执行和监控。
ApplicationMaster是应用框架,它负责向 ResourceManager协调资源,
并且与NodeManager协同工作完成Task的执行和监控。
Container
Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,
当ApplicationMaster向ResourceManager申请资源时,ResourceManager为ApplicationMaster返回的资源便是用Container表示的。
当ApplicationMaster向ResourceManager申请资源时,ResourceManager为ApplicationMaster返回的资源便是用Container表示的。
HIVE
产生背景
直接使⽤MapReduce处理⼤数据问题
MapReduce 开发难度大
底层是java语言
使用MapReduce框架进行开发
成本大
项目周期长
HDFS 文件没有字段名,没有数据类型,不方便进行数据的有效管理
定义
是基于hadoop的⼀个数据仓库⼯具
将SQL转换为MapReduce的任务进⾏计算
是工具,并非数据库
Hive处理的数据存储在HDFS
Hive分析数据底层的实现是MapReduce
执行程序运行在Yarn上
把结构化的数据⽂件映射为⼀张表(类似RDBMS中的表),并提供类似SQL查询功能
底层由HDFS来提供数据存储;
优缺点
优点
1)操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
2)避免了去写MapReduce,减少开发人员的学习成本
3)Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高
离线数据分析
4)Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
缺点
1)Hive的效率比较低
Hive自动生成的MapReduce作业,通常情况下不够智能化
Hive调优比较困难,粒度较粗
2)Hive的HQL表达能力有限
迭代式算法无法表达
数据挖掘方面不擅长
与关系型数据库对比
如图
hive 数据类型
基本数据类型
常用:int 、string
hive ql中没有number 、varchar2
集合型数据类型
案例
map
array
类型转换
CAST
CAST('1' AS INT)
HIVE语法
DDL
创库
create database [if not exists] database_name
-- 创建数据库[comment dtabase_comment][location hdfs_path];
-- 创建数据库[comment dtabase_comment][location hdfs_path];
案例
create database if not exists ods
comment 'data warehouse ods'location '/ods';
comment 'data warehouse ods'location '/ods';
修改库
对库的一些命令:查看、删除、切换
创表
语法
案例
temporary table
临时表
退出后不保存
external table
外部表
删除表的时候,会把在hive里面的元数据删除,不会删除对应的数据文件
因为数据由hdfs管理
table
内部表/管理表
删除表的时候,会把在hive里面的元数据删除以及对应的hdfs的文件删除
hive自己管理
分区表
partitioned by (month string)
--以month字段分区,
针对存储路径分,分文件夹
分桶表
clustered by(id)
into 4 buckets
into 4 buckets
以id字段分4个桶
转化hash code ,和4做hash运算来分,一般取余
针对的文件分,分数据文件
复制表
表结构和数据 as
create table ods_emp2 as select * from test.ods_emp1;
表结构
create table ods_emp4 like ods_emp2 location '/test/ods_emp2';
修改表
重命名
ALTER TABLE table_name RENAME TO new_table_name
添加列
alter table dept_partition add columns(deptdesc string);
替换列
alter table dept_partition replace columns(deptno string, dname string, loc string);
更新列
alter table dept_partition change column deptdesc desc int;
删表
drop table dept_partition;
删外部表
转成内部表再删
ALTER TABLE xxx SET TBLPROPERTIES('EXTERNAL'='False');
drop table xxx;
drop table xxx;
删除元数据信息后,去HDFS删除数据
DML
数据导入
语法
向表中加载load
load data [local] inpath '文件路径' [overwrite] into table 表名 [partition (partcol1=val1,…)];
向表中插入insert
基本插入
insert into table student partition(month='201709') values(1,'wangwu');
查询插入
insert overwrite table student partition(month='201708')
select id, name from student where month='201709';
select id, name from student where month='201709';
多插入
from dept_partition
insert overwrite table dept_partition partition(month='201707')
select deptno,dname,loc where month='201709'
insert overwrite table dept_partition partition(month='201706')
select deptno,dname,loc where month='201709';
insert overwrite table dept_partition partition(month='201707')
select deptno,dname,loc where month='201709'
insert overwrite table dept_partition partition(month='201706')
select deptno,dname,loc where month='201709';
As select
create table as select.........
Import数据到
指定Hive表中
指定Hive表中
import table student2 partition(month='201709') from '/opt/hive/warehouse/export/student';
静态分区
不同文件分别加载到不同分区
多个分区时
partitioned by (year string,month string)
load .........................................partition (year='2023',month='12');
动态分区
同一文件,加载到普通表后再通过查询插入分区表
开动态分区
set hive.exec.dynamic.partition=true;
设置非严格模式
set hive.exec.dynamic.partition.mode=nonstrict;
导入分桶表
文件加载到普通表后通过查询插入分桶表
案例
开启分桶
set hive.enforce.bucketing=true;
设置reduce个数
set mapreduce.job.reduces=3;
数据导出
Insert导出
本地
查询结构导出
insert overwrite local directory '/opt/datas' select * from dept_partition;
查询结果格式化导出
insert overwrite local directory '/opt/datas/dept1'
row format delimited
fields terminated by '|'
select * from dept_partition;
row format delimited
fields terminated by '|'
select * from dept_partition;
HDFS
没有(local)
没有(local)
insert overwrite directory '/opt/datas/dept'
row format delimited
fields terminated by '|'
select * from dept_partition;
row format delimited
fields terminated by '|'
select * from dept_partition;
Hadoop命令导出到本地
dfs -get /opt/hive/warehouse/employee/employee.txt /opt/datas/dept2/dept.txt;
Export导出到HDFS上
export table hivetest.dept_partition to '/opt/datas/dept2';
清除数据
Trancate table
DQL
语法
分支主题
hive的性能优化
架构优化
执行引擎
Hive支持的执行引擎:MapReduce,Tez,Spark
可以通过hive-site.xml文件中的hive.execution.engine属性控制
优化器
向量优化器
(要求引擎为Tez,文件格式为ORC)一次批量执行1024行而非一行来提高扫描,聚合,过滤器和连接等操作的性能。
实现方式
成本优化器(CBO)
(基于apatch Calcite),通过查询成本(收集表的信息,例如表的大小,有多少条数据,数据如何分布)而生成有效率的执行计划,
最终减少执行的时间和资源的利用。
除了一下设置要配置之外还需要定期执行表(analyze)的分析,分析后的数据放在元数据库中。
最终减少执行的时间和资源的利用。
除了一下设置要配置之外还需要定期执行表(analyze)的分析,分析后的数据放在元数据库中。
实现方式
使用分区表
提高查询的性能
减少数据扫描范围,只看需要的独立目录
提高数据过滤效率
指定分区列的值来过滤数据
使用分桶表
基于分桶字段查询时,减少全表扫描
JOIN时可以提高MR程序效率,减少笛卡尔积数量
分桶表数据进行高效抽样
设置文件格式
创表时,stored as… 指定表的存储格式
提高Hive数据存储HDFS后的读写性能
不同的文件存储格式具有不同的存储特点,
有的可以降低存储空间
有的可以提高查询性能
行式存储和列式存储
详情
TextFile
hive中默认格式,行式储存
应用场景
小数据储存,一般用于第一层数据加载和测试
优点
简单,可直接查看;支持任意隔符分割;搭配压缩使用
缺点
耗空间,性能差;
Parquet
列式储存
应用场景
适用于字段数多,不更新。只取部分列查询
优点
高效的数据压缩和编码;可压缩、可分割;
缺点
不支持update,insert,delete,ACID
SequenceFile
以二进制的KV形式
应用场景
适用于小量数据,但查询列较多
优点
底层交互好,性能快,查询效率高;可分割,压缩;可用于储存小文件
缺点
耗空间大,不兼容Hadoop生态外工具
ORC
列式储存
应用场景
适用于hive大型储存和查询
优点
效率非常高;支持索引,支持矢量查询
缺点
性能消耗大
ORC文件索引
写入时构建指定索引
查询时可根据索引提前过滤
Row Group index
Bloom Filter index
ORC矢量化查询
每批1024行,一次性整个记录整合
数据压缩
数据规模大且工作负载密集时,Mapreduce运行时,磁盘i/o操作,数据传输花大量时间。
数据压缩 有利于对节省资源,最小化磁盘读写和网络传输
优点
减少储存空间;减少io次数,加快传输效率
缺点
使用文件时需要解压,压缩算法越复杂,解压越长
格式比较
性能速度比较
Lz4>Lzo>Gzip>Bzip2
压缩后文件大小比较
Lzo>Gzip>Bzip2
实现方式
开启hive中间传输数据压缩功能
开启Reduce输出阶段压缩
参数优化
本地模式
处理数据量小,用分布式处理浪费资源
设置某条件下自动使用本地模式
会启用的条件
输入文件的大小小于hive.exec.mode.local.auto.inputbytes.max 配置的大小
map任务的数量小于 hive.exec.mode.local.auto.input.files.max 配置的大小
reduce任务的数量是1或者0
严格模式
该模式下用户不能执行有风险的HiveQL语句,避免出现资源耗费风险
启用后,无法操作
查询分区表时不限定分区列的语句
两表join产生了笛卡尔积的语句
用没有指定limit的order by排序语句。
JVM重用
默认
Hadoop为每一个map或者reduce启动一个JVM,这样可以并行执行map和reduce
map或reduce运行的作业非常小
JVM启动进程所耗费的时间比作业执行的时间还要久
优化
重用JVM,通过共享JVM以串行而非并行的方式运行map或者reduce
仅适用与同一个作业的map和reduce,
对于不同作业的task不能共享JVM
对于不同作业的task不能共享JVM
配置一个作业最大task数。默认为1,若设置为-1代表不限制
SET mapreduce.job.jvm.numtasks=5;
缺点
其会一直占用使用到的task插槽,以便进行重用直到任务完成后才能释放
并行模式
Hive的查询通常会转换成一系列的stage(阶段)
stage(阶段)之间并不是一直相互依赖
推测模式
原因背景
优化解决
set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true
set hive.mapred.reduce.tasks.speculative.execution=true
set mapreduce.reduce.speculative=true
set hive.mapred.reduce.tasks.speculative.execution=true
合并小文件
在map执行前合并小文件,减少map数
实现
在Map-Reduce的任务结束时合并小文件
实现
避免元数据信息
多个map task
Fetch模式
背景
Hive中某些情况的查询可以不必使用MapReduce计算
解决
可以简单地读取表对应的存储目录下的文件,然后输出查询结果到控制台
实现
开启fetch模式之后,在全局查找、字段查找、limit查找等都不启动 MapReduce
SQL优化
列裁剪、分布裁剪
只读取某字段
只读取某分区
sort by 代替
order by
order by
sort by
启动多个reduce进行排序
保证每个reduce内部有序
配合distribute by一同使用
可控制map端数据分配到reduce的key
否则map端的数据就会随机分配到reduce
order by
将结果按某字段全局排序
导致所有map端都进入一个reduce中
group by
代替count(district)
-- 原始SQL select count(distinct uid) from tab;
-- 优化后的SQL select count(1) from (select uid from tab group by uid) tmp;
优化
group by
配置调整
配置调整
map端预聚合
group by时,如果先起一个combiner在map端做部分预聚合,可以有效减少shuffle数据量
-- 默认为true
set hive.map.aggr = true
set hive.map.aggr = true
调整Map端进行聚合操作的条目数
set hive.groupby.mapaggr.checkinterval = 100000
倾斜均衡配置项:
修改参数配置
修改参数配置
--默认为false
set hive.groupby.skewindata = true
set hive.groupby.skewindata = true
开启后
开启该参数以后,当前程序会自动通过两个MapReduce来运行
第一个MapReduce自动进行随机分区,然后实现聚合
第二个MapReduce将聚合的结果再按照业务进行处理,得到结果
join基础优化
一般
common join
普通连接
缺点:性能较差(要将数据分区,有shuffle)
优点:操作简单,普适性强
优点:操作简单,普适性强
优化
map join
适用场景:
大表与小表连接,小表数据量应该能够完全加载到内存
优点
不会有reduce阶段存在,连接在map端完成
一般数据倾斜发生在reduce阶段
map阶段不会
map阶段不会
缺点
适用场景单一,范围小,只适用大小表连接
生效
set hive.auto.convert.join = true; --是否开自动mapjoin
set hive.mapjoin.smalltable.filesize; --mapjoin的表size大小
set hive.mapjoin.smalltable.filesize; --mapjoin的表size大小
命令
/*+mapjoin(tablelist)*/
tablelist 可以是一个表,或以逗号连接的表的列表。
tablelist 中的表将会读入内存,通常应该是将小表写在这里。
tablelist 中的表将会读入内存,通常应该是将小表写在这里。
Bucket Join
适用场景
两个表的join key 就是bucket column 的时候
参与join的表均为分桶表,且其中一张表的分桶数量是另外一张表分桶数量的整数倍
应用在map join的场景中
生效
set hive.optimize.bucketmapjoin = true
csdn链接
处理空值或无意义值
join时这些空值就会非常集中,拖累进度
被认为同一key值分到同一reduce
因为shuffle阶段的hash操作,只要key的hash结果是一样的,
它们就会被拉到同一个reduce中。
它们就会被拉到同一个reduce中。
优化
不需要空值数据
,就提前写 where 语句过滤掉
需要空值
空值key用随机方式打散
使用Skew Join
原理:是将Map Join和Reduce Join进行合并
专门为了避免数据倾斜而设计
将产生数据倾斜的数据单独使用Map Join来实现
其他没有产生数据倾斜的数据由Reduce Join来实现
开启
set hive.optimize.skewjoin=true;
设置
set hive.skewjoin.key=100000;
--key的出现的次数超过这个范围时
判断
set hive.optimize.skewjoin.compiletime=true;
-- 在编译时判断是否会产生数据倾斜
分支主题
set hive.optimize.union.remove=true;
不合并,中间数据进行重复性利用,提升union性能
分支主题
set mapreduce.input.fileinputformat.input.dir.recursive=true;
Hive的底层走的是MapReduce,必须开启这个属性,才能实现不合并(处理包含多个层级目录的数据)
数据倾斜
定义
在 MapReduce 计算框架中,大量相同的key被分配到了同一个任务上,
表现为
任务进度长时间维持在 99%或者 100%的附近
查看任务监控页面,发现只有少量 reduce子任务未完成
因为其处理的数据量和其他的 reduce 差异过大。单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大于平均时长。
什么情况下会出现
发生在 Map阶段
一般是由于 HDFS 数据存储不均匀造成的
(一般存储都是均匀分块存储,每个文件大小基本固定)
(一般存储都是均匀分块存储,每个文件大小基本固定)
发生在Reduce阶段
没有考虑到某种key值数据量偏多的情况而导致的
Reduce阶段最容易出现数据倾斜的两个场景分别是Join和Count Distinct
原因
key分布不均匀
业务数据本身的特性
建表时考虑不周
某些SQL语句本身就有数据倾斜
容易出现
join
其中一个表较小,但是key集中
分发到某一个或几个reduce上的数据远高于平均值
大表与大表,但是分桶的判断字段0值或空值过多
空值都由一个reduce处理,非常慢
Count Distinct
某特殊值过多
处理此特殊值的reduce耗时
group by
group by 维度过小,某值的数量过多
处理某值的reduce耗时
优化
一、优先开启负载均衡
某一特殊key值大量出现,语句中仅出现group by,
没有相应的聚合函数一起
(聚合函数可以在map阶段提前进行聚合,降低数据倾斜风险),
会造成对应key的reduce出现数据倾斜
没有相应的聚合函数一起
(聚合函数可以在map阶段提前进行聚合,降低数据倾斜风险),
会造成对应key的reduce出现数据倾斜
解决策略是对key值进行加严处理:
二、表连接时
表连接的key存在倾斜,
那么在 Shuffle 阶段必然会引起数据倾斜
那么在 Shuffle 阶段必然会引起数据倾斜
大表与小表相连时
用map join
用map join
使用map join
避开shulffle和reduce
避开shulffle和reduce
表中作为关联条件的
字段值为0或空值的较多
字段值为0或空值的较多
①提前用where过滤
②给空值添加随机key值,这样它们的hash结果就不一样
将其分散到不同的reduce中处理
将其分散到不同的reduce中处理
表中作为关联条件的字段
重复值过多
重复值过多
row_number ()over(partition by
去重
去重
两表连接的key数据类型不同
例如:
a表key为int;
b表key有string和int
a表key为int;
b表key有string和int
默认的Hash操作会按int型的code来进行分配
所有的string类型都被分配成同一个code
结果所有的string类型的字段进入到一个reduce中
解决
用cast
将int转为string
将int转为string
SELECT *
FROM users a
LEFT JOIN logs b
ON a.usr_id = CAST(b.user_id AS string);
FROM users a
LEFT JOIN logs b
ON a.usr_id = CAST(b.user_id AS string);
三、count distinct 大量相同特殊值
Distinct操作本身会有一个全局排序的过程
不存在分组字段时,Count Distinct操作仅生成一个Reduce 任务
对全部数据进行去重统计
对全部数据进行去重统计
存在分组字段时,可能某些 Reduce 任务需要去重统计的数量非常大
四、数据膨胀引发的数据倾斜
多维聚合计算时
进行分组聚合的字段过多,且数据量很大
Map端的聚合不能很好地起到数据压缩的情况下,会导致Map端产出的数据急速膨胀
容易导致作业内存溢出的异常。如果log表含有数据倾斜key,会加剧Shuffle过程的数据倾斜
五、其他情况
采样倾斜key并分拆join操作
增加并行度
等等
AI生成的
Hive性能优化
Hive性能优化
查询优化
数据分区
按照字段进行分区
按照时间范围进行分区
按照地理位置进行分区
数据压缩
使用Snappy压缩算法
使用LZO压缩算法
使用Gzip压缩算法
数据索引
创建索引
合理使用索引
数据倾斜处理
使用随机数进行数据倾斜处理
使用MapJoin进行数据倾斜处理
使用Reduce端的负载均衡进行数据倾斜处理
查询调优
使用Tez引擎
调整并行度
合理设置内存参数
合理设置IO参数
使用CBO(Cost Based Optimization)优化器
数据倾斜处理
使用动态分区
使用Bucket表
使用MapJoin
性能优化
查询性能优化
使用索引
使用分区和分桶
调整并行度
使用压缩
使用向量化查询
调优技巧
优化查询计划
避免全表扫描
合理使用缓存
适当增加硬件资源
优化数据模型
调整参数设置
调整内存参数
调整并行度参数
调整IO参数
数据倾斜的解决
数据倾斜的原因
数据分布不均匀
数据倾斜的键
数据倾斜的操作
解决方案
重新分区或分桶
使用动态分区
使用随机前缀
使用MapReduce调整数据倾斜
使用Join优化
使用聚合函数优化
使用SMB Join优化
使用数据倾斜优化工具
使用Hive on Tez优化
使用Spark SQL优化
使用Presto优化
使用Flink优化
使用数据倾斜解决方案评估工具
使用数据倾斜监控工具
使用数据倾斜自动修复工具输出:
hive的性能优化和数据倾斜的解决的相关资料查询性能优化
linux系统
Unix
linux
特点
开放性
开源
多用户多任务
windows属于单用户多任务
应用领域
服务器系统
web应用系统,数据库服务器,游戏服务器
嵌入式系统
路由器,防火墙,手机,交换器,家电的微电脑控制器
高性能计算、精密值应用
IBM的watson超级计算机使用的 linux 系统
桌面应用系统
手机系统
安卓
安装
虚拟机
配置IP
linux命令
操作命令
shell语言
脚本命令
自我加强记忆
变量
使用变量
${ }
所有变量加 { }
字符串里有变量用双引号
输出字符长度
截取、提取字符
参数
传参
运算符
算数运算符
案例
关系运算符
案例
字符运算符
案例
逻辑运算符
文件测试运算
流程控制
if条件判断
案例
多分支
if then
elif then
else
fi
elif then
else
fi
for循环
while循环
until循环
函数function
三剑客
grep 、sed、awk
grep详解
sed详解
awk详解
0 条评论
下一页