9、hive里面经常用到的几个不同的排序分别是什么,有什么区别?
30、hdfs里面,写入数据(上传文件)和读取数据(下载文件),过程流程和原理是什么?
31、hdfs里面,常用的操作命令有哪些?上传、下载、合并等等。
33、如果现在,做数据的增量抽取,如何在重复抽取的过程中,避免出现重复的数据?
51、数据增长幅度突然剧增,要从哪几个角度去思考到底哪里出现了问题?
52、一个分区表,一个非分区表,如何用非分区表中的字段作为分区表的分区值?
56、hive中 一个表格有ID 和登陆时间,怎么找出昨天登陆次数两次的用户?
57、hive 怎么截取字符串最后两位?除了substr 还有没有别的方法?
68、多表查询是不是一定要用嵌套,还有什么情况下可以考虑不用嵌套
74、用union all合并两个表,新表中怎么查询某个数据原本是什么表,用什么语句
75、有个文件需要周一早上8点运行,用linux语句怎么运行?(不能借助kettle)
79、hive中order by,sort by, distribute by, cluster by作用以及用法;
hive数据库是使用hdfs存储数据的,oracle数据库使用.dbf文件存储数据
hive数据库使用mr引擎计算数据,oracle有自己自带的executor进行计算
hive的语句运行延迟比较高,oracle延迟很低
hive支持的容量比较大,可以支持TB PB,但是oracle只能支持GB
hive数据库没有约束条件的部分,oracle有约束
hive没有索引,oracle有索引
传统数仓主要是结构化的数据,大数据数仓有结构化,半结构化,非结构化的数据
传统数仓数据量为GB,TB;大数据数仓数据量为pb级
传统数仓用oracle存储,大数据数仓用hdfs,hbase存储
传统数仓主要处理离线数据,大数据数仓既可以处理离线数据,也能处理实时数据
hadoop 开源版 2.8
hadoop cdh版本 5
进行表格连接的查询加速;加快表格的抽样查询。
总的文件大小/(block size*2) = 分桶数量
聚合函数 sum avg min max count
单行函数
数字 abs round floor ceil power
字符串 substr concat concat_ws replace instr split translate upper lower initcap lpad rpad length trim ltrim rtrim get_json_object
时间日期函数 current_timestamp unix_timestamp from_unixtime add_months months_between date_add datediff last_day
数据类型转换 cast
数组 array size collect_list collect_set explode
映射 map map_keys map_values
分析函数
排名 row_number rank dense_rank
平移 lag lead
逻辑函数 nvl case…when…
lag lead
表连接 select * from a join b on a.year=b.year+1 and a.month=b.month;
hive使用left semi join替换子查询嵌套;
表连接不能使用on后面的非等值查询。
order by 是整个表格的数据当成一个进程进行整体的排序
sort by 可以根据 mapred.reduce.tasks进行分组的设置,每个组分别进行排序
cluster by 只能对该列进行升序排序
distribute by 本身没有排序功能,需要和sort by一起
Textfile:默认存储格式,行存储;
Sequencefile:含有键值对形式的二进制文件格式,行存储;
Rcfile:行列相结合的存储方式,行列式存储;
Orcfile:优化后的Rcfile存储格式,使用最多。
如果表格比较小会使用textfile,中大型的表格使用orc
textfile gzip
sequencefile BLOCK RECORD
orc zlib
-
可以通过explain查看一下sql语句运行的步骤、逻辑、使用方法、数据的类型、前后的顺序等等内容
-
减少查询过程中使用到的数据量 分区 分桶 不使用select * 先筛选数据再计算或者再连接表格
-
调整表格的存储格式
-
根据表格的结构设置map或者reduce的数量
map的数量和两个开关有关,有一个merge的合并开关和一个map.tasks的数量开关,
使用 表格的总数量大小/tasks和merge设置取最小值,计算每一个map需要运行的数量大小,查看map运行的数量是否有很大的明显的差距
如果我们的表格是列比较少但是行比较多的大表,那么通过reduce.tasks设置表格分桶的数量,
然后通过 select * from t distribute by 列; 进行表格的分桶。
在进行表格的查询和计算过程中,如果有的进程计算的数据很大,有的进程计算的数据比较少,有的部分进程就需要等待其他数据大的进程运行完成才能结束。所以计算过程中资源的分布发生了不合理的现象。
reduce的进程在日志里面卡在了99或者100的部分不动了。
-
map和reduce的设置不合理
-
对表格进行了去重的结果查询
-
大小表格进行数据的查询
-
key值分配不均
-
进行数据查询的时候有大量的空值数据参与了数据的运算
-
设置 mapred.map.tasks; mapred.reduce.tasks;
2.在句子中尽可能少的使用去重统计
— 3.1使用hive里面的优化器 /+ mapjoin(小表的名字) /
— 3.2调整表格的前后顺序,hive里面,永远读取Join前面的表格
— 3.3对表格设置分桶
- 使用hive里面的万能开关,来解决异常数据的问题
set hive.groupby.skewindata=true; –万能方法
set hive.map.aggr=true; –任务执行中合并文件的大小
set hive.merge.size.per.task=256000000;–调整每个map处理数据量的次数,
set mapred.map.tasks=10; —-这里设置的是每一个map要处理的map数量
- 填充空值,用字符串+随机值进行空值的填充
nvl(被计算的列, concat(‘rand_’,rand()))
将小表格的数据放入到内存里面,让大表去读取内存中小表的数据进行数据的匹配和连接
mapjoin是将小表格先读取到内存中,然后用大表格去匹配内存中小表的数据。
A id B id
1 1
2 2
3 4
select * from A left join B on a.id=b.id and a.id=2;
2 2
1 null
3 null
select * from A left join B on a.id=b.id where a.id=2;
2 2
最少是4条 最多是6条
1 5
2 5
3 5
1 1
2 1
3 1
hdfs :hadoop的分布式文件管理系统
mapreduce : 数据的计算引擎
yarn : 资源管理和调度系统
离线的部分:sqoop yarn hdfs mapreduce hive
实时的部分:flume(日志信息的收集) kafka(消息队列的处理) hbase(一种列式存储的数据库) spark(基于内存的计算引擎) flink(流式处理的计算引擎)
128M
datanode namenode secondarynamenode
secondarynamenode:服务器数据的收集,将信息传递给namenode
namenode:负责和客户端进行沟通
datanode:负责存储数据
datanode namenode secondarynamenode jps resourcemanager nodemanager
读取数据:
1.客户端申请某个位置的文件或者数据
2.namenode响应申请,并且将文件和数据所在的datanode节点信息列表返回给客户端
3.客户端根据节点信息去向datanode申请数据的读取
4.datanode响应成功给客户端
5.客户端开始申请读取block1
6.datanode返回block1的数据
7.持续申请后面的其他block数据
8.datanode持续的返回剩下的其他数据
写入数据:
1.客户端要申请写入一个数据
2.namenode审核文件和数据的合法性
3.namenode返回允许的响应
4.客户端开始申请写入
5.namenode返回datanode的节点信息
6.客户端找到datanode开始申请写入数据
7.datanode同意进行数据写入
8.客户端开始上传数据
8.1 datanode开始向其他的datanode申请备份
8.2 其他的datanode同意备份
8.3 开始备份
8.4 备份完成
- datanode回应客户端表示写入成功
hadoop fs -put
hadoop fs -get
hadoop fs -appendToFile
load data inpath ‘hdfs路径’ into table 库名.表名 partition(分区字段=分区值);
load data local inpath ‘linux路径’ into table 库名.表名 partition(分区字段=分区值);
hadoop fs -put linux文件的位置和名字 表格在hdfs的路径
增量抽取的数据,会放在每天的分区里面中,然后通过删除今天的分区达到避免重复数据出现的效果。
alter table 表名 drop partition(分区字段=’分区值’);
load data inpath ‘路径’ into table 库名.表名 partition(分区字段=分区值);
insert overwrite table 表名 partition(分区字段=分区值) select * from 另一个表名;
-
-get 这个文件,修改文件本身,删除hdfs原文件,在-put上传上去
-
通过select语句修改数据本身写入另一个表,然后删除原表,重新命名新表
-
如果是orc类型的分桶表格,通过打开ACID的方法,进行数据的update更新
-
内部表是通过create table创建的,外部表是create external table进行创建的
-
外部表需要通过location指定表格映射的文件夹
-
drop table的时候,内部表会删除文件夹、结构和数据,外部表只会删除mysql中存储的表格的结构
-
一般像日志和埋点数据这种数据量非常大的表格,都会保存在外部表中,计算结果会保存在内部表中
-
静态分区可以load data和insert两种方式添加数据,动态只能通过insert的方式添加数据
-
静态需要自己指定分区的内容,动态是通过查询结果自动指定和分配的
-
动态需要打开动态分区和非严格模式的开关
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
- 一般情况下都是使用静态分区,动态的处理数据的速度相对慢一点
因为分桶可以减少表格笛卡尔积的数量
-
分区是通过partitioned by (新字段) 进行分区设置的,分桶是通过clustered by (已有字段) 进行分桶设置的
-
分区是以文件夹的方式分开保存数据的,分桶是分成不同的文件保存数据的
-
分区是在查询分区字段的时候加快查询速度,分桶是对分桶字段进行表格的联合查询的时候进行联合查询加速的
在hive数据库中,可以通过sqoop进行数据的抽取,有全量和增量两种不同的方法,增量一般是通过lastmodified的方式进行数据抽取的,也可以通过分区表的方式抽取数据
ResourceManager:在整个系统中,有且仅有一个的服务,负责调配Container
NodeManager:负责启动和管理以及监控Container
AppMaster:进行数据计算 Container:容器,一部分服务器的资源
input:先获取在计算过程中所需要的数据
split:对大的数据进行切割的操作,将数据分成一块块的
map:数据的映射。将分配好的数据,给到不同的进程去运行
reduce:将单独的数据进行总体汇总的计算过程
finalize:将计算结果输出
数据进行分区–sort排序–存入硬盘–从硬盘读取数据–聚合计算等等–数据排序
1 1
2 2
4 3
a left join b on a.id=b.id and a.id=2
2 2
1 null
4 null
a left join b on a.id=b.id where a.id=2
2 2
row_number — rank — dense_rank — lag — lead
获取当前时间:from_unixtime(unix_timestamp()) current_timestamp
— 尽可能减少查询和运算过程中的数据量
分区、分桶、查询列不要使用*、先筛选再聚合和连接表。
— 修改表格存储的结构和压缩的方法
小表:textfile gzip
中大表:orc zlib
— 设置不同的map和reduce数量
— 有一些不同的hive数据库的set开关
aggr 聚合开关
parallel 并行开关等
使用hdfs进行数据的存储
使用mapreduce进行数据的计算
使用yarn进行资源的调度
使用hive编写sql语句
使用mysql存储表格的元数据结构
业务数据的来源:业务系统
将目标表格和原表格进行主键的对比,如果主键一致,就更新原表数据到目标表格中,如果主键不一致,就将原表的数据插入到目标表格中。
如果平常数据量增加都很正常,那么我的逻辑控制、变量的设置、数据的获取方式应该都没有什么问题,如果今天突然新增了数据,首先先去确认表格的数据是否都是重复的数据、是否都是空的数据、是否都是异常数据等等,然后往上游的系统进行数据的追溯,查看上游给我们的数据本身是否有问题,如果上游数据很存储数据一致,就找上游协调问题,如果上游数据和存储数据不一致,那么就查找是否有特殊数据导致逻辑出现问题。
还可以查看其他的表格,看是否也有突增的数据,考虑是否是调度的工具出现了问题。
直接做动态分区就好了,使用 insert overwrite table 分区表 partition(分区字段) select xxxx from 非分区表;
文件 touch
文件夹 mkdir
hdfs里面没有直接查找文件的方法,但是可以通过元数据库例如Mysql里面有一个sds表格,通过Like模糊查询这个文件的名字,然后找到它所在的位置。
(current_timestamp,-1)
dt
Original: https://blog.csdn.net/weixin_47064238/article/details/125259189
Author: 大数据求学路
Title: 大数据面试常见问题(三)——Hadoop部分
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/818270/
转载文章受原作者版权保护。转载请注明原作者出处!