中级数据开发工程师养成计

目标

工作之后就很少时间用来沉淀知识了,难得用空闲时间沉淀一下自己。
成为一名中级数据开发工程师。偏向于数据仓库,数据治理方向。

整体排期

1 hive
2 hadoop
3 flink
4 spark
5 闲杂工具 kafka maxwell cancal
6 数据建模(偏向于kimboll维度建模)
7 机器学习 --常见算法理论 简单应用
8 python编程 numpy pandas matplotlib等常用分析工具
9 ETL开发
10 shell 常规使用
11 数据结构
12 计算机网络
13 计算机组成原理
14 JAVA 常识
15 产品运营

1 Hive

概念:

acid :
atomicity 原子性: 要么全部成功,要么全部失败恢复如初
consistency : 一致性 :数据库保持完整性,不可能一个人账单
isolation 隔离性 :多并发的时候是否保持隔离
durability 持久性 :一旦更改成功,哪怕机器坏掉了数据页不会丢失
cap :
consistency 一致性 数据更新完后,所有的数据完全一致。
availability:可用性 任何节点都需要在一定时间完成。
partiton tolerance: 分区容错性
cap只能满足两个 ca的话传统数据库 ,mysql
cp的话 redis hbase这些
ap 的话,数据不一致就没办法了。 一般大数据都是谈cp,ap,如果没有p,就不要谈大数据了。
怎么说?CAP理论的C和ACID的C一致性含义不一样要记住哦。

什么是hive
1 存储在HDFS
2 Hive分析数据底层的实现MapReduce
3 执行程序运行在Yarn上

缺点:迭代式算法无法表达

架构

中级数据开发工程师养成计_第1张图片
解析器:将sql字符转换成抽象语法数AST
编译器:将AST编译生成逻辑执行计划
优化器:对逻辑执行计划进行优化
执行器:把逻辑执行计划转换成可以运行的物理计划。

数据类型

struct
map
array

表的类型

外部表 和 内部表
区别: 外部表删除表,只是删除了元数据,表内容并不会删除,一般就是 每天收集到的网站日志定期流入hdfs文本文件,在外部表的基础上做大量的统计分析,用到的中间表,结果表使用内部表存储,数据通过select +insert 进入内部表。

分区表
就是分目录呗
分桶表
就是分文件呗

create table stu_buck(id int, name string)
clustered by(id) 
into 4 buckets
row format delimited fields terminated by '\t';
select * from customers_buck1 tablesample(bucket 1 out of 4 on customer_fname);

行转列
concat_ws
列转行
LATERAL VIEW

窗口函数
current row :当前行
n PRECEDING 往前N行数据
n FOLLOWING 往后N行数据
UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING表示到后面的终点
LAG(col,n):往前第n行数据
LEAD(col,n):往后第n行数据
NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。

name orderdate cost
jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

(1)上述的场景,要将cost按照日期进行累加
sum() over(partition by name order by between and ,)
(2)查询顾客上次的购买时间
lag(overdate ,1,‘1900-01-01’)over (partition by name ,order by overdate )
(3)查询前20%时间的订单信息
select * from ( select name,orderdate,cost, ntile(5) over(order by orderdate) sorted from business) twhere sorted = 1;

注意点
记住 lag sum lead NTILE rank DENSE_RANK() --排序相同重复,总数减少

函数

分类
按照 实现方式分类 1 自定义函数 udf 2 自定义聚合函数udaf 3 自定义表生成函数 udtf
按照输入输出的角度, 1 输入:一行数据中的一列或者多列 输出 :单一值
2 udaf : 多行的列输入,输出单一值
3 udtf : 多行或者多列为输出

性能优化 --重点

存储方式:
parquet和orc的区别:都是列式存储,后者支持事务
常用存储
ORC: hive presto
Parquet: Impala,Spark,Drill
parquet
ROWGroup: 一般大小对应一个block块的大小
ColumnChunk: 如果表有四列,则 该RowGroup 有四个ColumnChunk.
PAGE :数据存放在Page上。
Footer 存放元数据信息
相比于行式存储,查询单列的话,不用全表扫描了。
ORC
stripe 对应 rowgroup.

hive 事务 满足ACID,特点:文件格式只支持orc,表必须是bucketed表。

个人sql优化小技巧

1 分区表是不是更合理(case 下游仅仅读区最近一年,能不能插入的时候,设置成两个分区,一个是全量,另外一个是近1年的)
2 一个任务能不能拆分成多个跑,按照时间字段拆分。
3 mapjoin left join (只会广播右表,注意小表的大小 目前maxcomputer 文档中写的2g,实际8g 甚至更多) 其实maxcomputer 原本就会自动优化,你直接看log 就可以知道其是否优化。
4 order by between and 是false,true 需要注意下。 
5 left semi join 和in 的区别 ,前者读区全表的数据,才后才过滤,但是后者使用的时候,若二级分区过多,目前odps最多读区10w个分区。
7 对于dqc的配置,大于0的话,一般是select count(*) ,其实可以设置成select limit 1 来优化
8 行转列 wm_connect trans_array 列转行 later view explode 
9 建议表失效能恢复的天数设置成2天。 odps项目下默认设置成24小时,真的很坑。

数据优化
1 尽量使用原生函数
2 看看instance是不是一块开始运行的(资源是否紧张)
3 map端倾斜,每个map instance读取实例不均(1 设置合并小文件每个map最多读取200个小文件,2 设置split .size(map最大输入量256M) 和limit.size (默认64M,不足的进行合并) 3 在sql后跟上 distribute by rand() 同时设置reduce个数,防止key倾斜 )
4 大表join小表 mapjoin 小表默认512M,最大2G
5 join阶段倾斜 1 存在大量null coalease(a , rand()) =coalease(b,rand()) 2 大表和大表 skewjoin 3 大表和中表 distributed mapjoin 4谓词下推 dynamic filter
6 reduce倾斜,避免distinct。 group by 倾斜的话 设置skewindata两阶段聚合。
7资源不够 cpu memory instance数量

2 hadoop

hadoop压缩的好处
1 减少存储空间
2 降低网络传输
mr任务过慢原因
1 小文件过多
2 map reduce设置不合理
3 资源紧缺
4 数据倾斜
5 spill次数多,merge次数过多
6 设置参数 map reduce 共存slowstart.completedmaps

HDFS 架构
1 NameNode
2 DataNode
3 Secondary NameNode 定期合并(fsimage和edits )可辅助恢复恢复NameNode
写流程
1 client 向namenode申请可用的的datanode
2 向该datanode 发送请求
3 开始写入该datanode
4 写完一个datanode后,该datanode给client发送一个确认,client再发,直到全部发完
5

YRAN架构
1 ResourceManager 整个资源的老大
2 ApplicationMaster 单个任务的老大
3 NodeManager 单个节点服务器资源老大
4 container 容器,相当于一台独立服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。

3 flink

常识

Lambada架构
KApper架构
核心思想:lambada 是流处理和批处理分开的
Kapper架构是去除了批处理,用Kafka或者类似MQ队列系统收集各种各样的数据,你需要几天的数据量就保存几天。

Flink的优势:

1 高吞吐,低延迟,高性能
2 支持事件时间
3 支持有状态的计算
4 支持高度灵活的窗口
5 基于轻量级分布式快照的容错。–就是通过checkpoint 的状态恢复 --保持数据的一致性。
6 基于JVM实现独立的内存管理 --就是减少JVM GC对性能的影响。
7 SAVE POINTS 保存点。–数据24小时的运行的话,我们此时触发保存的 savepoint 来恢复数据。

架构

中级数据开发工程师养成计_第2张图片

6 数据建模

ONE DATA体系

1 数据地图 (元数据管理)
2 指标小库 (数据消费)
3 规范化数据建模(横向就是 数据域(数据单元(业务过程))的划分 ,纵向就是(ods cdm adm))

如何评价一个资产的好坏?

1 产生的价值和成本
2 是否有数据地图,业务能否看地图就知道他想要什么。
3 数据熵是否低
熵的考虑方面 1 平均链路是否过长 2 数据穿透使用占比 3 资产重复占比 4 规范资产占比 5 跨域现象占比

KPI产品思考(BI看版)

1 目前的体量有多大,做的好不好。
2 能否为用户提供价值,能提供什么价值。
3 如何防止恶意投诉
4 如何才能更好的服务

中级数据开发工程师养成计_第3张图片
ER建模
目的:数据仓库是站在企业角度面向主题的抽象
维度建模
目的:从分析需求出发
建模过程
1 业务过程
2 粒度
3 维度
4 事实

星型模型和雪花模型
1 雪花模型 -维度表变化的快。
2 当作桥接表。1张表就是1张表数据清晰,规范化。

交叉探查
不同事实表进行 case 曝光->领取。
主要考虑到公共的数据。

11 数据结构

常见的三种join方式
1 nested loops join 嵌套循环 (类似于java中的两层for循环)
缺点复杂度o(m*n)
2 Merge Sort Join
先排序,后join
3 哈希join
首先读取小表的数据,对于每一行数据根据链接条件生成一个hash map中的一个元组,数据缓存在内存中,如果内存放不下需要dump到外存,此时拿另一个表,根据join condition,hash key 映射hash map中的元组,弱key相等,并不能确定这两行就是满足条件的数据,数据需要再过一遍join condition和fileter

hive中的几种join
1 common join 在reduce端进行join ,mapreduce的过程
2 mapjoin 默认25M
3 bucket map join 和 sort Merge bucket map join

常见的几种排序
1 冒泡排序
2 选择排序
3 插入排序
插入排序算法的时间复杂度是0(n^2) ,因此在处理大规模数据时效率不高,但是对于部分有序的数据,插入排序的性能会更优秀。

下面是一个示例,演示了一个长度为8的数组的插入排序过程:
初始状态: 9 2 5 1 6 4 8 3
第一步:将第二个元素2插入已排序的子序列9中,得到子序列2 9 5 1 6 4 8 3
第二步:将第三个元素5插入已排序的子序列2 9中,得到子序列2 5 9 1 6 4 8 3
第三步:将第四个元素1插入已排序的子序列2 5 9中,得到子序列1 2 5 9 6 4 8 3
第四步:将第五个元素6插入已排序的子序列1 2 5 9中,得到子序列1 2 5 6 9 4 8 3
第五步:将第六个元素4插入已排序的子序列1 2 5 6 9中,得到子序列1 2 4 5 6 9 8 3
第六步:将第七个元素8插入已排序的子序列1 2 4 5 6 9中,得到子序列1 2 4 5 6 8 9 3
第七步:将第八个元素3插入已排序的子序列1 2 4 5 6 8 9中,得到子序列1 2 3 4 5 6 8 9
最终结果: 1 2 3 4 5 6 8 9

4希尔排序

一种基于插入排序的排序算法,缩小增量排序,
下面是一个示例,演示了一个长度为8的数组的希尔排序过程:
初始状态: 9 2 5 1 6 4 8 3
第一次分组,增量为4,分成两组: 9 2 5 1 和 6 4 8 3
对每组进行插入排序,得到: 1 2 5 9 和 3 4 6 8
合并两组,得到: 1 2 5 9 3 4 6 8
第二次分组,增量为2,分成四组: 1 2 和 5 9 和 3 4 和 6 8
对每组进行插入排序,得到: 1 2 和 5 9 和 3 4 和 6 8
合并四组,得到: 1 2 5 9 3 4 6 8
第三次分组,增量为1,分成八组: 1 和 2 和 5 和 9 和 3 和 4 和 6 和 8
对每组进行插入排序,得到: 1 和 2 和 5 和 9 和 3 和 4 和 6 和 8
合并八组,得到: 1 2 3 4 5 6 8 9
最终结果: 1 2 3 4 5 6 8 9

5 归并排序

速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列 中级数据开发工程师养成计_第4张图片

6 快速排序

选择一个基准元素,将序列分成两个子序列,一个子序列中的元素都比基准元素小,另一个子序列中的元素都比基准元素大。
对这两个子序列再分别选择一个基准元素,递归执行第一步,直到子序列的长度为1或0。
将所有子序列的结果合并起来,即得到排序后的序列。

7 堆排序
8 计数排序
9 桶排序
10 基数排序

14 JAVA 常识

15 产品运营

用户洞察
整体上
第一步,制定一个目标 (拉新|提频 |挽回)
第二步,业务策略 (投放渠道|活动模式|时间点)
第三步,圈人
第四步,试点运营
第五步,全量运营
第六步,效果分析
马后炮,不断迭代

标签

标签可根据来源分为三种属性,分别为事实标签、模型标签、预测标签。

事实标签是系统自动获取数据,定性或定量描述用户的自然属性、产品属性、消费属性、资源属性等,一般是用户主动提供的数据,包括如姓名、性别、年龄、身高、体重、职业、地区、设备信息、来源渠道等用户固定数据,可用于判断用户基础需求。

模型标签是对用户属性及行为等属性的抽象和聚类,通过剖析用户的基础数据为用户贴上相应的总结概括性标签及指数,标签代表用户的兴趣、偏好、需求等,指数代表用户的兴趣程度、需求程度、购买概率等,可用于提升用户体验。

预测标签指基于用户的属性、行为、信令、位置和特征,挖掘用户潜在需求,针对这些潜在需求配合营销策略、规则进行打标,实现营销适时、适机、适景推送给用户,结合自有数据及第三方数据补充均可作为建立预测标签数据来源,预测标签是设计千人千面和运营策略的关键,可用于提升用户转化和提高产品价值。 ----是不是类似于人群?

你可能感兴趣的:(大数据,java,大数据)