Hive&Hadoop面试常用问题精修篇_2

说明:

该章节接着针对Hive和Hadoop做面试的常用问题做了汇总和解答

1.Hadoop宕机

a.如果MR造成系统宕机

此时要控制Yarn同时运行的任务数,和每个任务申请的最大内存。

调整参数:yarn.scheduler.maximum-allocation-mb(单个任务可申请的最多物理内存量,默认是8192MB)

b.写入文件过快造成NameNode宕机

Kafka:调高kafka的存储大小,控制kafaka到hdfs的写入速度。

优化配置:调整Hadoop配置参数,如dfs.namenode.handler.count(服务器处理客户端请求的线程数)和dfs.blocksize(HDFS块的大小),可以优化NameNode的性能

2.Hadoop 解决数据倾斜方法

数据倾斜产生的原因

  1. Key分布不均匀:在MapReduce作业中,如果某些key的数量远多于其他key,会导致这些key被分配到同一个Reducer上,从而产生数据倾斜。

  2. 业务数据特性:某些业务场景下,数据本身就存在分布不均匀的情况,例如某些特定的用户ID或产品ID出现频率远高于其他。

  3. 建表时考虑不周:在数据仓库或数据存储设计时,如果没有考虑到数据分布的均匀性,可能会导致数据倾斜问题。

  4. SQL语句问题:某些SQL查询语句,如Join操作或Group By操作,由于字段选择不当或数据过滤不足,可能导致数据倾

数据倾斜解决的方法

a.提前在map进行combine,减少数据传输量

在Mapper时加入combiner相当于提前进行reduce,即把一个Mapper中的相同key进行聚合,减少shuffle过程中数据传输的数据量,以及Reducer端的计算量。

注:如果导致数据倾斜的key大量分布在不同的mapper的时候,该方法就不是很有效了

b.导致数据倾斜的key大量分布在不同的mapper------局部聚合+全局聚合

第一次在map阶段对导致数据倾斜的key加上1-n的随机前缀,这样本来相同的key也会被分不到多个ruducer中进行局部聚合,数据量就会大大降低

第二次 mapreduce去掉随机key的前缀,进行全局聚合

c.增加ruducer,提升并行度

JobConf.setNumReduceTasks(int)

d.实现自定义分区

根据数据分布情况,自定义散列函数,将key均匀分配到不同的reducer

3.Hive

hive的架构

hive的元存储默认在derby数据库中,不支持多客户端访问。为支持多客户端访问,需要将元数据存储到mysql中。

hive的部署模式  

内部表和外部表的区别

创建语法:创建外部表需要EXTERNAL的修饰

内部表删除时会将表和存储数据一起删除,外部表只会删除表,数据仍然存在。

内部表和外部表中转换语法(alter table 表名 set tblproperties('EXTERNAL'=TRUE))

内部表类型:MANAGED_TABLE 

外部表类型:EXTERNAL_TABLE

四种排序by的区别

order by:可以做全局有序,但处理较慢,底层使用reduce,且只能使用一个reduce

sort by:和distributed by 一起使用,可以做到局部有序

distributed by:不排序,结果和reduce的数量有关

cluster by:局部有序,结果和reduce的数量有关

reduce参数如何设置:set mapreduce.job.reduces=n

系统函数

(1)date_add、date_函数(加减日期)

(2)next_day函数(周指标有关)

(3)date_format函数(根据格式整理日期)

(4)last_day函数(求当月最后一天日期)

(5)collect_set get_json_object解析json函数

(6)nvl(表达式1,表达式2)如果表达式1为空值,则返回表达2的值,否则返回表达式1的值

(7)coalesce(返回第一个不为空的值)

(8)case when then end(满足when的条件,则返回then的操作)

(9)脱敏类函数:

mask_hash('字符串') 返回字符串的hash编码

select mask_first_n("abc123DEF",4); 对前n个进行脱敏替换

select mask_show_first_n("abc123DEF",4) 除了前n个字符,其余进行掩码处理

窗口函数

(1)排序函数:

row_number   按照行序列号返回

rank                并列跳号机制

dense_rank    并列不跳号机制

(2)聚合函数:

sum()    求和

avg()     平均值

min()      最小值

max()     最大值

(3)分析函数:

lag 往前取值,默认偏移量为1

lead往后取值,默认偏移量为1

first_value() 取第一个数

last_value() 取最后一个数

HIVE优化

a.SQL方面

(1)行列过滤:在select中,只需要拿到需要的列等

(2)减少job数

(3)使用group by代替count distinct完成计算

(4)优先过滤后进行join操作

b.建表方面

(1) 创建分区表或分通表,避免全表查询

(2)创建表时使用snappy+orc的存储模式

注:使用snappy+orc模式的优势

snappy提供了较快的压缩和解压缩方式

高效的存储空间利用

优化查询性能:orc文件格式本身支持高校的查询性能,orc本身使用按行分组按列存储的特性兼具行式存储和列式存储的优点

多种索引:ORC提供了多种索引,如row group index、bloom filter index,这些索引可以进一步优化查询性能。

c.参数

(1)merge输出合并小文件

set hive.merge.mapfiles=true;--默认true,在map-only任务结束时合并小文件

set hive.merge.mapredfiles=true;--默认false,在map-reduce任务结束时合并小文件

(2)在Map执行前合并小文件,减少Map数

(3)开启map端combiner

(4)合理设置map数和reduce数,不宜太多也不宜太少

d.其他

(1)fetch抓取策略

fetch设置语句
set hive.fetch.task.conversionetch.task.conversion

none         都走mp

minimal    where 走mp

more         都不走mp

(2)本地模式

set hive.exec.mode.local.auto=true

(3)动态分区

:需要先开启严格模式 

set hive.exec.dynamic.partition.mode=nonstrict;  -- 开启非严格模式 默认为 strict(严格模式)
set hive.exec.dynamic.partition=true;  -- 开启动态分区支持, 默认就是true

可选的参数:

set hive.exec.max.dynamic.partitions=1000; -- 在所有执行MR的节点上,最大一共可以创建多少个动态分区。
set hive.exec.max.dynamic.partitions.pernode=100; -- 每个执行MR的节点上,最大可以创建多少个动态分区
set hive.exec.max.created.files=100000; -- 整个MR Job中,最大可以创建多少个HDFS文件

(4)JVM重用

Hadoop采用了推测执行(Speculative Execution)机制,它根据一定的法则推测出“拖后腿”的任务,并为这样的任务启动一个备份任务,让该任务与原始任务同时处理同一份数据,并最终选用最先成功运行完成任务的计算结果作为最终结果。关于调优推测执行机制,还很难给一个具体的建议。如果用户对于运行时的偏差非常敏感的话,那么可以将这些功能关闭掉。如果用户因为输入数据量很大而需要执行长时间的map或者Reduce task的话,那么启动推测执行造成的浪费是非常巨大。

HIVE常用的函数

排序函数:rank,dense_rank,row_number

聚合函数:sum,count,avg,min,max

字符串函数:substr,reverse(字符串反转),concat,concat_ws,爆炸函数,regexp_replace正则替换

关系函数:like比较,等级比较,小于比较,非空判断等

数学运算:加减乘除,取余%等

逻辑运算:and or not

条件运算:if,case,round近似函数

日期函数:year,month,day,hour日期函数to_data等

4.基于Hive的数据倾斜的原因及解决方案

数据倾斜的表现

hadoop中数据倾斜的表现
1 )有一个或多个 reduce 任务卡住,卡在 99.99% , 一直不能结束
2 )各种 container 报错 OOM
3 )异常的 Reducer 读写的数据量极大,至少远远超过其他正常的 Reducer
4 )伴随着数据倾斜,会出现任务被 kill 等各种诡异的表现
Hive中的数据倾斜
一般都发生在 Sql group by Join on 上,而且和数据逻辑绑定比较深
Spark 中的数据倾斜
Spark 中的数据倾斜,包括 Spark Streaming SparkSQL ,主要表现有以下几种: Executor
lost OOM Shuffle 过程出错; Driver OOM ;单个 Executor 执行时间特别久 ,整体任务卡
在某个阶段不能结束;正常运行的任务突然失败。

数据倾斜产生的原因及解决方法

key值分布不均
这包括空值以及单一 key 值或几个 key 值过多 , 这样的情况我们一般是打散计算,空值过滤或者
 
将为空的 key 转变为字符串加随机数或纯随机数,将因空值而造成倾斜的数据分不到多个
Reducer
建表时考虑不周
例子:比如我公司刚开始是就有两张表,一张是 user 用户表,一张是 log 日志表,为两个不同部
门创建的,两表关联字段为 user_id ,但 user 表的 user_id int 类型, log 表里的 user_id
string 类型,这时候直接关联的话就会产生数据倾斜,那我们可以使用 cast 函数间 int 类型的字
段转为 string 类型。
业务数据量激增
例子:像我们这电商行业,每逢双十一双十二订单量都会激增,特别是深圳杭州北京上海等一
线城市订单增长了百分之一万,其余城市增长的并不是很多,然后我们要统计不同城市的订单
情况,这样一做 group by 根据城市分组统计用于的操作,可能直接就数据倾斜了
像这样的数据倾斜,可以开启数据倾斜时负载均衡和 mapjoin 使用两次 MapReduce ,第一次
打散计算,第二次在最终聚合计算。完成后和其他城市进行整合;
count distinct 去重统计,这样也比较容易产生数据倾斜
使用 groupby 代替,这里使用了子查询,第一条查询语句是按照 key 分组,第二条查询是统
计,这时候就实现了去重统计,避免了数据倾斜。

5.Sqoop

Sqoop的常用参数

sqoop import \ --connect jdbc:mysql://192.168.88.80:3306/teach \            --数据源

--username root \                                                                                        --账号及密码

--password 123456 \ --query "select  *, '2024-5-20'as dt from tbh_student_signin_record where 1=1 and (signin_date between '1970-01-01 00:00:00' and '2024-05-20 23:59:59') and \$CONDITIONS" \                                                 --查询全部字段并按照2024-5-20建立第一个分区 --split-by id \                                                                                                 --按照id分割数据

--hcatalog-table edu_ods_tbh_student_signin_record_i \                            --写入表

--hcatalog-database edu_ods \                                                                    --写入库

-m 10                                                                                               --使用10个映射器

Sqoop数据导出Parquet(orc)的问题

导入数据时,如果数据文件为orc格式则不能导入,需转化成text。

明确以下三点:

(1)创建临时表,把orc中表数据导入到临时表,再把临时表中的数据导入到目标表

(2)sqoop中有参数,可以直接把orc文件转换至text

(3)ads层建表时不要见orc表

Sqoop中导入导出null存储一致性问题

hive中null在底层用/n来存储,而Mysql中的null在底层就是Null,为保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string--null-non-string

Sqoop数据导出一致性问题

当Sqoop导出数据到MySql时,使用4map怎么保证数据的一致性因为在导出数据的过程中map任务可能会失败,可以使用—staging-table –clear-staging任务执行成功首先在tmp临时表中,然后将tmp表中的数据复制到目标表中即可(这个时候可以使用事务,保证事务的一致性)

Sqoop在导入数据时候数据倾斜问题的解决方法

Sqoop 参数:split-by:按照自增主键来切分表的工作单元。num-mappers:启动 N map 来并行导入数据,默认 4

Sqoop的同步策略

全量同步
每天将 MySQL 中该表的全量数据导入到 Hive 中,按照分区进行存储,每个分区中都是当天的
时间切片(该表必须不能太大)。
增量同步
增量同步只适合 MySQL 中只存在新增(如支付流水表、订单状态流水表),不存在删除与修改
的表,在 Hive 中以分区的形式进行同步和存储,这样的表在 Hive 中叫增量表。
新增及变化同步(与全量同步场景唯一的区别是数据量很大,为了减少冗余)
不能使用简单的分区
一般在业务那边维护 2 个时间字段,一个是订单创建时间 create_time ,一个是订单修改时间
operator_time
实现要么通过在业务表中增加 create_time operator_time, 要么使用工具如 canal 进行
binlog 的解析。
  • 33
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值