1、事务事实表:又称作原子事实表,主要是用来描述业务过程,跟踪控件或者时间上某点的度量事件,保存的是最原子的数据
2、周期事实表:以一个周期作为一个时间间隔,用来记录事实,一个周期可以是每天、每周、每月、每年等。
3、累计快照事实表:用来描述过程开始和过程结束之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个日期字段来记录关键时间点,当过程随着生命周期不断的变化时,记录也会随着生命的周期变化而被修改。
数仓分层,阿里主要分成了五层,分别是ods、dwd、dim、dws、ads层,每一层都有自己的一个单独的作用
ods层的主要的作用就是将数据从数据源采集过来,对数据来说,基本上是不做任何的处理。
dwd层这层的主要的作用就是ods层的数据采集过来,在这层会对数据做一些处理,例如说在这层会对一些空的数据进行过滤,对于用户的手机号、身份证号码进行加密的操作等。
dim层主要存储的是一些维度数据,就是一些不怎么变化的数据,例如说一些省份的名称是不会发生改变的。
dws层的主要的作用就是对数据进行汇总,构建宽表,对维度表进行维度退化的操作
ads层的主要的作用就是计算一些指标,对外使用构建好的宽表,以便计算指标。
在构建宽表的时候需要注意的是禁止逆向调用,需要避免同层调用、还需要避免跨层调用
对数据进行清洗,过滤一些空数据,对敏感数据进行脱敏操作。又是也会做一些维度退化。
做宽表实际上就是做join,实际上就是做维度退化,把维度表中的数据退化到事实表中。
就是将维度表退化到事实表中,例如说一个订单表,是一个事实表,还有一个就是商品的信息表,是维度表,将来进行展示的时候,需要展示的商品的所有的信息,就类似于join,将维度表关联到事实表中。
主要存放的就是一些不怎么变化的数据表,就比如说一些地域的省份的名称就不会发生改变。
有度量值的表,就是哪些需要需要参与计算的一些表,就比如说订单表中会有金额、数量等信息。
hdfs中的组件主要包括namenode、datanode、SecondaryNameNode分别的作用:
namenode:主要的作用就是存储元数据,也是接收客户端的一些读写数据的请求。
datanode:是hdfs中的真实存储数据的地方,会与namenode保持保持心跳机制。
SecondaryNameNode:主要的作用就是用来合并日志文件,下次hadoop会根据这个合并的文件启动。将hadoop中的edit logs文件合并到fismage文件中。
不适合存储小文件的原因:
首先小文件的数量变多,那么namenode的压力就会变大,因为元数据是存储在namenode中,可能会导致namenode出现宕机。其次就是计算的资源消耗会比较大,小文件越多,map任务的数量就会越多,此时消耗的计算资源就会比较多。
解决方法:
1、使用har归档,hadoop archive(har),是一个高效的将小文件放入到hdfs块中的文件存档工具,它能够将多个小文件打包成一个HAR文件
例如:
在本地准备两个小文件:
cat >
user1.txt<
user2.txt<
将本地的文件put到hdfs中
hdfs dfs -put user.* /foo/bar/
对某个目录/foo/bar下的所有小文件存档成/outputdir/zoo.har:
hadoop archive -archiveName foo.har -p /foo/bar/outputdir
查看文件:
hdfs dfs -ls har:///user/zoo/foo.har
但是需要注意的是,对小文件进行存档的时候,原来的小文件是不会被删除的,需要用户进行手动删除。
2、使用Sequence file 由一个二进制key/value组成,如果key为小文件的名称,那么value就是文件的内容,可以将大批的小文件合并成一个大文件。
3、CombineFileinputFormat(针对hive表中的小文件数合并处理)
是一种新的inputformat,用于将多个文件合并成一个单独的split,在map和reduce处理之前进行合并小文件。
4、开启JVM重用
有小文件的时候需要开启JVM重用,会在任务执行前将所有需要的资源进行申请,当任务只想完成后在释放资源。
mapreduce.job.jvm.numtasks
10
How many tasks to run per jvm,if set to -1 ,there is no limit
5、将本地的小文件进行合并,再将文件上传到hdfs中。(appenToFile)
将本地的多个小文件上传到hdfs中,可以通过hdfs的客户端的appendToFile命令对小文件进行合并
在本地准备两个文件:
cat
>user1.txt<user2.txt<
6、合并hdfs中的小文件,下载到本地(getmerge)
可以通过hdfs中的命令getmerge,将多个小文件进行合并,在下载到本地。
# 先上传小文件到
hdfs dfs -put user1.txt user2.txt /test/upload
# 下载,同时合并:
hdfs dfs -getmerge /test/upload/user*.txt ./merged_user.txt
⽤UDF函数解析公共字段,⽤UDTF函数解析事件字段 ,⾃定义UDF:继承UDF,重写evaluate⽅法
hbase的架构主要包括zookeeper、regionserver、region、memstore、storefile、hmaster、hlog
zookeeper作用:
1、保证在任何的时候,集群中只含有一个hmaster(hbase也是一个主从架构的,支持高可用)
2、存储所有的region的寻址入口,用户需要访问数据,就需要向zookeeper发送请求,获取元数据的元数据表的地址信息,返回给客户端,客户端与对应的regionserver建立连接
3、实时监控regionserver的上线和下线,实时向hmaster进行报告。
hmaster作用:
1、为regionserver分配region
2、监控region server,发现失败的region server,重新分配region
3、管理用户对表的增删改。
regionserver作用:
1、regionserver用来维护region,负责接受region的io
2、region server负责监控region,对于那个变大的region进行切分。
hlog作用:
就是hadoop中的有个Sequence File,Sequence File 的Key是 HLogKey对象,HLogKey中记录了写入数据的归属信息,除了table和 region名字外,同时还包括sequence number和timestamp,timestamp是” 写入时间”,sequence number的起始值为0,或者是最近一次存入文件系 统sequence number。HLog SequeceFile的Value是HBase的KeyValue对象,即对应HFile中的 KeyValue
region作用:
hbase会自动的将表水平划分成多个region,每一个region中都存储一串连续的数据,首先一张表一开始只含有一个region,但是随着数据的不断的插入,region就会不断的增大,当达到一定的阙值的时候(默认是128M),region就会等分成两个region,当表中的行不断的增加,就会有越来越多的region,被regionserver多管理。
memstore作用:
1、一个region由多个store组成,一个store对应一个CF(列簇)
2、store包括位于内存中的memstore和位于磁盘的storefile写操作先写入 memstore,当memstore中的数据达到某个阈值,hregionserver会启动 flashcache进程写入storefile,每次写入形成单独的一个storefile
3、当storefile文件的数量增长到一定阈值后,系统会进行合并(minor、 major compaction),在合并过程中会进行版本合并和删除工作 (majar),形成更大的storefile。
4、当一个region所有storefile的大小和超过一定阈值后,会把当前的region 分割为两个,并由hmaster分配到相应的regionserver服务器,实现负载均衡。
5、客户端检索数据,先在memstore找,找不到再找storefile
6、HRegion是HBase中分布式存储和负载均衡的最小单元。最小单元就表 示不同的HRegion可以分布在不同的HRegion server上。
7、HRegion由一个或者多个Store组成,每个store保存一个columns family。
8、每个Strore又由一个memStore和0至多个StoreFile组成。
转化算子 :map、gruopby、groupbykey、reducebukey
行为算子:foreach、foreachpartition、take、top、count
persist(持久化):在大数据处理的框架中,persists是将rdd或者是dataframe持久化到内存中,或者是持久化到磁盘中,以便在后续的操作中重复中这些数据而不需要在冲重新计算,持久化是用来提高性能,在使用相同的数据的时候,比较明显,可以选择不同级别的持久化,例如:MEMORY_ONLY
、DISK_ONLY
、MEMORY_AND_DISK
cache(缓存):在类似的spark这样的分布式计算框架中,cache的主要的作用是将数据缓存到内存中,以便以后可以快速的访问。
两者的区别:
1、持久化的方式不同:persists既可以将数据缓存到内存中,也可以将数据缓存到磁盘中。
2、使用的方式不同:persists是一种比较通用的持久化的方式,可以选择不同的缓存级别,然而对于cache来说,它是persists的一种的特殊情况,将数据持久化到内存中。
1、RDD
RDD是spark中最早引入的抽象数据类型,代表的是一个弹性分布式数据集。
RDD是面向对象的,可以包含任何类型的java、scala、python对象
2、dataframe
是基于RDD的高级抽象,代表的是一张表格化的数据结构,类似于关系型数据库中的表。
dataframe具有优化的执行计划,可以提高新性能。
dataframe通常用于结构化数据的处理,支持sql操作,列式操作,dataframe API等。
3、dataset
结合了rdd面向对象的风格和dsataframe的查询优化的特点
dataset是类型安全的,允许使用强类型的API,可以在编译的时候捕获编译的错误。
主要是用来资源隔离,因为在flink中,每一个task都是在taskmanager中运行,solt就是最小的资源单位,每一个solt中接受一个task,防止在多个task在运行的时候抢占资源。
client、jobmanager、taskmanager
client:
构建和配置flink作业,设置作业的参数并将任务通过flink run提交到jobmanager上去执行。
jobmanager:
主要的作用是负责接收客户端的作业提交的请求,负责整体任务的资源调度,协调任务之间的数据交换,同时也负责整体的状态维护。
taskmanager:
主要是负责接受jobmanager分配的任务,并执行这些任务,并负责任务之间的数据传输并将计算的结果返回。
滑动窗口、滚动窗口、会话窗口、统计窗口
会话窗口:在定义的时候于滑动窗口、滚动窗口的区别是在定义窗口的时候是基于事件之间的间隔,而不是固定的时间段或者是固定数量的事件。
1、选择业务 2、声明粒度 3、确定维度 4、确定事实 5、冗余维度