版权声明:本套技术专栏是做者(秦凯新)平时工做的总结和升华,经过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,若有任何技术交流,可随时联系。java
屏蔽业务的影响,没必要改一次业务就须要从新接入数据(进行业务解耦)。node
减小重复开发,开发一些通用的中间层数据,可以减小极大的重复计算(抽取通用数据,造成维度)算法
一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。并且便于维护数据的准确性,当数据出现问题以后,能够不用修复全部的数据,只须要从有问题的步骤开始修复。(数据分层开发以及有步骤修复)sql
清晰数据结构:每个数据分层都有它的做用域,这样咱们在使用表的时候能更方便地定位和理解。(STAGE ,ODS ,DWD,DWS做用域各司其职)数据库
优雅地把数据DWD层和轻度汇总层放在同一个层级上,同时独立出来了维表和临时表。apache
STAGE 层(与业务系统数据保持一致,多数据源的临时存储) STAGE 层做为数据缓冲层,主要负责采集不一样类型的业务系统数据并保存必定期限内的相关业务数据,完成不一样类型数据源的统一临时存储,同时避免 ETL 操做对业务系统性能形成影响,STAGE 层数据在数据结构、数据之间的逻辑关系上都与业务系统基本保持一致。缓存
ODS 数据层(与业务系统数据保持一致,进行数据清洗及规范化,保证不一样源数据的最终数据一致性,获得业务要求的指标数据表) ODS(Operational Data Store)层数据来源于 STAGE 层,它的数据通过了对 STAGE 层数据的清洗,包括编码表去重、去空、垃圾数据过滤、数据类型规则化等。安全
DWD 数据层(添加代理键,造成关联体系,可单独对外提供查询服务) 把 ODS 数据表结构改变成项目主题数据仓库的表结构,对 DWD 层的全部表添加了代理键,标准化了业务系统编码类型不统一的问题,创建了数据仓库维度表和事实表的关联体系,也为缓慢变化维的实现奠基了基础。数据结构
DWS:轻度汇总层(数据汇总,可与DWD进行并行存在) DWS:轻度汇总层,从ODS层中对用户的行为作一个初步的汇总,抽象出来一些通用的维度:时间、ip、id,并根据这些维度作一些统计值,好比用户每一个时间段在不一样登陆ip购买的商品数等。这里作一层轻度的汇总会让计算更加的高效,在此基础上若是计算仅7天、30天、90天的行为的话会快不少。咱们但愿80%的业务都能经过咱们的DWS层计算,而不是ODS。架构
ODS -> DWS: 不必通过 dwd。我举个例子,你的浏览商品行为,我作一层轻度汇总,就直接放在 dws 了
DWD -> DWS: 若是所须要的资料表,要从好多表凑成一份,咱们从四五份我的资料表中凑出来了一份完整的资料表放在了 dwd 中。而后在 app 层,咱们要出一张画像表,包含用户资料和用户近一年的行为,咱们就直接从dwd中拿资料, 而后再在 dws 的基础上作一层统计,就成一个app表了。固然,这不是绝对,dws 和 dwd 有没有依赖关系主要看有没有这种需求。
DWC 数据层(数据推送到业务系统,如经过消息队列进行解耦) DWC(Data Warehouse Center)层主要管理固化报表的数据存储,数据主要来源于 DWD 层,根据前台所需数据创建物理模型,使用 ETL 抽取 DWD 层数据推送给 DWC 层,这样显著减小前台应用直接关联 DWD 层查询明细数据的成本,提升平台数据获取的速度。
TMP:临时表(临时表关联) TMP每一层的计算都会有不少临时表,专设一个DWTMP层来存储咱们数据仓库的临时表。
DM 数据层(数据主题) DM(Data Mart)层即数据集市,将指标与维度创建物理模型组成数据集市,这是 OLAP 的数据基础。该层实现了合并不一样系统的数据源来知足面向主题的业务需求,它的建模是终端用户驱动的,也是由业务需求驱动的。按主题,维度及 KPI 指标对 DM 层进行模型设计、建模,DM 层数据是将 DWD 层数据进行进一步整合、转换、汇总、计算等 ETL 操做处理获取的。
数据异常若是由客户方发现的而不是你,那么它带来的负面影响会超过你以前作的全部业务带来的正面影响。
数据对帐 Kafka数据落地,必需要有一个监控机制来知道咱们的数据落地状况,离线数据一样须要数据对帐,对帐方法有不少,好比能够和业务库来对比。
性能监控
Kylin 可扩展: 指能够对其主要依赖的三个模块作任意的扩展和替换,Kylin 的三大依赖模块分别是数据源(Hive)、构建引擎(MR)和存储引擎(HBase)
Layered Cubing构建算法: 四维 Cube 须要五轮的 MapReduce 来完成:第一轮 MR 的输入是源数据,这一步会对维度列的值进行编码,并计算 ABCD 组合的结果。接下来的 MR 以上一轮的输出结果为输入,向上聚合计算三个维度的组合:ABC、BCD、ABD和ACD;依此类推,直到算出全部的维度组合。问题是不能充分利用系统的资源以及缓存中间计算结果,存在shuffle过程,重点是稳定
Fast Cubing 构建算法:最大化利用 Mapper 端的 CPU 和内存,对分配的数据块,将须要的组合全都作计算后再输出给 Reducer;由 Reducer 再作一次合并(Merge),从而计算出完整数据的全部组合。配置方式kylin_job_conf_inmem.xml,包含了 MR 任务的配置项,当 Cube 构建算法是 Fast Cubing 时,会根据该文件的设置调整构建任务中的 MR 参数
调优必填项:
#KYLIN配置
kylin.query.force-limit 默认是没有限制,推荐设置为 1000;
kylin.storage.hbase.hfile-size-gb 能够设置为 1,有助于加快 MR 速度;
kylin.storage.hbase.min-region-count 能够设置为 HBase 节点数,强制数据分散在 N 个节点;
kylin.storage.hbase.compression-codec 默认没有进行压缩,推荐在环境运行状况下配置压缩算法。
#Hadoop配置
yarn.nodemanager.resource.memory-mb 配置项的值不小于 8192MB
yarn.scheduler.maximum-allocation-mb 配置项的值不小于 4096MB
mapreduce.reduce.memory.mb 配置项的值不小于 700MB
mapreduce.reduce.java.opts 配置项的值不小于 512MB
yarn.nodemanager.resource.cpu-vcores 配置项的值不小于 8
//运行在yarn-cluster模式,固然能够配置为独立 Spark 集群:spark://ip:7077
kylin.engine.spark-conf.spark.master=yarn
kylin.engine.spark-conf.spark.submit.deployMode=cluster
//启动动态资源分配
kylin.engine.spark-conf.spark.dynamicAllocation.enabled=true
kylin.engine.spark-conf.spark.dynamicAllocation.minExecutors=2
kylin.engine.spark-conf.spark.dynamicAllocation.maxExecutors=1000
kylin.engine.spark-conf.spark.dynamicAllocation.executorIdleTimeout=300
kylin.engine.spark-conf.spark.shuffle.service.enabled=true
kylin.engine.spark-conf.spark.shuffle.service.port=7337
//内存设置
kylin.engine.spark-conf.spark.driver.memory=2G
//数据规模较大或者字典较大时,调大 executor 内存
kylin.engine.spark-conf.spark.executor.memory=8G
kylin.engine.spark-conf.spark.executor.cores=4
//心跳超时
kylin.engine.spark-conf.spark.network.timeout=600
//分区大小
kylin.engine.spark.rdd-partition-cut-mb=100
复制代码
Count_Distinct 度量:
近似实现:基于 HyperLogLog 算法,可接受的错误率(从9.75% 到 1.22%),低错误率须要更多存储;
精确实现:基于 Bitmap(位图)算法,对于数据型为 tinyint、smallint 和 int 的数据,
将把数据对应的值直接打入位图;对于数据型为 long,string 和其余的数
据,将它们编码成字符串放入字典,而后再将对应的值打入位图。
返回的度量结果是已经序列化的位图数据,而不只是计算的值。
复制代码
EXTEND_COLUMN 优化设置,解决存在对某个 id 进行过滤,但查询结果要展现为 name 的状况。
聚合组(Aggregation Group)
必要维度(Mandatory Dimension)
层级维度 (Hierachy Dimension)
联合维度(Joint Dimension)
Rowkeys编码,推荐的顺序为:Mandatory 维度、where 过滤条件中出现频率较多的维度、高基数维度、低基数维度。这样作的好处是,充分利用过滤条件来缩小在 HBase 中扫描的范围,从而提升查询的效率
dict:适用于大部分字段,默认推荐使用,但在超高基状况下,可能引发内存不足的问题;
boolean:适用于字段值为true, false, TRUE, FALSE, True, False, t, f, T, F, yes, no, YES, NO, Yes, No, y, n, Y, N, 1, 0;integer:适用于字段值为整数字符。
date:适用于字段值为日期字符,支持的格式包括yyyyMMdd、yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm:ss.SSS,其中若是包含时间戳部分会被截断;
fix_length:适用于超高基场景,将选取字段的前 N 个字节做为编码值,当 N 小于字段长度,会形成字段截断
复制代码
ShardBy 设置:建议选择基数较大的列做为 ShardBy 列,以使得数据能够均匀分布;
Kylin 实例是无状态的服务,运行时的状态信息存储在 HBase metastore 中。 出于负载均衡的考虑,您能够启用多个共享一个 metastore 的 Kylin 实例,使得各个节点分担查询压力且互为备份,从而提升服务的可用性。
Kylin 集群模式部署 若是您须要将多个 Kylin 节点组成集群,请确保他们使用同一个 Hadoop 集群、HBase 集群。而后在每一个节点的配置文件 $KYLIN_HOME/conf/kylin.properties 中执行下述操做:
任务引擎高可用 从 v2.0 开始, Kylin 支持多个任务引擎一块儿运行,相比于默认单任务引擎的配置,多引擎能够保证任务构建的高可用。
使用多任务引擎,你能够在多个 Kylin 节点上配置它的角色为 job 或 all。为了不它们之间产生竞争,须要启用分布式任务锁,请在 kylin.properties 里配置:
kylin.job.scheduler.default=2
kylin.job.lock=org.apache.kylin.storage.hbase.util.ZookeeperJobLock
复制代码
从Kylin的配置文件kylin.properties中查看到:
## The metadata store in hbase
kylin.metadata.url=kylin_metadata@hbase
表示Kylin的元数据被保存在HBase的kylin_metadata表中
复制代码
备份Kylin的元数据
/bin/metastore.sh backup
这将备份元数据到本地目录KYLIN_HOME/metadata_backps下面,目录的命名格式为:
KYLIN_HOME/meta_backups/meta_year_month_day_hour_minute_second
好比个人Kylin的家目录为/var/lib/kylin/kylin,那么备份数据的目录为:
/var/lib/kylin/kylin/meta_backups/meta_2018_01_04_11_50_32
复制代码
恢复元数据
首先reset当前Kylin的元数据存储,这将清理掉全部存储在HBase中的Kylin元数据,确保在此以前作过备份。
./bin/metastore.sh reset
复制代码
上传备份的元数据到Kylin的元数据中
./bin/metastore.sh restore$KYLIN_HOME/meta_backups/meta_xxxx_xx_xx_xx_xx_xx
复制代码
从Kylin元数据中清理掉无用的资源
(1)首先,执行检查,这是安全的操做,不会修改任何内容:
./bin/metastore.sh clean
将须要被删除的资源(resources)罗列出来
(2)添加“--delete true”参数,这样就会清理掉哪些无用的资源。
切记,在这个命令操做以前,必定要备份Kylin元数据:
./bin/metastore.sh clean --delete true
复制代码
消息中间件削峰填谷
手动流量开关配合数据库运维操做
多系统同时订阅数据(广播模式fanout)
实时数据计算限流控制,把消息系统做为数据存储中间引擎,经过设置不一样的消费速度进行数据的流入管控。
版权声明:本套技术专栏是做者(秦凯新)平时工做的总结和升华,经过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,若有任何技术交流,可随时联系。
工业级大数据平台的系统要求很是高,对于高并发的场景犹如屡见不鲜,这也是我为何花费大量笔墨来解析我主导的工业大数据仓库的主要缘由,到目前为止,这个架构是我最成功的平台案例。包含了几乎主流的大数据组件。固然还有Kylin,今天收到Kylin团队的邀请,但愿将来可以为国产的优秀开源项目作一点贡献。
版权声明:本套技术专栏是做者(秦凯新)平时工做的总结和升华,经过从真实商业环境抽取案例进行总结和分享,并给出商业应用的调优建议和集群环境容量规划等内容,请持续关注本套博客。QQ邮箱地址:1120746959@qq.com,若有任何技术交流,可随时联系。
秦凯新 于深圳