Tips
Go
(18条消息) Go语言自学系列 | golang包_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之channel的遍历_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之select switch_COCOgsta的博客-CSDN博客_golang select switch
(18条消息) Go语言自学系列 | golang并发编程之runtime包_COCOgsta的博客-CSDN博客_golang runtime包
(18条消息) Go语言自学系列 | golang接口值类型接收者和指针类型接收者_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之Timer_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang方法_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之WaitGroup实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang构造函数_COCOgsta的博客-CSDN博客_golang 构造函数
(18条消息) Go语言自学系列 | golang方法接收者类型_COCOgsta的博客-CSDN博客_golang 方法接收者
(18条消息) Go语言自学系列 | golang接口_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang接口和类型的关系_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang结构体_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件读操作_COCOgsta的博客-CSDN博客_golang os.file
(18条消息) Go语言自学系列 | golang继承_COCOgsta的博客-CSDN博客_golang 继承
(18条消息) Go语言自学系列 | golang嵌套结构体_COCOgsta的博客-CSDN博客_golang 结构体嵌套
(18条消息) Go语言自学系列 | golang并发编程之Mutex互斥锁实现同步_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发变成之通道channel_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang并发编程之原子操作详解_COCOgsta的博客-CSDN博客_golang 原子操作
(18条消息) Go语言自学系列 | golang并发编程之原子变量的引入_COCOgsta的博客-CSDN博客_go 原子变量
(18条消息) Go语言自学系列 | golang并发编程之协程_COCOgsta的博客-CSDN博客_golang 协程 并发
(18条消息) Go语言自学系列 | golang接口嵌套_COCOgsta的博客-CSDN博客_golang 接口嵌套
(18条消息) Go语言自学系列 | golang包管理工具go module_COCOgsta的博客-CSDN博客_golang 包管理器
(18条消息) Go语言自学系列 | golang标准库os模块 - File文件写操作_COCOgsta的博客-CSDN博客_go os模块
(18条消息) Go语言自学系列 | golang结构体的初始化_COCOgsta的博客-CSDN博客_golang 结构体初始化
(18条消息) Go语言自学系列 | golang通过接口实现OCP设计原则_COCOgsta的博客-CSDN博客
(18条消息) Go语言自学系列 | golang标准库os包进程相关操作_COCOgsta的博客-CSDN博客_golang os包
(18条消息) Go语言自学系列 | golang标准库ioutil包_COCOgsta的博客-CSDN博客_golang ioutil
(18条消息) Go语言自学系列 | golang标准库os模块 - 文件目录相关_COCOgsta的博客-CSDN博客_go语言os库
Golang技术栈,Golang文章、教程、视频分享!
(18条消息) Go语言自学系列 | golang结构体指针_COCOgsta的博客-CSDN博客_golang 结构体指针
Ansible
太厉害了,终于有人能把Ansible讲的明明白白了,建议收藏_互联网老辛
ansible.cfg配置详解
Docker
Docker部署
linux安装docker和Docker Compose
linux 安装 docker
Docker中安装Docker遇到的问题处理
Docker常用命令
docker常用命令小结
docker 彻底卸载
Docker pull 时报错:Get https://registry-1.docker.io/v2/library/mysql: net/http: TLS handshake timeout
Docker 拉镜像无法访问 registry-x.docker.io 问题(Centos7)
docker 容器内没有权限
Linux中关闭selinux的方法是什么?
docker run 生成 docker-compose
Docker覆盖网络部署
docker pull后台拉取镜像
docker hub
Redis
Redis 集群别乱搭,这才是正确的姿势
linux_离线_redis安装
怎么实现Redis的高可用?(主从、哨兵、集群) - 雨点的名字 - 博客园
redis集群离线安装
always-show-logo yes
Redis集群搭建及原理
[ERR] Node 172.168.63.202:7001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some - 亲爱的不二999 - 博客园
Redis daemonize介绍
redis 下载地址
Redis的redis.conf配置注释详解(三) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(一) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(二) - 云+社区 - 腾讯云
Redis的redis.conf配置注释详解(四) - 云+社区 - 腾讯云
Linux
在终端连接ssh的断开关闭退出的方法
漏洞扫描 - 灰信网(软件开发博客聚合)
find 命令的参数详解
vim 编辑器搜索功能
非root安装rpm时,mockbuild does not exist
Using a SSH password instead of a key is not possible because Host Key checking
(9条消息) 安全扫描5353端口mDNS服务漏洞问题_NamiJava的博客-CSDN博客_5353端口
Linux中使用rpm命令安装rpm包
ssh-copy-id非22端口的使用方法
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
Linux cp 命令
yum 下载全量依赖 rpm 包及离线安装(终极解决方案) - 叨叨软件测试 - 博客园
How To Resolve SSH Weak Key Exchange Algorithms on CentOS7 or RHEL7 - infotechys.com
RPM zlib 下载地址
运维架构网站
欢迎来到 Jinja2
/usr/local/bin/ss-server -uv -c /etc/shadowsocks-libev/config.json -f /var/run/s
ruby 安装Openssl 默认安装位置
Linux 常用命令学习 | 菜鸟教程
linux 重命名文件和文件夹
linux命令快速指南
ipvsadm
Linux 下查找日志中的关键字
Linux 切割大 log 日志
CentOS7 关于网络的设置
rsync 命令_Linux rsync 命令用法详解:远程数据同步工具
linux 可视化界面安装
[问题已处理]-执行yum卡住无响应
GCC/G++升级高版本
ELK
Docker部署ELK
ELK+kafka+filebeat+Prometheus+Grafana - SegmentFault 思否
(9条消息) Elasticsearch设置账号密码_huas_xq的博客-CSDN博客_elasticsearch设置密码
Elasticsearch 7.X 性能优化
Elasticsearch-滚动更新
Elasticsearch 的内存优化_大数据系统
Elasticsearch之yml配置文件
ES 索引为Yellow状态
Logstash:Grok filter 入门
logstash grok 多项匹配
Mysql
Mysql相关Tip
基于ShardingJDBC实现数据库读写分离 - 墨天轮
MySQL-MHA高可用方案
京东三面:我要查询千万级数据量的表,怎么操作?
OpenStack
(16条消息) openstack项目中遇到的各种问题总结 其二(云主机迁移、ceph及扩展分区)_weixin_34104341的博客-CSDN博客
OpenStack组件介绍
百度大佬OpenStack流程
openstack各组件介绍
OpenStack生产实际问题总结(一)
OpenStack Train版离线部署
使用Packstack搭建OpenStack
K8S
K8S部署
K8S 集群部署
kubeadm 重新 init 和 join-pudn.com
Kubernetes 实战总结 - 阿里云 ECS 自建 K8S 集群 Kubernetes 实战总结 - 自定义 Prometheus
【K8S实战系列-清理篇1】k8s docker 删除没用的资源
Flannel Pod Bug汇总
Java
Jdk 部署
JDK部署
java线程池ThreadPoolExecutor类使用详解 - bigfan - 博客园
ShardingJDBC实现多数据库节点分库分表 - 墨天轮
Maven Repository: Search/Browse/Explore
其他
Git在阿里,我们如何管理代码分支?
chrome F12调试网页出现Paused in debugger
体验IntelliJ IDEA的远程开发(Remote Development) - 掘金
Idea远程调试
PDF转MD
强哥分享干货
优秀开源项目集合
vercel 配合Github 搭建项目Doc门户
如何用 Github Issues 写技术博客?
Idea 2021.3 Maven 3.8.1 报错 Blocked mirror for repositories 解决
列出maven依赖
[2022-09 持续更新] 谷歌 google 镜像 / Sci-Hub 可用网址 / Github 镜像可用网址总结
阿里云ECS迁移
linux访问github
一文教你使用 Docker 启动并安装 Nacos-腾讯云开发者社区-腾讯云
Nginx
Nginx 部署
Nginx 部署安装
Nginx反向代理cookie丢失的问题_longzhoufeng的博客-CSDN博客_nginx 代理后cookie丢失
Linux 系统 Https 证书生成与Nginx配置 https
数据仓库
实时数仓
松果出行 x StarRocks:实时数仓新范式的实践之路
实时数据仓库的一些分层和分层需要处理的事情,以及数据流向
湖仓一体电商项目
湖仓一体电商项目(一):项目背景和架构介绍
湖仓一体电商项目(二):项目使用技术及版本和基础环境准备
湖仓一体电商项目(三):3万字带你从头开始搭建12个大数据项目基础组件
数仓笔记
数仓学习总结
数仓常用平台和框架
数仓学习笔记
数仓技术选型
尚硅谷教程
尚硅谷学习笔记
尚硅谷所有已知的课件资料
尚硅谷大数据项目之尚品汇(11数据质量管理V4.0)
尚硅谷大数据项目之尚品汇(10元数据管理AtlasV4.0)
尚硅谷大数据项目之尚品汇(9权限管理RangerV4.0)
尚硅谷大数据项目之尚品汇(8安全环境实战V4.0)
尚硅谷大数据项目之尚品汇(7用户认证KerberosV4.1)
尚硅谷大数据项目之尚品汇(6集群监控ZabbixV4.1)
尚硅谷大数据项目之尚品汇(5即席查询PrestoKylinV4.0)
尚硅谷大数据项目之尚品汇(4可视化报表SupersetV4.0)
尚硅谷大数据项目之尚品汇(3数据仓库系统)V4.2.0
尚硅谷大数据项目之尚品汇(2业务数据采集平台)V4.1.0
尚硅谷大数据项目之尚品汇(1用户行为采集平台)V4.1.0
数仓治理
数据中台 元数据规范
数据中台的那些 “经验与陷阱”
2万字详解数据仓库数据指标数据治理体系建设方法论
数据仓库,为什么需要分层建设和管理? | 人人都是产品经理
网易数帆数据治理演进
数仓技术
一文看懂大数据生态圈完整知识体系
阿里云—升舱 - 数据仓库升级白皮书
最全企业级数仓建设迭代版(4W字建议收藏)
基于Hue,Dolphinscheduler,HIVE分析数据仓库层级实现及项目需求案例实践分析
详解数据仓库分层架构
数据仓库技术细节
大数据平台组件介绍
总览 2016-2021 年全球机器学习、人工智能和大数据行业技术地图
Apache DolphinScheduler 3.0.0 正式版发布!
数据仓库面试题——介绍下数据仓库
数据仓库为什么要分层,各层的作用是什么
Databend v0.8 发布,基于 Rust 开发的现代化云数据仓库 - OSCHINA - 中文开源技术交流社区
数据中台
数据中台设计
大数据同步工具之 FlinkCDC/Canal/Debezium 对比
有数数据开发平台文档
Shell
Linux Shell 命令参数
shell 脚本编程
一篇教会你写 90% 的 Shell 脚本
Kibana
Kibana 查询语言(KQL)
Kibana:在 Kibana 中的四种表格制作方式
Kafka
Kafka部署
canal 动态监控 Mysql,将 binlog 日志解析后,把采集到的数据发送到 Kafka
OpenApi
OpenAPI 标准规范,了解一下?
OpenApi学术论文
贵阳市政府数据开放平台设计与实现
OpenAPI简介
开放平台:运营模式与技术架构研究综述
管理
技术部门Leader是不是一定要技术大牛担任?
华为管理体系流程介绍
DevOps
*Ops
XOps 已经成为一个流行的术语 - 它是什么?
Practical Linux DevOps
Jenkins 2.x实践指南 (翟志军)
Jenkins 2权威指南 ((美)布伦特·莱斯特(Brent Laster)
DevOps组件高可用的思路
KeepAlived
VIP + KEEPALIVED + LVS 遇到Connection Peer的问题的解决
MinIO
MinIO部署
Minio 分布式集群搭建部署
Minio 入门系列【16】Minio 分片上传文件 putObject 接口流程源码分析
MinioAPI 浅入及问题
部署 minio 兼容 aws S3 模式
超详细分布式对象存储 MinIO 实战教程
Hadoop
Hadoop 部署
Hadoop集群部署
windows 搭建 hadoop 环境(解决 HADOOP_HOME and hadoop.home.dir are unset
Hadoop 集群搭建和简单应用(参考下文)
Hadoop 启动 NameNode 报错 ERROR: Cannot set priority of namenode process 2639
jps 命令查看 DataNode 进程不见了 (hadoop3.0 亲测可用)
hadoop 报错: Operation category READ is not supported in state standby
Spark
Spark 部署
Spark 集群部署
spark 心跳超时分析 Cannot receive any reply in 120 seconds
Spark学习笔记
apache spark - Failed to find data source: parquet, when building with sbt assembly
Spark Thrift Server 架构和原理介绍
InLong
InLong 部署
Apache InLong部署文档
安装部署 - Docker 部署 - 《Apache InLong v1.2 中文文档》 - 书栈网 · BookStack
基于 Apache Flink SQL 的 InLong Sort ETL 方案解析
关于 Apache Pulsar 在 Apache InLong 接入数据
zookeeper
zookeeper 部署
使用 Docker 搭建 Zookeeper 集群
美团技术团队
StarRocks
StarRocks技术白皮书(在线版)
JuiceFS
AI 场景存储优化:云知声超算平台基于 JuiceFS 的存储实践
JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践
JuiceFS format
元数据备份和恢复 | JuiceFS Document Center
JuiceFS 元数据引擎选型指南
Apache Hudi 使用文件聚类功能 (Clustering) 解决小文件过多的问题
普罗米修斯
k8s 之 Prometheus(普罗米修斯)监控,简单梳理下 K8S 监控流程
k8s 部署 - 使用helm3部署监控prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 使用 helm3 部署监控 prometheus(普罗米修斯),从零到有,一文搞定
k8s 部署 - 如何完善 k8s 中 Prometheus(普罗米修斯)监控项目呢?
k8s 部署 - k8s 中 Prometheus(普罗米修斯)的大屏展示 Grafana + 监控报警
zabbix
一文带你掌握 Zabbix 监控系统
Stream Collectors
Nvidia
Nvidia API
CUDA Nvidia驱动安装
NVIDIA驱动失效简单解决方案:NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.
ubuntu 20 CUDA12.1安装流程
nvidia开启持久化模式
nvidia-smi 开启持久化
Harbor
Harbor部署文档
Docker 爆出 it doesn't contain any IP SANs
pandoc
其他知识
大模型
COS 597G (Fall 2022): Understanding Large Language Models
如何优雅的使用各类LLM
ChatGLM3在线搜索功能升级
当ChatGLM3能用搜索引擎时
OCR神器,PDF、数学公式都能转
Stable Diffusion 动画animatediff-cli-prompt-travel
基于ERNIE Bot自定义虚拟数字人生成
pika负面提示词
开通GPT4的方式
GPT4网站
低价开通GPT Plus
大模型应用场景分享
AppAgent AutoGPT变体
机器学习
最大似然估计
权衡偏差(Bias)和方差(Variance)以最小化均方误差(Mean Squared Error, MSE)
伯努利分布
方差计算公式
均值的高斯分布估计
没有免费午餐定理
贝叶斯误差
非参数模型
最近邻回归
表示容量
最优容量
权重衰减
正则化项
Sora
Sora官方提示词
看完32篇论文,你大概就知道Sora如何炼成? |【经纬低调出品】
Sora论文
Sora 物理悖谬的几何解释
Sora 技术栈讨论
RAG垂直落地
DB-GPT与TeleChat-7B搭建相关RAG知识库
ChatWithRTX
ChatRTX安装教程
ChatWithRTX 踩坑记录
ChatWithRTX 使用其他量化模型
ChatWithRTX介绍
RAG 相关资料
英伟达—大模型结合 RAG 构建客服场景自动问答
又一大模型技术开源!有道自研RAG引擎QAnything正式开放下载
收藏!RAG入门参考资料开源大总结:RAG综述、介绍、比较、预处理、RAG Embedding等
RAG调研
解决现代RAG实际生产问题
解决现代 RAG 系统中的生产问题-II
Modular RAG and RAG Flow: Part Ⅰ
Modular RAG and RAG Flow: Part II
先进的Retriever技术来增强你的RAGs
高级RAG — 使用假设文档嵌入 (HyDE) 改进检索
提升 RAG:选择最佳嵌入和 Reranker 模型
LangGraph
增强型RAG:re-rank
LightRAG:使用 PyTorch 为 LLM 应用程序提供支持
RAG 101:分块策略
模型训练
GPU相关资料
[教程] conda安装简明教程(基于miniconda和Windows)
PyTorch CUDA对应版本 | PyTorch
资料
李一舟课程全集
零碎资料
苹果各服共享ID
数据中心网络技术概览
华为大模型训练学习笔记
百度AIGC工程师认证考试答案(可换取工信部证书)
百度智能云生成式AI认证工程师 考试和证书查询指南
深入理解 Megatron-LM(1)基础知识
QAnything
接入QAnything的AI问答知识库,可私有化部署的企业级WIKI知识库
wsl --update失效Error code: Wsl/UpdatePackage/0x80240438的解决办法
Docker Desktop 启动docker engine一直转圈解决方法
win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present
WSL虚拟磁盘过大,ext4迁移 Windows 中创建软链接和硬链接
WSL2切换默认的Linux子系统
Windows的WSL子系统,自动开启sshd服务
新版docker desktop设置wsl(使用windown的子系统)
WSL 开启ssh
Windows安装网易开源QAnything打造智能客服系统
芯片
国内互联网大厂自研芯片梳理
超算平台—算力供应商
Linux 磁盘扩容
Linux使用growpart工具进行磁盘热扩容(非LVM扩容方式)
关于centos7 扩容提示no tools available to resize disk with 'gpt' - o夜雨随风o - 博客园
(小插曲)neo4j配置apoc插件后检查版本发现:Unknown function ‘apoc.version‘ “EXPLAIN RETURN apoc.version()“
vfio-pci与igb_uio映射硬件资源到DPDK的流程分析
KubeVirt
vnc server配置、启动、重启与连接 - 王约翰 - 博客园
虚拟机Bug解决方案
kubevirt 如何通过CDI上传镜像文件
在 K8S 上也能跑 VM!KubeVirt 簡介與建立(部署篇) | Cloud Solutions
KubeVirt 04:容器化数据导入 – 小菜园
Python
安装 flash_attn
手把手教你在linux上安装pytorch与cuda
AI
在启智社区基于PyTorch运行国产算力卡的模型训练实验
Scaling law
免费的GPT3.5 API
AI Engineer Roadmap & Resources 🤖
模型排行
edk2
K8S删除Evicted状态的pod
docker 中启动 docker
远程本地多用户桌面1.17(一种不让电脑跟你抢键鼠的思路) - 哔哩哔哩
华为鲲鹏服务器(ARM架构)部署Prometheus
在Linux上安装配置Grafana_AI开发平台ModelArts_华为云
abrt-ccpp干崩服务器查询记录
kubevirt 中文社区
VNCServer 连接方法
Pod创建流程代码版本[kubelet篇]
[译]深入剖析 Kubernetes MutatingAdmissionWebhook-腾讯云开发者社区-腾讯云
[译]深入剖析 Kubernetes MutatingAdmissionWebhook-腾讯云开发者社区-腾讯云
深入理解 Kubernetes Admission Webhook-阳明的博客
-
+
首页
松果出行 x StarRocks:实时数仓新范式的实践之路
> 本文由 [简悦 SimpRead](http://ksria.com/simpread/) 转码, 原文地址 [www.tuicool.com](https://www.tuicool.com/articles/na6BriI) 作者:松果出行数据中台部门 松果出行成立于 2017 年,以 “构建更智慧的交通基础设施,提升全球所有人的移动能力” 为使命,定位于“以工业互联网为基础的交通科技公司”。松果出行创新打造“工业互联网在交通科技领域的典型样本”,构建由工业基础、落地产品、数字引擎和科技应用组成的完整产业生态。松果智能工厂(合肥)是全球首个电动两轮车智能自动化整装工厂,以严格的国标车型,满足政府监管需求、用户需求、业务需求和运维需求。松果电单车是国内县域层面国内较大、行业知名的经营共享电单车品牌之一,截至 2021 年 9 月,覆盖全国 24 个省份、700 多个城市,全国注册用户超 5000 万,日订单峰值达 300 万单。 作为一家面向未来的交通行业科技公司,松果出行的软硬件关键系统基本自研,以实现自主可控。 目前业务数据涵盖支付、车辆、制造、营销、订单、广告等,数据多元,维度丰富,B、C、G 等不同方向都有丰富的应用场景。 凭借 StarRocks 高效的多表关联以及实时更新能力,我们放弃了原有基于 Impala+Kudu 和 ClickHouse 的实时数仓构建模式,基于 StarRocks 实践了全新的实时数仓模式,大幅的降低了实时分析构建的复杂性。通过这个平台,我们不仅可以快速构建各种小时、分钟、秒级的看板指标以及数据服务,还能保证数据在导入准确的同时保持高性能。基于 StarRocks 在核心的订单以及车辆业务方向的成功应用,我们对其他场景的数据链路也进行了调整,整个实时链路都接入到 StarRocks。 以前我们使用了很多不同类型的查询引擎,不断做加法,大多数时候都要忙于处理各种组件的异常。在引入 StarRocks 后,我们不断做减法,成功统一查询引擎、降低维护成本、提高数据取用灵活性。如今,StarRocks 已成为我们数据中台统一分析的底座。 #01 松果出行实时 OLAP 的演进 #### — 作为对内对外的数据窗口的提供者,松果出行数据中台部门的职责是围绕数据集群、OLAP 引擎、离线 / 实时数仓、画像标签、数据治理、产品工具等,结合数据建模、人工智能、增强分析、数据可视化等技术,为业务的智能化分析决策提供支撑。 两轮电单车出行是我们的核心业务。业务链条主要包含投车、骑行、支付、换电、营销、挪车等很多环节。在这些过程中我们既需要对中间过程的变更做留存,也需要对最终的结果数据做计算。既有针对车的也有针对不同区域、订单的纬度需求,需要定时或不定时提供多维度的数据。准实时、实时的数据需求也越来越多,越来越迫切。 松果出行数据中台采用的是经典的 Lambda 架构,离线跟实时是两套单独的体系;离线以 Apache Hive(以下简称 Hive)、Apache Spark(以下简称 Spark)、Presto、MySQL 为主,做数据清洗、计算、查询、展示使用,这套架构基本能满足离线分析的需求。对于实时场景的探索,主要经历了三个阶段: 1 实时数仓 1.0 的架构 ![](/media/202207/2022-07-26_215806_9972670.5905160250104988.png) MySQL 业务库数据经 Canal 实时抽取并发送到 Apache Kafka(以下简称 Kafka),然后写入 Kudu。Apache Spark(以下简称 Spark)定时从 Kudu 读取数据并计算,通过 Apache Impala (以下简称 Impala)进行查询,提供小时级看板指标到 BI,解决了业务对于小时级数据的分析需求。另外一部分数据经 Spark 计算后写入 MySQL,用作对外的数据服务。 但随着深入使用,这套方案也存在以下痛点: * 需要单独开发维护一套 Spark 程序来读取 Apache Kudu(以下简称 Kudu)表,定时计算,维护成本高; * Kudu 表的创建、读取、修改都不是很方便,要花很多时间修改程序; * 对于一些由多个原子指标组合衍生出来的指标无法快速实现; * I mpala + Kudu 的组件维护成本高; * 无法获取每条变更日志所有变更状态的明细数据; * 针对 Kudu 跟 Impala 的监控缺失; * 大数据量的快速查询无法支撑。 2 实时数仓 2.0 的架构 为了解决以上痛点,我们又引入了实时 2.0 的架构,如下图所示: ![](/media/202207/2022-07-26_215818_0525300.851049865329154.png) 此方案数据采集阶段跟 1.0 架构相同,都是利用 Canal 组件实时抽取业务库数据日志到 Kafka,ETL 阶段用 Flink Stream+Flink SQL 消费 Kafka 做数据清洗和分层,DIM 层数据存储在 Apache HBase(以下简称 HBase)和 MySQL 中,ODS、DWD 等其他层数据放入 Kafka,最后通过 Apache Flink(以下简称 Flink)对数据进行关联、扩维、深度清洗后写入 ClickHouse 对外提供查询。 在 2.0 架构中,用 ClickHouse 替换了 Kudu + Impala,主要利用 ClickHouse 的如下功能: * 丰富多样的表引擎可以支持不同业务查询; * 利 用任意合法表达式的分区操作进行裁剪,大大提高查询效率; * 支持表级及列级过期设置,降低空间占用率; * 支持不同压缩方式,提高查询速度; * 类 SQL 语法,且支持多种不同组件,对外提供 HTTP、JDBC、ODBC 等不同链接方式,便于整合到不同工具链路当中; * 丰富的函数库,可满足不同查询需求。 这套方案提供了小时级以及更小时间粒度的看板指标需求,解决了 1.0 方案的一部分痛点,在一段时间内可以满足业务需求。但随着应用的深入,这套方案也展现出一些问题: * 更新删除能力差,去重能力差,导致数据准确性差; * 组件 维护成本高; * 表结构变更成本高; * 查询并发有限制; * 分布式表的节点横向扩展差; * 多表 Join 性能差。 3 实时数仓 3.0 的架构 为了解决以上问题,我们又引入了 StarRocks,实时架构演化了到了 3.0 方案: ![](/media/202207/2022-07-26_215831_1575060.7258606384267766.png) 数据采集到 Kafka 之后 ,先是通过 Flink Stream 进行反序列化、分流等操作,然后通过 Flink SQL 进行关联、扩维等,分为 ODS、DIM、DWD、DWS 层,其中 DIM 层存储在 MySQL 与 HBase 当中,其他层存储在 Kafka 当中,层到层之间都是通过 Flink 来实现,所有数据的最终归口在 StarRocks。 目前提供小时、分钟、秒级的看板指标及数据服务,历史数据和增量数据共同存储。3.0 方案完美解决了 1.0 跟 2.0 方案的痛点,甚至超出了我们的预期。 **#02** StarRocks 的引入 #### — 引入 StarRocks 主要是为了解决 2.0 架构面临的痛点。总结下来,我们对新的 OLAP 引擎的期望主要包括下面几点: * 不仅大宽表查询性能好,多表 Join 查询性能也非常优秀; * 支持 SQL 和类 SQL 查询,方便业务使用; * 支持批量、实时数据导入,满足历史数据和增量数据的提数需求; * 支持数据的更新、过期等,支持表结构的快速变更; * 支持大数据量的秒级查询响应; * 有较好的并发支持能力; * 可以兼容已有的数据架构,可以方便地与 HDFS、Hive、MySQL 等交互使用; * 有较强的容灾能力,运维简单,部署快速; * 可以方便地融进我们的平台工具当中。 为此我们调研了一些主流 OLAP 引擎: <table><tbody><tr><td valign="top" width="21%"><strong><p>产品</p></strong></td><td valign="top" width="47%"><strong><p>优点</p></strong></td><td valign="top" width="32%"><strong><p>缺点</p></strong></td></tr><tr><td valign="top" width="21%">ClickHouse</td><td valign="top" width="47%"><p>单表性能优秀</p><p>类 SQL 语法</p><p>多种表引擎</p><p>查询延迟低</p></td><td valign="top" width="32%"><p>数据更新支持差</p><p>Join 性能差</p><p>维护成本高</p></td></tr><tr><td valign="top" width="21%">Apache Druid</td><td valign="top" width="47%"><p>查询延迟低</p><p>支持更新</p><p>聚合数据优秀</p></td><td valign="top" width="32%"><p>明细查询支持差</p><p>查询类型单一</p><p>SQL 语法支持差</p></td></tr><tr><td valign="top" width="21%">Presto</td><td valign="top" width="47%"><p>SQL 语法灵活</p><p>对 AdHoc 效果好</p><p>支持数据源丰富</p></td><td valign="top" width="32%"><p>查询延迟高</p><p>并发能力弱</p></td></tr><tr><td valign="top" width="21%">Apache Kylin</td><td valign="top" width="47%"><p>预聚合优秀</p><p>查询延迟低</p></td><td valign="top" width="32%"><p>灵活性差</p><p>维护成本高</p></td></tr><tr><td valign="top" width="21%">StarRocks</td><td valign="top" width="47%"><p>大宽表和多表查询性能都非常优秀</p><p>类 SQL 语法</p><p>支持多种数据模型</p><p>支持较高并发</p><p>维护成本低</p><p>兼容 MySQL 协议</p></td><td valign="top" width="32%"><p>社区比较年轻</p><p>产品迭代比较快</p></td></tr></tbody></table> StarRocks 从功能层面很好地匹配了我们对实时 OLAP 引擎的需求。为了充分验证 StarRocks 的性能,我们按照下述方式搭建了测试环境进行性能测试。 在相同资源配置下,我们对 StarRocks(1.16)和 ClickHouse(20.8)进行了对比测试,分别对比测试单表及多表关联查询的性能。在单表查询中,10 亿以下的数据量,对于 “select *”、count、sum 等查询,ClickHouse 和 StarRocks 性能相近。在多表查询方面,StarRocks 完胜 ClickHouse。 在基于主键的数据更新场景中,我们希望做到尽可能高的数据准确性,但 ClickHouse 无论是使用 ReplacingMergeTree 表引擎还是数据整体更新,都无法很好支持。StarRocks 的更新模型则达到了我们的期望,通过数据导入的事务性保证了数据更新的准确性,同时能保持高性能。综合考虑下,我们最终选用 StarRocks 来作为实时 3.0 方案 的 OLAP 引擎。 如今,StarRocks 已经在松果出行广泛使用。StarRocks 也经历了多个版本的迭代,性能大幅提升。根据官方最新的基准测试,相较于之前测试的 1.16 版本,StarRocks 目前在性能方面已经接近 ClickHouse 的 2 倍,并且通过 LTS 版本的支持,也能在保持版本快速迭代的同时保障线上集群的稳定性。 #03 **StarRocks 在松果出行的应用** #### — 1 在订单业务中的应用 订单分析是我们的核心业务场景之一。引入 StarRocks 后,整个链路设计如下: ![](/media/202207/2022-07-26_215846_2301060.512700099798269.png) 历史数据用 Broker Load 从 Hive 直接导入 StarRocks。增量数据通过 Canal 抽取后再通过 Flink SQL 将订单表做字段补齐后,作为宽表直接用 Routine Load 写入 StarRocks 明细模型表,然后创建逻辑视图来满足不同维度的计算及所有状态的明细数据查询需求。在这层逻辑视图之上,通过调度平台定时对数据加工汇总后 Insert 到 StarRocks,作为数仓 ADS 层来满足不同团队的查询需求。 这套架构的好处是,我们只需用 Flink 做简单的 ETL 处理,后续业务计算在 StarRocks 进行,避免数据重复消费。这样可以快速灵活地响应不同团队不同维度的需求,而不需要在对接新的需求时,重新设计方案来对接,从而降低开发工期、灵活适用不同场景。 目前,我们基于 StarRocks 实现了秒级、小时级、天级的时间分析粒度,城市、大区、全国的区域分析粒度,提供订单量、订单总金额、超时费、里程费、客单价等维度下 30 多种不同的指标。 业务变更已完全不需要我们重新修改开发程序,数据验证也简单快速。作为数据中台部门,只需新建一个视图或者修改视图逻辑,即可快速上线,提供数据支撑。在进行数据修复、异常追溯时也链路清晰,极大地提高了开发效率。 2 在车辆方向的应用 车辆是我们的核心资产。 从车辆的投放,到挪车、换电、维修等,整个链路非常长,不同车辆的状态是我们关注的重点。 整个数据链路如下: ![](/media/202207/2022-07-26_215855_2834870.20026550660045594.png) 这条数据链路涉及 10 张多表,基本都是业务库数据。每张表要求的数据存储状态都不一样。比如实际投放车辆数,需要用到历史和实时的所有数据,中间会减去未投放的车辆数。而投放状态是时刻变化的,实际使用车辆数需要从订单表中增量获取当天被骑行的车辆数,可用车辆数则要从投放车辆数中减去那些维修、被收车、缺电等状态的车辆。这些状态的数据库表又是不同的业务团队所产生的,整合在一起非常繁琐。 如果用传统的实时数仓的模型,基于 Kafka+Flink 窗口 + 状态无法实现这一复杂逻辑。如果用 Spark+Hive 的方式,数据的及时性无法保证,线上 Apache Hadoop(以下简称 Hadoop) 集群压力会非常大,口径变更时修改也很复杂。 上述基于 StarRocks 搭建的数据链路,则解决了这些问题。对于能提前关联的数据,我们用 Flink SQL 打成大宽表入库,需要历史数据且状态时刻变化的数据全量从 Hive 导入 StarRocks,然后通过 Canal 抽取增量数据到 Kafka ,再导入 StarRocks 来更新状态。在最上层创建逻辑视图,通过调度平台定时计算输出到 ADS 层,供业务方使用。当需要口径做变更,或者查看不同维度的车辆指标时,我们只需新建一个逻辑视图即可。 如今在车辆方向的应用,我们提供小时粒度的数据、20 多种不同的指标,给业务运营提供了扎实的数据支撑。 3 StarRocks “极速统一” 落地 基于 StarRock s 在上述场景的成功应用,我们对其他场景的数据链路也进行了调整。 目前 StarRocks 在数据中台的实时链路中应用非常广泛,已经是我们的重要基础。 大部分准实时、实时需求已接入这套体系。基于 StarRocks 的任务大概有 50 多个,提供了大概 150 多个指标、2T 多的数据。后续我们会将全部实时数据接入到 StarRocks,支撑实时数据分析、数据服务、指标展示、监控告警等方面的应用。 在接触并选用 StarRocks 之前,我们早期使用了很多组件:Druid、Kylin、ElasticSearch、Kudu、ClickHouse、Impala。 这些组件的适用场景都不尽相同,语法以及能力也各有千秋。我们用 Druid 来预计算所有内部服务的埋点日志数据,但无法查看明细数据;用 Kudu 主键去重,来满足实时更新的业务数据去重需求,使用 Impala 或者 Presto 对外提供查询;用 ClickHouse 来存储实时埋点数据和业务数据,采用复杂语句来实现去重和窗口功能;用 Kylin 试点数据口径和维度相对固定的指标计算场景。 总体而言,组件比较多,使用也比较混乱,不仅数据存储分散,占用有限的机器资源,而且每个组件的语法完全不一样,学习成本高。另外,各组件都需要单独搭建性能监控报警体系,后期的升级维护困难,运维压力很大。 经过改造后,整个实时链路都接入到 StarRocks,StarRocks 成为我们大数据通用 OLAP 的重要底座。 从数据源头来看,目前有以下源头:离线的 Hive 数据,实时的 Kafka 数据,Flink-Connector 的数据,MySQL/HDFS 的数据。这些都能通过 StarRocks 原生的 Load 方式进行数据导入。 在表的设计方面: * 大 部 分表都按照时间字段进行了分区,使用常用的查询列以及关联的关键列作为分桶; * 对于明细数据,由于数据量比较大,做了数据过期的设置; * 使用 UniqueKey 的 replace_if_not_null 对部分列进行更新,后继 PrimaryKey 将支持部分列更新,我们也将进行更多实验; * 控制 Routine Load 导入频率在 10-15s,降低后台合并的频率。 在运维方面: * 针对 FE,我们配置了 VIP 代理,保证查询请求的高可用,同时也保证查询请求负载均衡,不至于单节点承受高频次请求; * 目前使用的是社区版,我们自己实现了针对 FE、BE、Routine Load 任务的监控告警; * 用 Grafana 搭建了指标监控大盘。 在性能方面: ![](/media/202207/2022-07-26_215951_1784050.8253905606640187.png) ![](/media/202207/2022-07-26_215958_4652690.6118234313261693.png) 以前我们使用了很多不同类型的查询引擎,不断做加法,大多数时候都要忙于处理各种组件的异常。现在引入 StarRocks 后,不断做减法,最终统一查询引擎、降低维护成本、提高数据取用灵活性。 4 StarRocks 与内部平台的融合 StarRocks 现在也作为一个基础数据库,融合在了松果出行的数据分析平台和数据资产平台中。 在这些平台 中,作为工具的底层基础框架,StarRocks 为业务发挥着重要的支撑作用。 当然,在使用过程中我们也发现了一些小问题: * String 类型的数据长度有限制,对于某些长度较大的字段智能过滤或者无法适用; * 物化视图不能支持复杂条件的聚合计算; * 现有日志格式对于出错的日志分析不是很友好; * 动态分区表的分区目前只支持天、周、月,不能支持年的粒度。 **#04** 总结与规划 #### — 使用 StarRocks 后,不仅我们前期的业务痛点得到了解决,实时 OLAP 分析的需求也被更好地满足。同时,将多组件收敛到 StarRocks,不仅满足了多样化的业务需求,也极大降低了使用和运维成本。 接下来我们将进一步优化 StarRocks 的使用性能和使用场景: * 更多的离线业务从 Hive/Presto 迁移过来,支撑更多的离线业务; * 进一步收敛 OLAP 引擎,将 ClickHouse 的所有任务迁移到 StarRocks; * 充分利用 StarRocks 的优越性能进行多业务的多维分析; * 优化我们的表、任务,充分利用物化视图的能力; * 完善对 StarRocks 指标的监控; * 将 StarRocks 嵌入更多的平台工具当中,使建表导数等更加智能化; * 探索实时标签在 StarRocks 中的运用。 作为 StarRocks 社区一份子,我们也将大力投入社区工作。最后非常感谢 StarRocks 社区团队的大力支持,期望 StarRocks 可以在 “极速统一” 的产品能力上持续快速进步! #### 关于 StarRocks StarRocks 创立两年多来,一直专注打造世界顶级的新一代极速全场景 MPP 数据库,帮助企业建立 “极速统一” 的数据分析新范式,助力企业全面数字化经营。 当前已经帮助腾讯、携程、顺丰、Airbnb 、滴滴、京东、众安保险等超过 110 家大型用户构建了全新的数据分析能力,生产环境中稳定运行的 StarRocks 服务器数目达数千台。 2021 年 9 月,StarRocks 源代码开放,在 Github 上的星数已超过 3000 个。StarRocks 的全球社区飞速成长,至今已有超百位贡献者,社群用户突破 5000 人,吸引几十家国内外行业头部企业参与共建。
yg9538
July 26, 2022, 10:01 p.m.
669
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档
PDF文档(打印)
分享
链接
类型
密码
更新密码