架构师之路:数据中台产品策略与规划

作者:禅与计算机程序设计艺术

1.简介

数据中台,顾名思义就是数据集成的一个平台,也是企业内部数据的共享和整合工具。数据中台的主要作用在于提升数据仓库、数据湖、数据应用三者之间的数据价值,建立统一的业务域数据模型,以及统一的数据开发流程、数据服务接口及标准化。数据中台不仅可以避免多个系统之间数据的重复建设,而且还能为数据分析、人工智能等提供了更加广泛的支持。
数据中台产品的定位非常清晰,它是一个集数据采集、处理、分发、分析、存储和应用为一体的平台,作为连接不同系统、不同渠道的数据的桥梁和中转站,其核心能力包括数据采集、数据传输、数据存储、数据分析、数据可视化、数据报表和数据订阅等。这类产品具有较高的复杂性、易用性、灵活性、弹性、敏捷性、实时性、安全性、可靠性等。因此,数据中台产品的设计、研发和运营需要有足够的专业知识、积累的经验和能力,并且需要长期跟踪和研究市场的需求变化,根据这些需求调整产品功能、架构、接口和协议。
在设计数据中台产品时,需要考虑到业务数据安全、数据质量、数据一致性、数据多样性、数据可用性、数据反馈速度、数据可靠性、数据开发效率、数据查询效率等方面因素,力争做到精准无缝、真实可信、持续创新、高效可靠。为了实现数据中台产品的顺利落地,企业除了需要深刻理解数据中台的特性外,也要善于利用云计算、大数据等新技术,推动数据中台的自动化和智能化,构建起一个全新的金融、电商、政务等领域的数据共同体。
本书将详细阐述数据中台的产品策略与规划,希望能够帮助读者了解如何设计、部署和运营数据中台,并逐步打造出一个完整、高性能的数据集成解决方案。通过阅读本书,读者可以掌握数据中台的理论和方法,用实际案例指导企业规划和实施数据中台的产品策略,构建起自己的“数据中台”。

2.基本概念术语说明

2.1 数据中台概览

数据中台(Data Hub)是一种服务于企业所有系统或应用的数据集合,旨在降低数据各环节之间的耦合度、减少重复开发、提升整体数据效率、优化数据的精确度、增强数据的透明度、保障数据的安全性。数据中台由数据采集、数据传输、数据处理、数据分析、数据管理、数据服务五个层级构成。

  • 数据采集层:采集端将数据上传至中台服务器,然后进行预处理(清洗、转换、审核),再进行数据校验、数据去重、数据验证等数据质量保证工作。
  • 数据传输层:采用分布式文件系统、消息队列、流计算、异构数据源等方式,实现数据集中存储、分布式流转和迅速访问。
  • 数据处理层:对数据进行分析、过滤、转换、补齐、重塑,使数据变得更加精细化、有序、可理解。
  • 数据分析层:支持丰富的数据统计、机器学习、图像识别等数据挖掘和分析技术,提供多维分析、关联分析、因子分析、聚类分析、异常检测、决策树等模式挖掘功能。
  • 数据管理层:数据中台提供数据湖、数据库、数据沉淀、数据元数据管理等功能,用于存储数据元信息、元数据,提供统一的数据视图、控制权限和使用规则。
  • 数据服务层:数据中台为各系统或应用提供统一的数据服务接口,包括API、SDK、微服务等多种形式,同时支持多种数据交互协议,例如HTTP、HTTPS、TCP/IP、UDP等,以便于实现异构系统的数据接入、数据共享。

2.2 数据中台产品类型

数据中台产品一般可以分为两类:中心型产品和边缘型产品。中心型产品通常承担着数据采集、数据传输、数据处理等职责,通常会根据公司的特定业务需求设计相应的数据模型、数据结构、数据流程、数据调度、数据质量保证、数据备份和运营策略。中心型产品往往具备比较完善的技术框架,比如数据采集端一般都会选择开源组件或者云服务商提供的定制化服务,而数据处理端则可以基于数据湖搭建自己的分析、报告、仪表盘等,并提供相关的API给上游系统调用。中心型产品的一个优点是将各种系统的数据源汇聚到一起,做到了数据的全覆盖,但是缺点是技术框架固定、维护周期长、资源消耗高,适用于小型公司、小中型公司、中型公司等规模较大的公司。
边缘型产品一般只负责数据传输、数据处理等最基础的功能,通常会采用较轻量级的中间件或插件方式对外提供服务,根据公司的实际业务场景选取合适的传输协议和编解码器,如FTP、SFTP、MQTT、AMQP等,但是对于复杂的业务逻辑、数据分析需求可能会牺牲部分性能以提升运行效率。边缘型产品往往只是承担着数据传输、数据处理的功能,但不会对数据有太多的挖�uches、计算、分析能力,适用于公司有一定规模、同时又不想引入过于复杂的技术栈的公司。

2.3 数据中台架构模式

数据中台架构模式分为数据仓库型、数据湖型、数据智能型、数据管道型四种,其对应的架构如下所示。

  1. 数据仓库型数据中台架构
    数据仓库型数据中台架构为大型、复杂、数据量巨大的企业级组织设计,按照数据仓库的各个阶段来分,总体来说分为以下几个阶段:
  • 原始数据采集层:企业原始数据采集,此阶段主要是获取企业各个部门产生的原始数据。
  • 数据转换层:此阶段主要是将企业各个部门产生的数据进行转换、重组、扩展、规范化等,形成通用的结构化数据模型。
  • 数据集成层:此阶段主要是将不同系统、不同数据库、不同文件等数据按照统一的数据模型进行集成。
  • 元数据管理层:此阶段主要是为数据赋予统一的元数据定义和规则,为数据分析、决策提供支持。
  • 数据治理层:此阶段主要是对数据的生命周期进行管理,并确保数据质量,提升数据价值。
  • 数据分析层:此阶段主要是基于数据仓库内置的多维分析、关联分析、因子分析、聚类分析等模式挖掘技术,进行数据分析,并生成可视化报表、结果通知等。
    数据仓库型数据中台架构虽然非常复杂,但是它的优势在于可以达到真正意义上的数据集成和分析,对整个企业的数据进行全面的支撑,从而促进企业的核心竞争力。另一方面,由于其天生的数据可扩展性和容错性,可以应对复杂的业务场景,且实现高度集成、可复用的目标。但是,其也存在一些问题,比如架构技术框架复杂、数据门槛高、资源消耗高等。
  1. 数据湖型数据中台架构
    数据湖型数据中台架构在2016年国际数据湖大会上被提出,是一种更加适合大数据应用场景的数据中台架构模式。该架构模式的特点是在原有的技术栈基础上,增加了数据湖集群,并通过数据湖集群与中心集群数据共享,将不同系统、不同网络、不同协议的数据进行集中管理和分析。
  • 中心集群:中心集群是指存放原始数据、进行数据转换后的已结构化数据集。
  • 数据湖集群:数据湖集群是指数据的真实存储集群,是真正承载数据分析、挖掘分析工作的地方。数据湖集群是由海量数据进行存储的地方,可以在该区域进行实时的分析工作。
  • 元数据管理层:元数据管理层主要是为数据湖中的数据赋予统一的元数据定义和规则,为数据分析、决策提供支持。
  • 数据治理层:数据治理层主要针对数据湖中存储的原始数据和结构化数据进行管理和治理,确保数据的有效性、稳定性、可用性、安全性。
    数据湖型数据中台架构与数据仓库型数据中台架构相比,其技术框架、架构拓扑和数据集成模式都有很大差别。数据湖型数据中台架构主要是基于海量数据的存储、检索、分析、展示、输出等方面,借助云计算、大数据等技术手段,将数据集中、分布式管理,实现数据的快速、高效、智能的分析。数据湖型数据中台架构的优势是可以真正实现数据海量的存储、分析、处理和共享,弥补中心型数据中台架构的缺陷。但是,其也存在一些问题,比如中心集群和数据湖集群的技术栈限制、元数据管理和治理成本高等。
  1. 数据智能型数据中台架构
    数据智能型数据中台架构是指以人工智能技术为核心,结合数据采集、传输、存储、分析等技术手段,通过AI模型的训练和部署,实现对数据的自动化智能分析和预测,从而为用户提供高效便捷的决策支持。
  • AI模型训练和部署:企业构建AI模型,通过定制化或开源组件进行模型训练和部署。
  • 数据采集层:数据采集层负责对外接入数据,进行数据清洗、转换等工作。
  • 数据传输层:数据传输层负责将数据以统一格式进行传输。
  • 数据存储层:数据存储层将不同数据存储到数据湖。
  • 数据分析层:数据分析层对数据湖中存储的原始数据进行分析。
  • 数据报表层:数据报表层将数据分析结果生成报表。
  • 数据应用层:数据应用层将数据分析结果提供给最终用户。
    数据智能型数据中台架构目前仍处于起步阶段,缺乏成熟产品,技术积累有限,很难完全替代中心型数据中台架构。
  1. 数据管道型数据中台架构
    数据管道型数据中台架构属于边缘型数据中台架构的一种变体,主要是通过管道、代理等技术手段,实现数据的快速传递。
  • 数据采集层:数据采集层负责对外接入数据,进行数据清洗、转换等工作。
  • 数据传输层:数据传输层负责将数据以统一格式进行传输。
  • 数据处理层:数据处理层对接收到的原始数据进行数据处理。
  • 数据订阅层:数据订阅层向其他系统订阅数据。
  • 数据服务层:数据服务层为其他系统提供数据服务接口。
    数据管道型数据中台架构刚刚起步阶段,目前也没有看到大规模的公司采用这种架构模式。但也说明边缘型数据中台架构还有很多可以优化的空间。

2.4 数据中台产品策略

数据中台的产品策略即是如何设计和部署数据中台产品,涉及三个主要方面:数据中台架构、数据采集、数据传输。

  1. 数据中台架构设计
    数据中台的架构设计既包括对数据仓库、数据湖、数据智能等各个方面数据的采集、处理、传输等一系列环节的设计,也包括数据集成、数据分发、数据服务等整体的系统架构设计。数据中台架构设计涉及到业务的理解、技术的选择、方案的制定、实施和评估等多个方面。
  2. 数据采集设计
    数据采集设计包括数据的收集、存储、处理、传输等流程的设计,根据公司不同业务场景进行采集设计,设计不同的数据采集配置参数,有利于数据的准确性、完整性和时效性。
  3. 数据传输设计
    数据传输设计包括数据的存储、查询、分析、展示、输出等流程的设计,根据数据中台的传输协议、网路传输速率等进行设计,有利于数据的高效性、低延时性、安全性和可靠性。

2.5 数据中台运营策略

数据中台运营策略包括数据中台产品的部署、运维、管理、监控等方面。

  1. 数据中台产品部署
    数据中台产品的部署主要是指数据中台各个方面产品的部署,包括数据采集端、数据传输端、数据处理端、数据分析端、数据管理端、数据服务端等。不同的数据中台产品可以安装在不同的主机上,从而实现分布式部署。
  2. 数据中台运维
    数据中台的运维主要是指数据中台各个方面的运维,包括日志记录、监控报警、数据容灾、故障恢复等方面。数据中台的运维人员可以根据数据中台产品的特点制定相应的运维计划,从而确保数据中台产品的正常运行。
  3. 数据中台管理
    数据中台的管理主要是指数据中台的管理工具和手段,包括数据分析、数据质量、元数据管理、数据运营等。数据中台的管理工具可以用来进行数据分析、数据质量、元数据管理、数据运营等功能。
  4. 数据中台监控
    数据中台的监控主要是指数据中台各个方面产品的运行状态监控,包括实时数据采集、传输、存储、处理、分析、输出等方面。数据中台的监控工具可以对各个数据中台方面的产品进行实时数据监控。

3.核心算法原理及具体操作步骤与数学公式

数据中台产品中最重要的部分之一就是数据分析。这里,我们以简单的数据分析功能来讲解数据中台产品的原理及具体操作步骤。

3.1 数据分析核心算法

数据分析算法主要分为四种:

  1. 分类算法:包括贝叶斯、决策树、朴素贝叶斯、K近邻、随机森林、支持向量机等。
  2. 回归算法:包括线性回归、多项式回归、平滑回归、岭回归、卡方回归等。
  3. 聚类算法:包括k-means、层次聚类、DBSCAN、凝聚聚类等。
  4. 概率密度算法:包括高斯核函数、拉普拉斯金字塔、最大熵模型、局部密度范围模型等。

3.2 数据分析操作步骤

数据中台产品的核心功能就是数据分析,但是由于各个领域的特征,数据的结构千变万化,我们无法一概而论,只能根据自己的数据情况选择合适的算法进行分析。下面是一些常见的操作步骤:

  1. 数据准备:加载数据、清洗数据、转换数据、匹配数据、合并数据、规范数据等。
  2. 数据筛选:按照特定的条件来选择数据。
  3. 数据预处理:对数据进行处理,包括归一化、标准化、离群点处理、缺失值填充等。
  4. 数据探索:通过统计图表或数值描述,对数据进行可视化和探索,找到数据中的规律和模式。
  5. 模型拟合:选择合适的算法模型,并通过训练数据,对模型进行训练,得到模型参数。
  6. 模型评估:对模型进行评估,评估模型的好坏程度,选择好的模型继续使用。
  7. 模型预测:在测试集或生产环境下,输入待预测数据,经过模型处理后得到预测结果。
  8. 模型发布:将模型转换为API接口,供其他系统调用,提供模型结果。

4.具体代码实例及解释说明

有些算法算法细节比较复杂,这时候就需要借助代码进行讲解。下面给大家提供一些数据中台产品中常用的算法实现的代码实例及解释说明。

4.1 K-means聚类算法

K-means算法是最简单的聚类算法之一,它的基本思想就是通过迭代求解,将各个数据点分配到距离最近的均值点所在的簇中,直到各个簇的中心位置不再移动。

import numpy as np
def k_means(data, K):
  N = data.shape[0]
  C = np.zeros((N, K)) # 初始化K个中心点
  labels = np.zeros(N) # 初始化每个样本对应的簇标签
  
  for i in range(K):
      C[:,i] = np.mean(data[np.random.choice(N, size=1)], axis=0) # 随机选择K个中心点
      
  while True:
      dist = ((data[:, None]-C)**2).sum(-1) # 计算每个样本到每个中心点的距离
      new_labels = dist.argmin(axis=-1)
      
      if (new_labels==labels).all():
          break;
          
      for i in range(K):
          C[:,i] = np.mean(data[new_labels==i], axis=0) # 更新中心点
          
      labels = new_labels
          
  return C, labels  

4.1.1 参数解析

data: 样本矩阵,每行对应一个样本,列数表示特征个数;
K:聚类的个数。

4.1.2 返回值解析

函数返回两个值,分别是:
C: 聚类中心矩阵,每行对应一个聚类中心,列数等于聚类个数;
labels: 每个样本对应的簇标签。

4.2 DBSCAN聚类算法

DBSCAN算法是Density-Based Spatial Clustering of Applications with Noise的简称,该算法以密度连通的思想,通过扫描周围邻域样本的密度来判断是否属于同一簇。

from collections import deque
def dbscan(data, eps, minPts):
  visited = set()
  result = []
  n_cluster = 0
  
  for idx in range(len(data)):
      if idx not in visited:
          queue = deque([idx])
          cluster = []
          
          while len(queue)!=0:
              point = queue.popleft()
              cluster.append(point)
              
              visited.add(point)
                  
              neighbors = [neighbor for neighbor in get_neighbors(point, data)]
                  
              for neighbor in neighbors:
                  if neighbor not in visited and distance(data[point], data[neighbor])<=eps:
                      queue.append(neighbor)
                      
          if len(cluster)>minPts:
              result.append(cluster)
              n_cluster += 1
              
  print("Number of clusters:", n_cluster)
  return result
def get_neighbors(point, points):
  distances = [(pidx, euclidean_distance(points[pidx], points[point])) for pidx in range(len(points))]
  sorted_distances = sorted(distances, key=lambda x: x[-1])[:5] # 取最近的5个邻居
  return [sorted_dist[0] for sorted_dist in sorted_distances]
  
def euclidean_distance(pointA, pointB):
  return sum([(a-b)**2 for a, b in zip(pointA, pointB)])**0.5

4.2.1 参数解析

data: 样本矩阵,每行对应一个样本,列数表示特征个数;
eps: 指定半径大小,当样本点到任意两个样本点之间的距离小于等于该半径时,认为它们是邻居;
minPts: 指定核心点的最小数量。

4.2.2 返回值解析

函数返回一个值,这个值的类型是list,其中元素都是list,每个list代表一个簇。
每个簇中的元素都是整数,代表对应点的索引号。

4.3 概率密度算法

概率密度算法包括高斯核函数、拉普拉斯金字塔、最大熵模型、局部密度范围模型等。其中,高斯核函数是最常用的方法,它假定数据服从正态分布,通过拟合得到局部密度曲线。

import numpy as np
import scipy.stats
def gaussian_kernel(X, Y, sigma):
  return np.exp((-1/(2*sigma**2))*euclidean_distance(X,Y))
def laplacian_pyramid(X, Y, scales, truncate):
  pyramids = []
  
  for scale in scales:
      dists = [[gaussian_kernel(x,y,scale*truncate), gaussian_kernel(x+scale*truncate, y, truncate), 
          gaussian_kernel(x-scale*truncate, y, truncate)] for x,y in zip(X, Y)]
      
      marginalized = normalize(np.hstack(dists)).reshape(-1,1)
      
      pyramids.append(marginalized)
      
  return pyramids
def maxent_model(samples, n_components):
  X = np.array(samples)
  M = local_maxima(X)
  phi = compute_phi(M, X)
  w = softmax(-phi, axis=0)
  mean = np.dot(w, X) / np.sum(w)
  cov = np.cov(X.T, ddof=0, aweights=(w/np.linalg.norm(w)))
  
  model = {
    
    'phi': phi, 'w': w,'mean': mean, 'cov': cov}
  return model['mean'], model['cov']
def local_maxima(X, kernel='gaussian', bandwidth=None):
  """Compute the indices of all local maxima"""
  if kernel=='gaussian' and not isinstance(bandwidth, float):
      raise ValueError('For Gaussian kernel, need to specify the bandwidth')
  
  if kernel=='gaussian':
      D = np.sqrt(laplacian_pyramid(X[:,0], X[:,1], [0.1, 0.5, 1], bandwidth))
      L = np.prod(D, axis=0)*np.ones(X.shape[0])
  elif kernel=='uniform':
      pass
      
  peaks = find_peaks(L)[0].tolist()
  
  return peaks
  
def find_peaks(arr):
 """Find the local maxima of an array."""
 diff = arr[1:] > arr[:-1]
 rising_edges = np.where(diff & ~arr[1:-1])[0] + 1
 falling_edges = np.where(~diff & arr[1:-1])[0] + 1
  left_bases = rising_edges - np.arange(1, len(rising_edges)+1)
 right_bases = falling_edges + np.arange(1, len(falling_edges)+1)
  bases = list(zip(left_bases, right_bases))
 heights = [max(arr[left:right+1]) for left, right in bases]
  return np.asarray(heights), np.asarray(bases)
def normalize(v):
  norm = np.linalg.norm(v, ord=1)
  if norm == 0: 
      return v
  return v / norm
def compute_phi(M, samples):
  num_clusters = len(M)
  dim = samples.shape[1]
   phi = np.zeros((num_clusters, dim, dim))
   for j in range(dim):
      for l in range(j, dim):
          marginals = [samples[(M[i])] for i in range(num_clusters)]
           phi[:, j, l] = [scipy.stats.multivariate_normal.pdf(sample, mean=marginals[i][:,j], 
              cov=marginals[i][:,:l]+marginals[i][l+1:,j:]) for i in range(num_clusters)]
           phi[:, l, j] = phi[:, j, l]
  
  return phi
def softmax(z, axis=None):
  s = np.exp(z - z.max())
  return s / s.sum(axis=axis, keepdims=True)

4.3.1 参数解析

X: 样本矩阵,每行对应一个样本,列数表示特征个数;
scales: 金字塔尺度列表,其中第一个尺度为1,第二个尺度为0.5,第三个尺度为0.1;
truncate: 拉普拉斯金字塔截断系数;
n_components: 最大熵模型的隐变量个数。

4.3.2 返回值解析

函数返回两个值,分别是:
mean: 最大熵模型的均值;
cov: 最大熵模型的协方差矩阵。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/132014029