前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MPP数据库对比及选择

MPP数据库对比及选择

作者头像
码客说
发布2023-08-13 11:05:48
1.3K0
发布2023-08-13 11:05:48
举报
文章被收录于专栏:码客码客

概念

MPP

MPP (Massively Parallel Processing),即大规模并行处理。

简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。

什么是MPP数据库?

MPP数据库是一款 Shared Nothing架构的分布式并行结构化数据库集群,具备高性能、高可用、高扩展特性,可以为超大规模数据管理提供高性价比的通用计算平台,并广泛地用于支撑各类数据仓库系统、BI 系统和决策支持系统

OLAP 数据分析的目标则是探索并挖掘数据价值,作为企业高层进行决策的参考,通常被称为OLAP(On-Line Analytical Processing,联机分析处理)。

业务数据积累时所产生的价值信息则被OLAP不断呈现,企业高层通过参考这些信息会不断调整经营方针,也会促进基础业务的不断优化。

OLAP不应该对OLTP产生任何影响,(理想情况下)OLTP应该完全感觉不到OLAP的存在。

OLTP 业务类系统主要供基层人员使用,进行一线业务操作,通常被称为OLTP(On-Line Transaction Processing,联机事务处理)。

从功能角度来看,OLTP负责基本业务的正常运转。

使用场景

总体来说MPP数据库更适合数据规模较大的关系型数据的处理。

特征

传统数据库

MPPDB

Hadoop/Hive

扩展能力

低★

中★★

高★★★

系统和数据管理成本

中★★

中★★

高★

应用开发维护成本

中★★

中★★

高★

SQL支持

高★★★

高★★★

中★★

数据规模

TB级别★

准PB级别(10PB以下)★★

PB级别★★★

计算性能

对关系型操作效率中★★

对关系型操作效率高★★★

对非关系型操作效率高★

数据结构

结构化数据

结构化数据

结构化、半结构化和非机构化数据

常见的MPP数据库

我这里选用的基本上都是兼容MySQL的MPP数据库。

Doris、Clickhouse、Tidb三者对比

类别

Doris

Clickhouse

TIDB

Share-Nothing

列存

架构

内置分布式协议进行元数据同步Master/Follower/Observer节点类型

依赖ZooKeeper进行DDL和Replica同步

Master/Slave

事务性

事务保证数据ACID

100万以内原子性,DDL无事务保证

事务保证数据ACID

数据规模

单集群< 10PB

单集群< 10PB

单集群< 10PB

Kafka导入

内置支持

内置支持

内置支持

MySQL协议兼容

兼容

部分兼容

高度兼容 MySQL 5.7 协议

相关文档

Doris

https://doris.apache.org/zh-CN/docs/dev/get-starting/what-is-apache-doris

TIDB

https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb

客户端

所有支持Mysql的客户端都可以使用。

但是不要在这些客户端上使用图形化界面创建表,部分语法是不一样的。

Doris

个人更推荐Doris

聚合表

创建表

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS zdb.t_user01
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `date` DATE NOT NULL COMMENT "数据灌入日期时间",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
    `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
    `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

表中的列按照是否设置了 AggregationType,分为 Key (维度列) 和 Value(指标列)。

没有设置 AggregationType 的,如 user_iddateage … 等称为 Key,而设置了 AggregationType 的称为 Value

目前支持的聚合函数有SUM, MIN, MAX, REPLACE。

插入数据

代码语言:javascript
复制
insert into zdb.t_user01 values
(10000,"2017-10-01","北京",20,0,"2017-10-01 06:00:00",20,10,10),
(10000,"2017-10-01","北京",20,0,"2017-10-01 07:00:00",15,2,2),
(10001,"2017-10-01","北京",30,1,"2017-10-01 17:05:45",2,22,22),
(10002,"2017-10-02","上海",20,1,"2017-10-02 12:59:12",200,5,5),
(10003,"2017-10-02","广州",32,0,"2017-10-02 11:20:00",30,11,11),
(10004,"2017-10-01","深圳",35,0,"2017-10-01 10:00:15",100,3,3),
(10004,"2017-10-03","深圳",35,0,"2017-10-03 10:20:22",11,6,6);

查看表信息

代码语言:javascript
复制
desc zdb.t_user01;

非聚合表

这是一个典型的用户基础信息表。这类数据没有聚合需求,只需保证主键唯一性。(这里的主键为 user_id + username)。

那么我们的建表语句如下:

代码语言:javascript
复制
CREATE TABLE IF NOT EXISTS zdb.t_user02
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
    `city` VARCHAR(20) COMMENT "用户所在城市",
    `age` SMALLINT COMMENT "用户年龄",
    `sex` TINYINT COMMENT "用户性别",
    `phone` LARGEINT COMMENT "用户电话",
    `address` VARCHAR(500) COMMENT "用户地址",
    `register_time` DATETIME COMMENT "用户注册时间"
)
UNIQUE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);

JDBC同步数据

注意以下几点:

JDBC 连接串需添加 rewriteBatchedStatements=true 参数,并使用 PreparedStatement 方式。

目前 Doris 暂不支持服务器端的 PrepareStatemnt,所以 JDBC Driver 会在客户端进行批量 Prepare。

rewriteBatchedStatements=true 会确保 Driver 执行批处理。并最终形成如下形式的 INSERT 语句发往 Doris:

代码语言:javascript
复制
INSERT INTO example_tbl VALUES
(1000, "baidu1", 3.25)
(2000, "baidu2", 4.25)
(3000, "baidu3", 5.25);
  1. 批次大小 因为是在客户端进行批量处理,所以一批次过大的话,会占用客户端的内存资源,需关注。 Doris 后续会支持服务端的 PrepareStatemnt,敬请期待。
  2. 导入原子性 和其他到导入方式一样,INSERT 操作本身也支持原子性。每一个 INSERT 操作都是一个导入事务,能够保证一个 INSERT 中的所有数据原子性的写入。 前面提到,我们建议在使用 INSERT 导入数据时,采用 ”批“ 的方式进行导入,而不是单条插入。
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概念
  • 使用场景
  • 常见的MPP数据库
  • 相关文档
  • 客户端
  • Doris
    • 聚合表
      • 非聚合表
        • JDBC同步数据
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档