0.数据库和数据仓库
1.基本关系
数据仓库是数据库的发展,逻辑上看二者并无太大差异,皆是存放数据的,带有字段的二维表。
2.对比
数据库——OLTP联机事务处理
数据仓库——OLAP联机分析处理
属性 | 数据库 | 数据仓库 |
---|---|---|
面向内容 | 事务 | 主题、分析 |
数据存储 | 当前最新数据 | 历史数据 |
模型建设 | 三范式 | 星型模型、雪花模型 |
3.数仓分层
1.基本分层
ODS数据源层(Operation Data Sotre)=》
CDM数据公共层(Common Data Model)=》
ADS数据应用层(Application Data Service)
2.ODS
贴源层,与业务库保持一致,不做处理
3.CDM
由ODS加工而成,完成数据加工与整合,建立维度和指标,构建明细事实表
DIM 公共维度层:基于维度建模理念思想,简历企业一致性维度。
DWD 明细粒度事实层:对数据进行规范化编码转换,清理,统一格式,脱敏,不做横向整合。
DW 主题宽表层:对DWD中的信息进行整合,按照业务输出主题宽表。
DWS 公共汇总粒度事实层:以分析的主题作为建模驱动,为之后派生的各种指标数据建立明细事实表。
4.ADS
数据应用层:面向业务需求定制开发,存放数据产品个性化的统计指标数据。
1.操作系统
1.程序进程线程
程序:含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。
进程:程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序就是一个进程从创建、运行到消亡的过程。
简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等。
线程:一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
线程上下文的切换比进程上下文的切换快得多
- 进程切换时,涉及到当前进程的CPU环境的保存和新被调度运行进程的CPU环境的设置。
- 线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。
2.HDP
3.MR
参考博客:https://www.cnblogs.com/laowangc/p/8961946.html
https://www.cnblogs.com/lenmom/p/11614105.html
1.核心思想:
1.分而治之
2.分布式,汇总键值对
2.基本流程
1.客户端启动一个作业,并向JobTracker请求一个JobID,并开启一个作业,通过Jobtracker的任务调度器,将其分配给map任务中涉及到的TaskTracker中处理(运算移动,数据不移动),TaskTracker会定时发送心跳(现在一般用yarn代替)
2.将输入的数据源进行分片(128M ),并执行Map函数。
3.map函数的输出结果暂存环形内存缓冲区(100M,可用io.sort.mb),达到缓冲区的80%(Io.sort.spill.percent)发生溢写,创建一个临时溢写文件,将数据溢写到磁盘上。
4.溢写发生前,线程现根据reduce任务的数目,将数据换分为相同数目的分区,有一个分区有一个reduce,默认按照Hash划分,并将每个分区中的数据进行排序,如果设置了combiner(要求Redduce端输入的keyValue数据和输出的KV数据类型完全一致) ,会在排序后进行(为减少写入磁盘的数据)。
5.map任务全部结束后,会将所有溢写文件合并,合并过程同样会进行排序和combiner (1.减少写入磁盘的数据量。2.减少网络传输的数据量),最后将所有临时溢写文件合并成一个已分区并已排序的文件,此过程为Map的merge。merge 成多个group ,如{“apple”,[1,1,1,1,1]},{“people”,[1,2,4,5]}
mapred.copress.map.out=true
开启压缩,将map传reduce时进行数据压缩减少网络传输量。
6.分区中的数据被拷贝至各对应的reduce端,执行相应的reduce任务
7.源数据——map函数——map merge——reduce copy——reduce merge——reduce函数
3.Shffule详解
Collections.shuffle(List list):随机打乱list里的元素顺序
MR的Shuffle:描述数据从MAP输出到Reduce输入的这段过程
(即从环形缓冲区溢写到执行reduce函数之前)
1.shuffle的Map部分:
按照partitioner的分区规则,进行溢写(发生排序和container),最终合并(发生排序和comtainer),假如某台TaskTracker上的Map任务完成,就会进行shuffle的Reduceb部分。
2.shuffle的reduce部分:
(1)copy过程:拉去数据,Reduce进程启动数据copu线程(Fetcher抓取器),通过http方式 请求溢写产出的map task输出文件至内存中.
(2)Merge过程:同map端的merge,不过数据不是单一map端的数据,而是所有map端的数据,copy产生的数据会先放入内存缓冲区中,此处的缓冲区不同于Map端,它基于JVM的heap size设置。因为此时Reducer不运行,所以应该用大部分内存来完成shuffle。
(3)Merge的三种形式:当内存中的数据量到达一定阈值,就会进行第二种merge,当所有map端的数据全部copy完毕后,启动第三种,生成最终数据
1.内存到内存:mapreduce.reduce.merge.memtomem.enabled=true 默认false
2.内存到磁盘:类似map 的溢写,满阈值()写磁盘,同样会执行combiner(第三次可执行位置)
3.磁盘到磁盘:map端所有数据读完,生成最终文件
4.map的环形缓冲区
1.基本结构
两级索引结构
KvOffsets[]:偏移量索引数组
KvIndices[]:索引数组
KvBuffer[]:数据缓冲数组
2.KvOffsets缓冲区
1.保存kv信息在位置索引数组kvIndices[] 中的位置,
2.当kvoffsets的使用率超过io.sort.spill.percent(默认为80%)使,发生SpillThread线程的"溢写操作,开始一次spill。
3.KvIndices缓冲区
1.保存kv信息在数据缓冲数组**kvbuffer[]**中的起始位置
4.kvBuffer数据缓冲区
1.保存实际的kv值
2.默认该缓冲区最多可以使用io.sort.mb的95%,当**kvbuffer[]**使用率超过io.sort.spill.percent(默认80%)时,发生一次溢写。
5.各种压缩文件的对比
压缩格式 | 优点 | 缺点 |
---|---|---|
gzip | 压缩比在四种压缩方式中较高;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便 | 不支持split |
lzo | 压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;需要在linux系统下自行安装lzop命令,使用方便 | 压缩率比gzip要低;hadoop本身不支持,需要安装;lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定inputformat为lzo格式) |
snappy | 压缩速度快;支持hadoop native库 | 不支持split;压缩比低;hadoop本身不支持, |
bzip2 | 支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便 | 压缩/解压速度慢;不支持native |
压缩时间越长,压缩比:Snappy>LZ4>LZO>GZIP>BZIP2
snappy压缩时间最短,压缩率最小,BZIP2压缩时间最长,压缩率最高
6.各种文件格式
1.行式存储
(1)Textfile:直观易读,无优化,默认格式——stored as textfile
(2)SequenceFile:二进制存储,具有一定压缩效果,可分割–stored as squencefile
(3)Avro:二进制存储,适合不需要转换的写入性工作。–stored as avro
2.列式存储
(1)Rcfile:列式存储,高压缩算法–stored as rcfile
(2)ORCFile:二进制,优化RC,最高压缩 --stored as orc
(3)Parquet:二进制,嵌套式schema,与ORC性能相近–stored as parquet
3.二进制存储和文本存储
一、存储字符数据
无论是放在文本文件还是放在二进制文件中都和内存中的数据形式是没有区别的.同样也和终端形式没有区别。那么在存储和显示的特性上也没有任何区别,不浪费存储空间也不浪费转换时间。所以如果一个文件只存放字符数据,那么讨论该文件是用文本文件或是二进制文件是没有任何意义的。
二、存储非字符数据
1、如果您需要频繁地保存和访问数据.那么应该采用二进制文件进行存放,这样可以节省存储空间和转换时间。
2、如果您需要频繁地向终端显示数据或从终端读入数据,那么应该采用文本文件进行存放,这样可以节省转换时间。