大数据离线分析------数据仓库

数据仓库(DW)

数据仓库是决策支持系统(dss)和联机分析应用数据源的结构化数据环境。
数据仓库特性:

面向主题 —>分析的抽象概括,基于该主题拉数据。
集成性 —>把来自各个不同数据源的数据集中在数仓的主题下面,便于分析.ETL
不可更改性:数据仓库不支持更新操作
时变性:在时间的角度,数仓又是变化的,一批次分析一次。

数据仓库3层架构

ODS:数据源 各个不同的数据源,临时存储层。
DW:数据仓库层 数据是格式统一,清洁的,由ODS的数据ETL而来。
DA:数据应用层

为什么分层?
用空间换时间,分步执行一步化多步,减少复杂度、开发处理成本。
原理:通过大量的预处理来提升应用系统的用户体验,因此数仓会存在大量冗余的数据,不分层的话,如果源业务系统的业务规划发生变化将会影响整个数据清洗过程,工作量巨大。(分层的话只需要局部数据变动)

数据仓库开发基本流程

1.从业务系统获取数据
2.数据存储
3.写sql开发需求
4.配置调度系统
5.导出数据&展示

从业务系统获取数据:
1.Sqoop导入数据库的数据:Sqoop可以在hive与传统的数据库间进行数据的传递,可以将一个关系型数据库中的数据导入到hadoop的hdfs中,反之亦可。(同步数据基本不用,宁使用脚本同步也不使用sqoop)
2.Flume采集文本数据:Flume可以将各类型的文件进行采集,存放在hdfs中。
Ftp文件服务器:从文件服务器上下载分析所需的源数据(增量数据,全量数据)。

数据仓库与数据库

OLTP(On-Line Transaction Processing) : 联机事务处理
OLAP(On-Line Analytical Processing) : 联机分析处理

  • 区别:
    OLTP:面向业务,也就是关系型数据库(RDBMS).存储在Raw Device or Local FS ,执行延时低。
    OLAP:面向分析,也就是数据仓库。不支持事务,响应极慢,不可修改。数据存储在hdfs,执行延时高。

Hive

hive是基于hadoop的一个数仓工具,可将结构化数据映射一张表,提供sql功能。本质是将sql转化为MapReduce程序。

hive与hadoop的关系:hive利用hdfs存数据,利用MapReduce计算查询分析数据

hive的分区表:为避免select查询时的全表扫描问题。hive提出了分区表,给文件归类,打上标识(标识不能为表中已有字段)
hive的分桶表:为了提高join查询时的效率,减少了笛卡儿积的数量。
hive自定义函数UDF:当hive提供的内置函数无法满足业务处理需求时,就考虑使用用户自定义函数。(写一个java类,继承UDF,并重载evaluate方法)
hive中元数据描述表和文件之间映射关系。(hive将元数据存储在数据库中)

面试题

1.hive平滑到spark sql怎么做?

一、HIVE的性能瓶颈
Hive依赖hadoop提供的MR引擎,执行计算逻辑。硬件需求小,吞吐量大。但是对比目前DAG调度的计算框架,很多过程无法进行优化,有着明显的性能差距。
二、Spark-SQL替换hive的优势
1.spark-sql 与hive非常相似,版本的迭代过程中不断支持hive特性。
2.spark引擎本身对比hadoop-MR,在相同配置下,有明显的性能优势。
3.支持yarn模式方便资源的调度。
4.支持json,csv等源生数据格式。
5.项目更新进度非常快,尤其是spark-sql,社区火热。
三、平滑切换spark-sql到hive
1.部署spark接入hive源数据,将hive-site.xml移动到spark的conf目录下即可。确认hive元数据的版本,如果使用server模式的话需要注意server的用户。
2.利用hive作业脚本,建立spark作业脚本。替换hive参数,为spark脚本。
3.hive与spark双跑
4.切换线上作业用spark作业代替hive。

2.hive数据倾斜

  • 原因

key分布不均匀
业务数据本身的特性
SQL语句造成数据倾斜

大数据离线分析------数据仓库_第1张图片

  • 解决方案

1.hive设置hive.map.aggr=true和hive.groupby.skewindata=true
2.有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job在根据预处理的数据结果按照 Group By Key 分布到Reduce中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。
3.SQL语句调整:
……a.选用join key 分布最均匀的表作为驱动表。做好列裁剪和filter操作,以达到两表join的时候,数据量相对变小的效果。
……b.大小表Join: 使用map join让小的维度表(1000条以下的记录条数)先进内存。在Map端完成Reduce。
……c.大表Join大表:把空值的Key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终的结果。
……d.count distinct大量相同特殊值:count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在做后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union.

3.hive和hbase的区别?

hive:
1.数据保存在hdfs上,以hdfs格式保存数据,映射为hive中的表结构
2.支持sql语言,调用MR
3.不能做实时操作
4.相对数据量较小
Hbase:
1.Hbase自己的存储机构
2.不支持sql语言,不调用MR
3.可以支持实时操作
4.相对数据量大,对于反复使用的数据比较适用

4.hive排序的关键字有哪些?

sort by :不是全局排序,其在数据进入reducer前完成排序
order by :会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序).只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。
cluster by : 当distribute by 和sort by的字段相同时,等同于cluster by.可以看做特殊的distribute + sort
distribute by :按照指定的字段对数据进行划分输出到不同的reduce中

5.Hive中追加导入数据的4种方式是什么?请写出简要语法

从本地导入: load data local inpath ‘/home/1.txt’ (overwrite)into table student;
从Hdfs导入: load data inpath ‘/user/hive/warehouse/1.txt’ (overwrite)into table student;
查询导入: create table student1 as select * from student;(也可以具体查询某项数据)
查询结果导入:insert (overwrite)into table staff select * from track_log;

6.Hive导出数据有几种方式?如何导出数据

1、用insert overwrite导出方式
导出到本地:
insert overwrite local directory ‘/home/robot/1/2’ rom format delimited fields terminated by ‘\t’ select * from staff;(递归创建目录)
导出到HDFS
insert overwrite directory ‘/user/hive/1/2’ rom format delimited fields terminated by ‘\t’ select * from staff;
2、Bash shell覆盖追加导出
例如:$ bin/hive -e “select * from staff;” > /home/z/backup.log
3、Sqoop把hive数据导出到外部

7.hive SQL语句中 select from where group by having order by 的执行顺序?

from–where–group by–having–select–order by,
from:需要从哪个数据表检索数据
where:过滤表中数据的条件
group by:如何将上面过滤出的数据分组
having:对上面已经分组的数据进行过滤的条件
select:查看结果集中的哪个列,或列的计算结果
order by :按照什么样的顺序来查看返回的数据

8.hive优化

1.输出小文件合并 hive.merge.smallfiles.avgsize 设为5000000
增加map数量,可提高hive运行速度 set mapred.reduce.tasks=10;
2.map join
大小表join时通过使用hint的方式指定join时使用mapjoin。
/+ mapjoin(小表)/
3.hive索引
4.优先过滤数据,减少每个阶段的数据量,对分区表加以分区,同时只选择需要使用的字段
5.根据不同的使用目的优化使用方法
6.尽量原子化操作,尽量避免一个sql包含复杂逻辑
7.join操作小表放在join的左边
8.如果union all的部分个数大于2,或者union部分数据量大,应拆分成多个insert into语句。
9.先where 再join
10.加小型的sql

9.hive job的优化

1.并行化执行:
hive执行过程中的job是按照默认的顺序来执行的,如果没有太大的依赖关系,最好并行执行,减少执行的时间,每个查询被hive转化成多个阶段,有些阶段关联性不大,则可以并行执行,减少执行时间。
set hive.exec.parallel=true;
set hive.exec.parallel.thread.numbe=16(默认8);
2.合并输入/输出小文件:
在集群中面临这样的问题,集群中很多的小文件,这样会启动很多的(FileInputFormat会将输入文件分割成split。split的个数决定了map的个数),而且这些小文件的执行时间特别短,造成集群的资源没有良好的利用(输入)
解决:
set hive.input.format=oar.apache.hadoop.hive.ql.io.CombineHiveInputFormat
这样做后,就会把多个split分片合并成一个。合并的文件数由mapred.max.split.size限制的大小决定
set hive.merge.smallfiles.avgsize=256000000;当输出文件平均大小小于该值,启动新job合并文件set hive.merge.size.per.task=64000000;设定合并之后的文件大小(输出)

你可能感兴趣的:(学习总结)