关于数据仓库
数仓的分类
其实严格来说,数仓是不存在分类的。只需要注意的是是,沉淀到数据集市的标满⾜数据表设计的第三范式即可。
第⼀范式:表中的列含有原⼦性的值。
第⼆范式:满⾜第⼀范式,没有部分依赖。
第三范式:满⾜第⼆范式,不存在传递依赖性。
元数据
我们在操作数据仓库时,操作的都是元数据,⽽元数据分为技术元数据和业务元数据。 技术元数据:指数据仓库开发、管理、维护相关的数据,描述了数据的原信息,转换描述、数据映射、访问权限等;
业务元数据:为管理层和业务分析⼈员服务,从业务的⾓度描述数据,包括⾏业术语、数据的可⽤性、数据的意义等;
管理元数据:数据所有者、数据访问权限、数据处理逻辑、数据处理系统。
元数据的存储常⽤两种,⼀种是以数据集为基础,每⼀个数据集有对应的元数据⽂件,每⼀个元数据⽂件对应数据集的元数据内容;另⼀种是以数据库为基础,由若⼲项组成,每⼀项表⽰元数据的⼀个元素。
主数据
ETL
Extract 依照抽取量的⼤⼩可分为全量抽取和增量抽取,⼀般⽽⾔全量抽取只适⽤于项⽬的初始化阶段,此时累积数据量较⼤,初始化时间也⼀般较长。随后即可按照时间戳进⾏增量抽取。此外,为了不影响业务数据库的性能,抽取并不会直接从源系统中直接拉取数据(联机抽取)。⽽是通过期备份数据库进⾏脱机抽取。
Transfrom 为耗时最长的过程,主要可能完成⼀下⼏类操作:
1. 筛选特定的数据列
2. 统⼀数据编码、⾃由值编码、映射
3. 预计算
4. 数据验证
Load 主要涉及1、数据装载的效率问题 以及 2、出错后的重复执⾏问题。对于第⼀个问题其实在github的实践项⽬中都有遇到。对于第⼆类问题,⼀般airflow或者是azkaban的框架会有兜底机制,⼀般都是异步发送邮件并将任务推送到kafka。由定时任务轮询来进⾏兜底。
相关ETL的详细过程案例,⼩明有⼀个落地的项⽬参见
数据建模
建模⽅法
维度建模
(1)定义
维度模型是数据仓库领域另⼀位⼤师Ralph Kimball 所倡导的。维度建模以分析决策的需求出发构建模型,构建的数据模型为分析需求服务,因此它重点解决⽤户如何更快速完成分析需求,同时还有较好的⼤规模复杂查询的响应性能,更直接⾯向业务。 典型的代表是我们⽐较熟知的星形模型:
星型模型由⼀个事实表和⼀组维表组成。每个维表都有⼀个维作为主键,所有这些维的主键组合成事实表的主键。强调的是对维度进⾏预处理,将多个维度集合到⼀个事实表,形成⼀个宽表。
这也是我们在使⽤hive时,经常会看到⼀些⼤宽表的原因,⼤宽表⼀般都是事实表,包含了维度关联
的主键和⼀些度量信息,⽽维度表则是事实表⾥⾯维度的具体信息,使⽤时候⼀般通过join来组合数据,相对来说对OLAP的分析⽐较⽅便。
(2)建模⽅法
通常需要选择某个业务过程,然后围绕该过程建⽴模型,其⼀般采⽤⾃底向上的⽅法,从明确关键业务过程开始,再到明确粒度,再到明确维度,最后明确事实,⾮常简单易懂。
关系建模
(1)定义
是数据仓库之⽗Inmon推崇的、从全企业的⾼度设计⼀个3NF模型的⽅法,⽤实体加关系描述的数据模型描述企业业务架构,在范式理论上符合3NF,站在企业⾓度⾯向主题的抽象,⽽不是针对某个具体业务流程的实体对象关系抽象。
lgkg70
它更多是⾯向数据的整合和⼀致性治理,正如Inmon所希望达到的“single version of the truth”。
当有⼀个或多个维表没有直接连接到事实表上,⽽是通过其他维表连接到事实表上时,其图解就像多个雪花连接在⼀起,故称雪花模型。
雪花模型是对星型模型的扩展。它对星型模型的维表进⼀步层次化,原有的各维表可能被扩展为⼩的事实表,形成⼀些局部的 "层次 " 区域,这些被分解的表都连接到主维度表⽽不是事实表。
雪花模型更加符合数据库范式,减少数据冗余,但是在分析数据的时候,操作⽐较复杂,需要join的表⽐较多所以其性能并不⼀定⽐星型模型⾼。
(2)建模⽅法
关系建模常常需要全局考虑,要对上游业务系统的进⾏信息调研,以做到对其业务和数据的基本了解,要做到主题划分,让模型有清晰合理的实体关系体系,以下是⽅法的⽰意:
(3)优缺点
优点:规范性较好,冗余⼩,数据集成和数据⼀致性⽅⾯得到重视,⽐如运营商可以参考国际电信运营业务流程规范(ETOM),有所谓的最佳实践。
缺点:需要全⾯了解企业业务、数据和关系;实施周期⾮常长,成本昂贵;对建模⼈员的能⼒要求也⾮常⾼,容易烂尾。
3、建模⽅法⽐较
⼀般来讲,维度模型简单直观,适合业务模式快速变化的⾏业,关系模型实现复杂,适合业务模式⽐较成熟的⾏业,阿⾥原来⽤关系建模,现在基本都是维度建模的⽅式了。在可可西里回头
运营商以前都是关系建模,现在其实边界越来越模糊,很多⼤数据业务变化很快,采⽤维度建模也⽐较⽅便,不需要顶层设计。
企业建模的三点经验
维度建模就不说了,只要能理解业务过程和其中涉及的相关数据、维度就可以,但⾃顶向下的关系建模难度很⼤,以下是关系建模的三个建设要点。
1、业务的理解:到企业内最理解业务和源系统的⼈,梳理出现状,⽐如运营商就要深刻理解三域(O/B/M),概念建模的挑战就很⼤,现在做到B域的概念建模已经很不容易。
2、数据及关系的理解:各个域的系统建设的时候没有统⼀⽂档和规范,要梳理出逻辑模型不容易,⽐如运营商的事件主题下的逻辑模型就⾮常复杂。
3、标准化的推进:数据仓库建模的任何实体都需要标准化命名,否则未来的管理成本巨⼤,也是后续数据有效治理的基础,以下是我们的⼀个命名规范⽰例:
数据治理
(暂略)
Airflow基本概念讲解
Airflow本质:配置⽂件。由Operator定义操作类型。>>,<<,set_upstream(),set_downstream()定义操作顺序。
Airflow Python script is really just a configuration file specifying the DAG’s structure as code. The actual tasks defined here will run in a different context fro m the context of this script. Different tasks run on different workers at different points in time, which means that this script cannot be used to cross commun icate between tasks. Note that for this purpose we have a more advanced feature called XCom
填写airflow调度⽂件时,需要把⽂件保存在~/airflow/dags/⽂件夹下,运⾏python ./filename ⽅可被调度,此时在airflow的前端界⾯就可以看到⼀个以你的Operator_id为命名的⽂件如下图所⽰(访问:55.14.21.198:8080可以看见dag的具体配置进⾏远程监控):
特别注意:对于Linux新建的系统关键变量 需要重启airflow+jupyter notebook
常⽤配置模块:
BashOperator:(运⾏脚本命令,注意当脚本命令写成.sh⽂件时候代码需要加⼀个空格,其中所有的shell命令均是有python的subprocess模块执⾏<;参数⽂档,注意其中shell=True这⼀参数>)
also_run_this = BashOperator(
task_id='also_run_this',
bash_command='echo "run_id={{ run_id }} | dag_run={{ dag_run }}"',
dag=dag,
)
t2 = BashOperator(
task_id='bash_example',
# This fails with `Jinja template not found` error
# bash_command="/home/batcher/test.sh",
# This works (has a space after)
腺苷蛋氨酸
bash_command="/home/batcher/test.sh ",
dag=dag)
HiveOperator/MysqlOperator(BaseOperator):均继承⾃BaseOperator,通过重写execute()⽅法执⾏SQL语句。如果想执⾏更多操作,需要重写其Hooks中的实例⽅法,完成shell+sql以及⼀系列执⾏逻辑。例如修改连接数据库⽽拼接的shell命令,以及判断没有表时新建表的逻辑。
贺麓成Airflow中MySQL连接的三种⽅式:(1)、通过如下shell脚本命令连接:mysql -h hostIP -P 3306 -u username –p password (2)、通过airflow-配置⽂件进⾏连接。(3)通过pymysql配置连接信息进⾏连接。<;以上三种类型可写⼊不同的Operator之中>
hive_client当前部署在在Airflow机器上,当前使⽤的是华为Fushion Insight。Hadoop版本是2.X,需要通过Beeline命令⾏进⾏连接。
beeline
1. -d —使⽤⼀个驱动类:beeline -d driver_class
2. -e —使⽤⼀个查询语句:beeline -e “query_string”
3. -f —加载⼀个⽂件:beeline -f filepath 多个⽂件⽤-e file1 -e file2
4. -n —加载⼀个⽤户名:beeline -n valid_user
5. -p —加载⼀个密码:beeline -p valid_password
6. -u —加载⼀个JDBC连接字符串:beeline -u db_URL
7. -i –加载⼀个⽂件,但是运⾏完之后不退出beeline客户端
创建UDF函数步骤:
1、 权限问题,现在FI申请的账号权限为hive admin权限。
2、 函数注册地址问题:CREATE TEMPORARY FUNCTION DBNAME.addDoubles AS
‘com.huawei.ample.udf.AddDoublesUDF’ using jar
‘hdfs://hacluster/user/hive_examples_jars/AddDoublesUDF.jar’
2、set role admin; //切换为admin⽤户
3、create function extracthistorynameudtf as ‘com.bproject.preprocessing.branch.ExtractHistoryNameUDTF’using jar ‘hdfs://hacluster/tmp/cmbproject-0.0.1-SNAPSHOT.jar’;(注册函数默认在default下)
⾃定义UDTF函数
1、对应的HIVE操作以及数据库概念:
金融86
lateral view:侧视图,相当于把原视图的元素展开,互相之间做笛卡尔积。这⾥主要是把其中的historynames展开
2、JAVA中的具体操作收购网站
1. UDTF⾸先会调⽤initialize⽅法,此⽅法返回UDTF的输出⾏的信息(输出列的个数与类型);
2. 初始化完成之后会调⽤process⽅法,真正的处理过程都在process函数之中:在process中,每⼀次forword()调⽤产⽣⼀⾏;如果
产⽣多⾏,可以将多个列的值放在⼀个数组之中,然后将该数组传⼊到forword()函数。
3. 最后调⽤close()⽅法,对需要清理的⽅法进⾏清理。