第一章,大数据之路浅谈
数仓&数据集市&数据湖
**数据仓库**:英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
**数据仓库**:一个面向主题的(Subject Oriented),集成的(Integrated),非易失的(Non-Volatilea),随时间变化的(Time Variant),用来支持管理人员决策的数据集合
**数据湖&hub**:概念最初是由大数据厂商提出的,表面上看,数据都是承载在基于可向外扩展的HDFS廉价存储硬件之上的。但数据量越大,越需要各种不同种类的存储。最终,所有的企业数据都可以被认为是大数据,但并不是所有的企业数据都是适合存放在廉价的HDFS集群之上的。
**数据集市(Data Mart)** :也叫数据市场,数据集市就是满足特定的部门或者用户的需求,按照多维的方式进行存储,包括定义维度、需要计算的指标、维度的层次等,生成面向决策分析需求的数据立方体。
在业务快速发展的时候,一般一个业务模式或者场景对应一个数据集市,以支撑业务快速发展
例如:爬虫集市、反爬虫集市、搜索推荐集市、内容营销集市、风控集市、财务集市、营销集市等等
数据模型
**本文所提到模型即是指由Hive将存储在HDFS或者其他数据源上结构化文件映射成为的“表”**
模型ETL频率:
离线模型:T+1、T+2、周、月、季
准实时模型(rtf 模型):1min、5min、10min、30min、1hour
实时topic:实时消费、流式处理、实时接入、实时消费
模型存储技术:
非分区模型:不存储历史数据,只存储数据最新状态
全量模型:全量存储数据,超出一定时间未更新状态数据存入History分区,否则存入ACTIVE分区,只记录数据最新状态
增量模型:增量存储数据,每日新增数据纪录成快照并存入最新分区
拉链模型:拉链模型是一种数据处理和存储的技术方式;通过比较,记录数据的生命周期;能快速还原任意天的历史快照,极大的节省了存储。 顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息
模型数据分层:
分区模型:就是一种物理上的“索引”,将总数据按规则分装到各个小区中并打上标签,查询指定标签的数据时只用遍历该小区的数据即可
桶模型: 对于每一个模型(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组,笔者在日常开发中没有使用过“分桶”技术
注意:
1. 而分区又会被分为静态分区&动态分区,在insert数据时会有区别,静态分区insert数据时需要制定分区,动态分区不需要制定
如果分区是可以确定的话,千万不要用动态分区,动态分区相较与静态分区,效率会低一些。因为动态分区的值是在reduce运行阶段确定的,也就是会把所有的记录distribute by,而Distribute by 按指定字段,将数据划分到不同的Reduce中,所以当数据大的时候,Reduce的数量直接影响着效率的高低。
2. insert数据时,可以将动态分区&静态分区结合使用,结合方式为:主静从动
3. 一般模型分区数量不应该超过2层,否则会因分区数过多而导致生成大量小文件(文件小于128M),影响集群效率
3.1 从Hive的角度看,小文件会开很多map,一个map开一个JVM去执行,所以这些任务的初始化,启动,执行会浪费大量的资源,严重影响性能。
3.2 NameNode会在内存中维护着文件系统树及整棵树内所有的文件和目录,也记录着每个文件中各个块所在的数据节点信息。在HDFS中,每个小文件对象约占150byte,如果小文件过多会占用大量内存。这样NameNode内存容量严重制约了集群的扩展
模型架构分层:
ADM:源数据层,与生产系统数据及结构完全保持一致
BDM:拉链层,以ADM层为基础,将数据转换为拉链模型进行极限存储
CDM:明细层,以BDM层或ADM层为基础,拉取数据加工成星型模型或雪花模型
DDM:公共层,以CDM为基础,所有的数据业务及技术口径、TEL方式、数据场景聚合在此层实现统一
EDM:应用层,以DDM为基础,面向不同的系统实现定制化开发
TMP:临时数据层,基础临时模型或者中间模型
OPD:测试层,存储测试待上线模型
NMV:维度层,为降低数据冗余,存储一些枚举值映射关系
模型主题域:
不同层的模型会按照特定的业务主体或者场景划分出“”主题“”,以便用户快速在茫茫模型海中找到目标模型,举例说明
Z01:用户
X02:搜索
C03:广告
V04:流量
B05:交易
N06:订单
M07:商品
L08:房产
K09:二手车
......
模型创建类型:
内部模型(管理模型):未被external修饰的是内部表,数据由hive自身管理。drop表时,hdfs上持久化存储数据会被删除
外部模型:数据由HDFS管理,drop表时,表的元数据信息会被删除,持久化存储数据还会在HDFS中未被删除
模型存储类型:
TEXTFILE:存储方式为行存储,默认存储方式
SEQUENCEFILE:二进制文件,以<key,value>的形式序列化到文件中,行存储,可分割可压缩
RCFILE:数据按行分块 每块按照列存储,压缩快,快速列存取
ORCFILE:数据按行分块 每块按照列存储,压缩快,快速列存取
PARQUET:列式存储,可用于多种数据处理系统
模型压缩算法:
GZIP
BZIP2
LZO
SNAPPY
笔者日常开发采用ORC格式对数据进行存储,SNAPPY算法对数据进行压缩,后期会分章节填上本篇挖的所有坑-。-
最后的最后,讲讲集群中几个概念:队列,节点,计算引擎
队列:
保证不同等级数据计算任务及算法任务互相独立享受资源,互不干扰互不影响,独立划分一片资源,列举几个集群中“”队列“”实际应用场景
core :核心重点任务使用
formal:生产队列,供生产任务使用
Spark:仅供Spark作业使用
Machine_learning:仅供算法作业使用
bu:仅供报表作业使用
presto:仅供Presto即席查询使用
Hive:仅供Hive查询使用
dev:仅供非核心作业使用
这块再挖一个大坑,后几期笔者会重点讲一下在实际生产环境下同一集市不同队列间资源分配策略
节点:
负责调度任务的客户端,笔者Spark开发时采用Yarn提交作业,Yarn会选择集群任意一台机器作为客户端以供Driver进行作业调度
计算引擎:
Hive
Spark
Pig
Spark Streaming
Storm
MapReduce
这块再挖一个大坑,笔者日常基本都采用Spark引擎开发,后续文章会重点讲解每个计算引擎不同,优势与劣势
回过头看看自己职业经历,当初觉得自己太菜,17年刚来北京决定从事数据分析师这个岗位,面试了头条、链家、58到家,每一家对数据分析侧重点不一样:
头条重算法,上来手写一些算法基本实现
链家重实现,笔试里有较多题目设计业务场景具体分析,具体实现
58到家谈业务,可能是由于面试业务部门导致
后来没有去师傅推荐的58到家商业BI部门当一个数据分析师,辗转反侧来到沃斯,从事业务侧数据分析师,最后异动至数据开发,神奇的经历,因为自己的坚持,最终做到自己想干的事!
*人生苦短,我用Python,CCCCCold的大数据之禅*