- 博客(50)
- 收藏
- 关注
原创 简单搞定数仓搭建:ODS层设计规范
命名规范表命名规范表命名规则:{层次}{源系统表名}{保留位/delta与否}。 增量数据:{project_name}.s{源系统表名}delta。 全量数据:{project_name}.s{源系统表名}。 ODS ETL过程的临时表:{project_name}.tmp{临时表所在过程的输出表}{从0开始的序号}。 按小时同步的增量表:{project_name}.s{源系统表名}{delta}_{hh}。 按小时同步的全量表:{project_name}.s{源系统表名}{hh
2021-09-28 16:13:26
830
原创 简单搞定数仓搭建:层次调用规范
层次调用规范ADS应用层优先调用数据仓库公共层数据。如果已经存在CDM层数据,不允许ADS应用层跨过CDM中间层从ODS层重复加工数据。CDM中间层应该积极了解应用层数据的建设需求,将公用的数据沉淀到公共层,为其他数据层次提供数据服务。同时,ADS应用层也需积极配合CDM中间层进行持续的数据公共建设的改造。避免出现过度的ODS层引用、不合理的数据复制和子集合冗余。总体遵循的层次调用原则如下:ODS层数据不能直接被应用层任务引用。如果中间层没有沉淀的ODS层数据,则通过CDM层的视图访问。CDM层视图
2021-09-15 17:39:29
830
原创 简单搞定数仓搭建:数仓模型(DIM)
公共维度汇总层DIM(Dimension)基于维度建模理念,建立整个企业的一致性维度。公共维度汇总层(DIM)主要由维度表(维表)构成。维度是逻辑概念,是衡量和观察业务的角度。维表是根据维度及其属性将数据平台上构建的物理化的表,采用宽表设计的原则。因此,公共维度汇总层(DIM)首先需要定义维度。定义维度在划分数据域、构建总线矩阵时,需要结合对业务过程的分析定义维度。本教程以A电商公司的营销业务板块为例,在交易数据域中,我们重点考察确认收货(交易成功)的业务过程。在确认收货的业务过程中,主要有
2021-08-30 18:10:38
2342
1
原创 简单搞定数仓搭建:数仓模型(DWS)
公共汇总粒度事实层以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求构建公共粒度的汇总指标事实表。公共汇总层的一个表通常会对应一个派生指标。公共汇总事实表设计原则聚集是指针对原始明细粒度的数据进行汇总。DWS公共汇总层是面向分析对象的主题聚集建模。在本教程中,最终的分析目标为:最近一天某个类目(例如:厨具)商品在各省的销售总额、该类目Top10销售额商品名称、各省用户购买力分布。因此,我们可以以最终交易成功的商品、类目、买家等角度对最近一天的数据进行汇总。注意聚集是不跨越事实的。聚
2021-08-18 19:21:28
1345
原创 简单搞定数仓搭建:数仓模型(DWD)
明细粒度事实层(DWD)明细粒度事实层以业务过程驱动建模,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。您可以结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。公共汇总粒度事实层(DWS)和明细粒度事实层(DWD)的事实表作为数据仓库维度建模的核心,需紧绕业务过程来设计。通过获取描述业务过程的度量来描述业务过程,包括引用的维度和与业务过程有关的度量。度量通常为数值型数据,作为事实逻辑表的依据。事实逻辑表的描述信息是事实属性,事实属性中的外键字段通过对应维度
2021-08-11 18:01:44
1945
原创 简单搞定数仓搭建:数仓模型(ODS)
数据引入层(ODS)ODS(Operational Data Store)层存放您从业务系统获取的最原始的数据,是其他上层数据的源数据。业务数据系统中的数据通常为非常细节的数据,经过长时间累积,且访问频率很高,是面向应用的数据。数据引入层表设计本教程中,在ODS层主要包括的数据有:交易系统订单详情、用户信息详情、商品详情等。这些数据未经处理,是最原始的数据。逻辑上,这些数据都是以二维表的形式存储。虽然严格的说ODS层不属于数仓建模的范畴,但是合理的规划ODS层并做好数据同步也非常重要。本教程中,
2021-08-03 16:14:15
1501
转载 简单搞定数仓搭建:数仓分层
我们建议将数据仓库分为三层,自下而上为:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层(ADS,Application Data Service)。数据仓库的分层和各层级用途如下图所示。数据引入层ODS(Operation Data Store):存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区。主要完成基础数据引入到MaxCompute的职责,同时记录基础数据的历史变化。
2021-07-23 19:39:32
544
原创 简单搞定数仓搭建:架构与模型设计(二)
上期引用:https://mp.csdn.net/mp_blog/creation/editor/118491690数据模型目录数据引入层(ODS)数据引入层表设计建表示例数据引入层存储缓慢变化维度明细粒度事实层(DWD)明细粒度事实表设计原则明细粒度事实层(DWD)规范建表示例公共汇总粒度事实层(DWS)公共汇总事实表设计原则公共汇总事实表规范建表示例公共维度汇总层(DIM)定义维度设计维表公共维度汇总层(DIM)维表规范建表
2021-07-16 15:55:35
703
原创 简单搞定数仓搭建:架构与模型设计(一)
技术架构选型在数据模型设计之前,您需要首先完成技术架构的选型。本教程中使用阿里云大数据产品MaxCompute配合DataWorks,完成整体的数据建模和研发流程。完整的技术架构图如下图所示。其中,DataWorks的数据集成负责完成数据的采集和基本的ETL。MaxCompute作为整个大数据开发过程中的离线计算引擎。DataWorks则包括数据开发、数据质量、数据安全、数据管理等在内的一系列功能。数仓分层我们建议将数据仓库分为三层,自下而上为:数据引入层(ODS,Operatio.
2021-07-05 16:05:32
620
原创 pulsar简介
这两年pulsar发展比较快,有好多大公司引入了pulsar,相关的资料和课程也多了,今天一起来了解一下pulsar这款中间件。下图是几款消息中间件的历史:2012年pulsar在Yahoo内部开发,2016年开源并捐献给Apache,2018成为Apache顶级项目。1架构pulsar的架构图如下:总结一下,pulsar有下面的几个特性。1.1 计算存储分离pulsar采用计算和存储相分离的架构,Broker集群负责把producer发出的消息发送给consum
2021-06-28 11:03:38
9116
原创 简单搞定数仓搭建:业务调研
确定需求您在构建数据仓库之前,首先需要确定构建数据仓库的目标与需求,并进行全面的业务调研。您需要了解真实的业务需求,以及确定数据仓库要解决的问题。业务调研充分的业务调研和需求分析是数据仓库建设的基石,直接决定数据仓库能否建设成功。在数仓建设项目启动前,您需要请相关的业务人员介绍具体的业务,以便明确各个团队的分析员和运营人员的需求,沉淀出相关文档。您可以通过调查表和访谈等形式详细了解以下信息:用户的组织架构和分工界面。 例如,用户可能分为数据分析、运营和维护部门人员,各个部门对数据仓库的
2021-06-28 10:47:19
836
原创 简单搞定数仓搭建:数仓构建流程
基本概念在正式学习本教程之前,您需要首先理解以下基本概念:业务板块:比数据域更高维度的业务划分方法,适用于庞大的业务系统。 维度:维度建模由Ralph Kimball提出。维度模型主张从分析决策的需求出发构建模型,为分析需求服务。维度是度量的环境,是我们观察业务的角度,用来反映业务的一类属性。属性的集合构成维度,维度也可以称为实体对象。例如,在分析交易过程时,可以通过买家、卖家、商品和时间等维度描述交易发生的环境。 属性(维度属性):维度所包含的表示维度的列称为维度属性。维度属性是查询约束条件、
2021-06-21 11:22:02
598
1
原创 简单搞定数仓搭建:数仓规范
DMP数仓规范1. 数据模型架构规范1.1数据层次的划分ODS:Operational Data Store,操作数据层,在结构上其与源系统的增量或者全量数据基本保持一致。它相当于DW数据的一个数据准备区,同时又承担着基础数据的记录以及历史变化。其主要作用是把基础数据引入到DMP。 CDM:Common Data Model,公共维度模型层,又细分为DWD和DWS。它的主要作用是完成数据加工与整合,建立一致性的维度,构建可复用的面向分析和统计的明细事实表,以及汇总公共粒度的指标。 DWD:D
2021-06-15 11:37:55
1625
1
原创 简单搞定Spark性能优化:常见异常解决(三)
第一部分内容链接:https://blog.csdn.net/github_36444580/article/details/117037685die
2021-05-31 14:17:46
5032
原创 简单搞定Spark性能优化:常见异常解决(二)
第一部分内容链接:https://blog.csdn.net/github_36444580/article/details/11703768511.ERROR shuffle.RetryingBlockFetcher: Failed to fetch block shuffle_7_18444_7412, and will not retry原因:Executor被kill,无法拉取该block。可能是开启AE特性时数据倾斜造成的,其他executor都已完成工作被回收,只有倾斜的exec..
2021-05-24 11:13:07
2296
4
原创 简单搞定Spark性能优化:常见异常解决(一)
spark日志查看方法分享一个博客:https://blog.csdn.net/qq_33588730/article/details/109353336异常集1.org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow原因:kryo序列化缓存空间不足。解决方法:增加参数,--confspark.kryoserializer.buffer.max=2047m。2.o...
2021-05-19 17:34:13
1333
2
转载 简单搞定Kafka: producer拦截器
拦截器原理Producer拦截器(interceptor)是在Kafka 0.10版本被引入的,主要用于实现clients端的定制化控制逻辑。对于producer而言,interceptor使得用户在消息发送前以及producer回调逻辑前有机会对消息做一些定制化需求,比如修改消息等。同时,producer允许用户指定多个interceptor按序作用于同一条消息从而形成一个拦截链(interceptor chain)。Intercetpor的实现接口是org.apache.kafka.client
2021-05-08 19:34:24
144
原创 简单搞定Kafka: 工作流程分析
Kafka生产过程分析写入方式producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机写内存要高,保障kafka吞吐率)。分区(Partition)消息发送时都被发送到一个topic,其本质就是一个目录,而topic是由一些PartitionLogs(分区日志)组成,其组织结构如下图所示:我们可以看到,每个Partition中的消息都是有序的,生产的消息被不断...
2021-04-26 17:02:50
147
转载 简单搞定Kafka:消费过程分析
高级API1)高级API优点高级API 写起来简单不需要去自行去管理offset,系统通过zookeeper自行管理不需要管理分区,副本等情况,系统自动管理消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据(默认设置1分钟更新一下zookeeper中存的的offset)可以使用group来区分对同一个topic 的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响)2)高级AP
2021-04-19 15:14:45
142
原创 简单搞定Kafka:分布式集群部署
环境准备集群规划 hadoop102 hadoop103 hadoop104 zk zk zk kafka kafka kafka jar包下载下载地址:http://kafka.apache.org/downloads.html虚拟机准备1)准备3台虚拟机2)配置ip地址3)配置主机名称4)3台主机分别关闭防火墙安装jdk...
2021-04-12 14:22:55
131
原创 简单搞定Kafka:Consumer均衡算法
kafka的Consumer均衡算法有一个topic:test,然后这个topic的partition和他们所在的broker的图如下:1.其中 broker有两个,也就是服务器有两台。2.partition有6个,分布按照如图所示,按照哈希取模的算法分配。3.消费者有8个,他们属于同一个消费组。如果按照如图所示,那么这一个消费组中的消费者会怎么取kafka的数据呢?其实kafka的消费端有一个均衡算法,算法如下:1.A=(partition数量/同分组消费者总个数)..
2021-04-06 15:38:21
311
转载 简单搞定Spark性能优化:数据倾斜调优(二)
shuffle调优调优概述大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。因此,如果要让作 业的性能更上一层楼,就有必要对shuffle过程进行调优。但是也必须提醒大家的是,影响一个Spark作业性能的因素,主要还是代码开发、资源参数以 及数据倾斜,shuffle调优只能在整个Spark的性能调优中占到一小部分而已。因此大家务必把握住调优的基本原则,千万不要舍本逐末。下面我们就给 大家详细讲解shuffle的原理,以及相关参数
2021-04-06 14:50:37
124
原创 简单搞定Spark性能优化:数据倾斜调优(一)
数据倾斜调优一、调优概述有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。二、数据倾斜发生时的现象绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。 原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出
2021-03-30 16:30:52
152
1
原创 Spark核心编程:Spark运行原理
一、spark重要角色1、Driver2、Master3、Worker4、Executor5、Task二、图解运行原理
2021-03-23 15:35:30
109
原创 Spark核心编程:wordcount程序原理深度剖析
一、wordcount编码val conf = new SparkConf().setAppName("WordCount")val sc = new JavaSparkContext(conf)val lines = sc.textFile("hdfs://spark1:9000/spark.txt")val words = lines.flatMap(line => line.split(" "))val pairs = words.map(word => (word,
2021-03-15 11:01:04
231
原创 Spark核心编程:Spark基本工作原理与RDD
一、spark工作原理1、分布式2、主要基于内存(少数情况基于磁盘)3、迭代式计算二、RDD以及其特点1、RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式数据集。2、RDD在抽象上来说是一种元素集合,包含了数据。它是被分区的,分为多个分区,每个分区分布在集群中的不同节点上,从而让RDD中的数据可以被并行操作。(分布式数据集)3、RDD通常通过Hadoop上的文件,即HDFS文件或者Hive表,来进行创建;.
2021-03-09 11:59:05
264
原创 简单搞定Spark性能优化:性能优化概览
一、spark性能优化概览由于Spark的计算本质是基于内存的,所以Spark性能程序的性能可能因为集群中的任何因素出现瓶颈:CPU、网络带宽、或者是内存。如果内存能够容纳得下所有的数据,那么网络传输和通信就会导致性能出现瓶颈。但是如果内存比较紧张,不足以放下所有的数据(比如在针对10亿以上的数据量进行计算时),还是需要对内存的使用进行性能优化的,比如说使用一些手段来减少内存的消耗。Spark性能优化,其实主要就是在于对内存的使用进行调优。因为通常情况下来说,如果你的Spark应用程序计算的数据..
2021-03-01 14:55:30
184
原创 简单搞定Spark性能优化:诊断内存的消耗
一、内存都花哪了?1、每个Java对象,都有一个对象头,会占用16个字节,主要是包括了一些对象的元信息,比如指向它的类的指针。如果一个对象本身很小,比如就包括了一个int类型的field,那么它的对象头实际上比对象自己还要大。2、Java的String对象,会比它内部的原始数据,要多出40个字节。因为它内部使用char数组来保存内部的字符序列的,并且还得保存诸如数组长度之类的信息。而且因为String使用的是UTF-16编码,所以每个字符会占用2个字节。比如,包含10个字符的String,会占用60
2021-02-22 10:55:56
258
原创 简单搞定Spark性能优化:优化数据结构
一、优化数据结构背景要减少内存的消耗,除了使用高效的序列化类库以外,还有一个很重要的事情,就是优化数据结构。从而避免Java语法特性中所导致的额外内存的开销,比如基于指针的Java数据结构,以及包装类型。有一个关键的问题,就是优化什么数据结构?其实主要就是优化你的算子函数,内部使用到的局部数据,或者是算子函数外部的数据。都可以进行数据结构的优化。优化之后,都会减少其对内存的消耗和占用。二、如何优化数据结构1、优先使用数组以及字符串,而不是集合类。也就是说,优先用array,而不是Arr.
2021-02-02 15:03:11
96
原创 简单搞定Spark性能优化:持久化级别
一、使用序列化的持久化级别除了对多次使用的RDD进行持久化操作之外,还可以进一步优化其性能。因为很有可能,RDD的数据是持久化到内存,或者磁盘中的。那么,此时,如果内存大小不是特别充足,完全可以使用序列化的持久化级别,比如MEMORY_ONLY_SER、MEMORY_AND_DISK_SER等。使用RDD.persist(StorageLevel.MEMORY_ONLY_SER)这样的语法即可。这样的话,将数据序列化之后,再持久化,可以大大减小对内存的消耗。此外,数据量小了之后,如果要写入磁盘,那么磁盘
2021-01-25 17:02:54
170
原创 简单搞定Spark性能优化:Java虚拟机垃圾回收调优
一、java虚拟机垃圾回收调优背景如果在持久化RDD的时候,持久化了大量的数据,那么Java虚拟机的垃圾回收就可能成为一个性能瓶颈。因为Java虚拟机会定期进行垃圾回收,此时就会追踪所有的java对象,并且在垃圾回收时,找到那些已经不在使用的对象,然后清理旧的对象,来给新的对象腾出内存空间。垃圾回收的性能开销,是跟内存中的对象的数量,成正比的。所以,对于垃圾回收的性能问题,首先要做的就是,使用更高效的数据结构,比如array和string;其次就是在持久化rdd时,使用序列化的持久化级别,而且用Kr
2021-01-18 14:56:54
216
原创 简单搞定Spark性能优化:并行度设置
一、并行度设置的必要性实际上Spark集群的资源并不一定会被充分利用到,所以要尽量设置合理的并行度,来充分地利用集群的资源。才能充分提高Spark应用程序的性能。Spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如HDFS,就会给每一个block创建一个partition,也依据这个设置并行度。对于reduceByKey等会发生shuffle的操作,就使用并行度最大的父RDD的并行度即可。可以手动使用textFile()、parallelize()等方法的第二个参数来设置并行度
2021-01-12 18:07:42
1444
原创 简单搞定Spark性能优化:广播共享数据
一、广播共享数据如果你的算子函数中,使用到了特别大的数据,那么,这个时候,推荐将该数据进行广播。这样的话,就不至于将一个大数据拷贝到每一个task上去。而是给每个节点拷贝一份,然后节点上的task共享该数据。这样的话,就可以减少大数据在节点上的内存消耗。并且可以减少数据到节点的网络传输消耗。二、广播变量的原理广播变量,初始的时候,就在Drvier上有一份副本。task在运行的时候,想要使用广播变量中的数据,此时首先会在自己本地的Executor对应的BlockManager中,尝试获取.
2021-01-05 11:43:27
143
原创 简单搞定Spark性能优化:数据本地化
一、数据本地化背景数据本地化对于Spark Job性能有着巨大的影响。如果数据以及要计算它的代码是在一起的,那么性能当然会非常高。但是,如果数据和计算它的代码是分开的,那么其中之一必须到另外一方的机器上。通常来说,移动代码到其他节点,会比移动数据到代码所在的节点上去,速度要快得多,因为代码比较小。Spark也正是基于这个数据本地化的原则来构建task调度算法的。数据本地化,指的是,数据离计算它的代码有多近。基于数据距离代码的距离,有几种数据本地化级别:1、PROCESS_LOCAL:数据和计算它
2020-12-28 14:32:49
214
原创 简单搞定spark shuffle算子性能优化
一、reduceByKey和groupByKey对比val counts = pairs.reduceByKey(_ + _)val counts = pairs.groupByKey().map(wordCounts => (wordCounts._1, wordCounts._2.sum))如果能用reduceByKey,那就用reduceByKey,因为它会在map端,先进行本地combine,可以大大减少要传输到reduce端的数据量,减小网络传输的开销。只有在reduceBy
2020-12-23 12:35:40
121
原创 简单搞定 Spark RDD常用算子
一、transformation和action 介绍Spark支持两种RDD操作:transformation和action。transformation操作会针对已有的RDD创建一个新的RDD;而action则主要是对RDD进行最后的操作,比如遍历、reduce、保存到文件等,并可以返回结果给Driver程序。例如,map就是一种transformation操作,它用于将已有RDD的每个元素传入一个自定义的函数,并获取一个新的元素,然后将所有的新元素组成一个新的RDD。而reduce就是一种act
2020-12-14 14:17:55
113
原创 简单搞定Spark RDD持久化
一、RDD持久化原理:Spark非常重要的一个功能特性就是可以将RDD持久化在内存中。当对RDD执行持久化操作时,每个节点都会将自己操作的RDD的partition持久化到内存中,并且在之后对该RDD的反复使用中,直接使用内存缓存的partition。这样的话,对于针对一个RDD反复执行多个操作的场景,就只要对RDD计算一次即可,后面直接使用该RDD,而不需要反复计算多次该RDD。巧妙使用RDD持久化,甚至在某些场景下,可以将spark应用程序的性能提升10倍。对于迭代式算法和快速交互式应用来说,R
2020-12-07 17:56:56
264
原创 简单搞定 Executor 原理剖析与源码分析
一、图解 Executor 原理剖析与源码分析1、CoarseGrainedExecutorBackendExecutor 的守护进程:Executor对象的创建及维护是由CoarseGrainedExecutorBackend负责的,CoarseGrainedExecutorBackend在spark运行期是一个单独的进程。2、Executor注册机制3、task运行机制...
2020-12-02 18:22:05
115
原创 简单搞定Spark Master主备切换机制原理剖析与源码分析
一、Master 原理剖析与源码分析1、主备切换机制原理剖析与源码分析2、注册机制原理剖析与源码分析
2020-11-23 17:50:52
137
1
原创 简单搞定spark shuffle性能优化
一、shuffle性能优化,配置项new SparkConf().set("spark.shuffle.consolidateFiles", "true")spark.shuffle.consolidateFiles:是否开启shuffle block file的合并,默认为falsespark.reducer.maxSizeInFlight:reduce task的拉取缓存,默认48mspark.shuffle.file.buffer:map task的写磁盘缓存,默认32kspark
2020-11-16 12:06:50
271
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人