相当一部分大数据分析处理的原始数据来自关系型数据库,处理结果也存放在关系型数据库中。原因在于超过99%的软件系统采用传统的关系型数据库,大家对它们很熟悉,用起来得心应手。

在我们正式的大数据团队,数仓(数据仓库Hive+HBase)的数据收集同样来自Oracle或MySql,处理后的统计结果和明细,尽管保存在Hive中,但也会定时推送到Oracle/MySql,供前台系统读取展示,生成各种报表。

在这种场景下,数据库的读写性能就显得尤为重要!

一、数据库定位

有大神说,给我足够强的数据库硬件,一个GroupBy就可以满足各种统计分析场景。

这话不假,我们一台数百万的金融级别Oracle一体机证明了GroupBy可以做得很强大,同时也证明了它有天花板,就是当数据更大的时候,它依然得趴下!

于是,我们需要有设计原则,有优化技巧。

核心原则:数据库只是数据存储的载体,在大数据中难以利用它的计算能力!

有了这个原则,就意味着数据库将会用得“纯粹”:

  • 数据表独立性很强,大表间很少join(这让我想起有同学在Hive里对两张大表做笛卡尔乘积产生270T数据)
  • 数据表很大,单表几十亿行很常见
  • 索引很少,一般按主键查单行或者按时间查一段

二、分区存储

在这里,数据库就是存储数据的仓库,海量数据需要拆分存储,不可能全都挤一块。

根据业务不同,一般有两种拆分方式:

  1. 单表分区。常见于Oracle,每月做一个分区,数据连续方便业务处理,但要求单机性能强劲。
  2. 分表分库。常见于MySql,分个128张表乃至4096张表也都是很平常的事情,可以用很多性能较差的机器组建集群,但因数据不连续不便于业务处理。

具体采用哪一种拆分方式,由使用场景决定。

如果以后还要整体抽出来去做统计分析,比如原始数据和中间数据,那么优先考虑做分区。既方便连续抽取,又方便按月删除历史数据,对海量数据Delete很痛苦。分区内还可以建立子分区和分区内索引。

如果用于业务数据或者最终统计结果,那么考虑分库后分表,按照业务维度把数据“均匀”存在不同表上。比如对单号取CRC,然后对数据表数取模。

有很多数据,属于时序数据性质,或者日志型,都是只有插入,只有少量或者完全没有Update,几乎没有Delete。

这种数据有个很关键的时间字段,确定数据什么时候到来,比如InputDate/CreateTime/UpdateTime,可以借助触发器给这个字段填充当前时间。

基于时间维度抽取时序数据进行分析时,必须确保时间字段升序能够查到所有数据,不会漏过也不会重复查某些行。

三、高效查询

海量数据查询,必须100%确定命中索引。要么是code=xxx,要么是 updatetime>=:start and updatetime<:end。

根据主键查询,命中单行或少量数据;

根据时间查询,必须合理选择时间区间(start, end),让查询结果控制在10000~20000行左右较好。

比如考虑到高峰时段,我们一般取5秒的区间进行查询,一般得到10000~40000行。

使用数据时,可能有很多查询条件,但其中最重要的一般是时间区间。

因为数据很大,DBMS本身的统计信息收集工作可能很不及时,导致执行计划选择错误的索引方案,这种情况下需要手工收集信息,甚至在查询语句里面强制指定索引。

四、批量写入

借助内存计算,我们往往可以在很短的时间内计算得到数十万乃至数百万数据,需要写入数据库。

一般数据库的Insert/Update性能只有3000~5000tps,带着索引的负担,难以快速把数据写入其中。

这里以Oracle为例,它的OracleCommand有一个超强功能ArrayBindCount,可以对一次参数化写入操作绑定多组(例如5000组/行)。

该方法能够让它得到最高写入性能,实际业务使用得到30000tps左右。

var count = 1_000_000;
var connectStr = "User Id=scott;Password=tiger;Data Source=";var conn = new OracleConnection(connectStr);
var command = new OracleCommand
{Connection = conn,ArrayBindCount = count,CommandText = "insert into dept values(:deptno, :deptname, :loc)"
};
conn.Open();var deptNo = new Int32[count];
var dname = new String[count];
var loc = new String[count];var deptNoParam = new OracleParameter("deptno", OracleDbType.Int32)
{Direction = ParameterDirection.Input,Value = deptNo
};
command.Parameters.Add(deptNoParam);var deptNameParam = new OracleParameter("deptname", OracleDbType.Varchar2)
{Direction = ParameterDirection.Input,Value = dname
};
command.Parameters.Add(deptNameParam);var deptLocParam = new OracleParameter("loc", OracleDbType.Varchar2)
{Direction = ParameterDirection.Input,Value = loc
};
command.Parameters.Add(deptLocParam);var sw = Stopwatch.StartNew();
for (var i = 0; i < count; i++)
{deptNo[i] = i;dname[i] = i.ToString();loc[i] = i.ToString();
}command.ExecuteNonQuery();sw.Stop();Debug.WriteLine("批量插入:" + count + "所占时间:" + sw.ElapsedMilliseconds);

MySql和SQLite都有它独特的批量写入功能,并且支持netcore。

SqlServer也有批量写入功能,但是目前还不支持netcore。

MySql方案另起一篇文章专门写。

五、总结

关系型数据库存储大数据,要点就是:简单存储、分区分表、高效索引、批量写入!

100亿小数据实时计算平台(大数据系列目录):

1,大数据分析中使用关系型数据库的关键点

2,MySql如何做到600000tps的极速批量写入

3,大数据分析中Redis经验分享

4,如何分批处理大数据(调度系统)

新生命Redis组件(日均80亿次调用)

借助Redis做秒杀和限流的思考

大数据分析中Redis怎么做到220万ops

每天4亿行SQLite订单大数据测试(源码)

End.

大数据分析中使用关系型数据库的关键点相关推荐

  1. SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理

    在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...

  2. python在大数据分析中的应用

    每个人都喜欢Python,如果您打算开始从事数据科学事业,我们可以肯定Python在您心中已经占有特殊的位置.它直观且易于在任何平台上运行,并且具有大量令人惊叹的库和工具.与其他编程语言相比,Pyth ...

  3. 云计算已在大数据分析中发挥重要作用

    大数据并不是实时vs.批处理的问题.正如Ovum的分析师Tony Baer和其他一些分析师所指出的那样,这不是一个非此即彼的问题.鉴于现如今的企业用户在制定一套成功的大数据战略方面有着广泛的选择和大量 ...

  4. 试述hadoop生态系统以及每个部分的具体功能_Hadoop在大数据分析中的意义和作用...

    什么是Hadoop? Apache Hadoop是一个开放源代码软件框架,用于开发在分布式计算环境中执行的数据处理应用程序. 使用HADOOP构建的应用程序可在分布在商用计算机群集上的大型数据集上运行 ...

  5. R语言和Hadoop系统架构在大数据分析中的应用

    也许正在喝着咖啡的你,看着阳光从玻璃窗蹦进来,回忆近日的美好,惬意的享受这个"温暖"的暑假.而SupStat已经为你准备了一份暑期数据盛宴. R是什么?               ...

  6. pcy 算法_大数据分析中的PCY算法

    pcy 算法 PCY algorithm was developed by three Chinese scientists Park, Chen, and Yu. This is an algori ...

  7. MySQL中操作关系型数据库 SQL

    数据库(database) 常见的数据库: 关系型数据库: SQL server 微软 Oracle oracle (甲骨文) MySQL oracle DB2 IBM SQLIte 安卓 NoSQL ...

  8. 大数据时代-使用关系型数据库的价值意义?

    不知道大家有没有这种经历:一个系统刚上线的时候是有完整的架构逻辑的,数据库表的设计也是经过精细推敲,以为可以经得起时间的考验.结果呢?上线之后各种新业务支持.新需求支持.不得不在原有的数据表中添加字段 ...

  9. 电子商务大数据分析中数据分析的重要性

    对于电子商务行业来说,数据分析在企业内部非常重要,营销管理.客户管理等环节都需要应用到数据分析的结果,利用数据分来来发现企业内部的不足,营销手段的不足.客户体验的不足等等,利用数据挖掘来了解客户的内在 ...

最新文章

  1. Linux进程间通信三 System V 信号量简介与示例
  2. CountDownLatch应用及原理
  3. js动态添加meta标签
  4. 因设备需求超供应预期 摩托罗拉折叠机Razr推迟在美上市时间
  5. 配置tomcat tomcat与nginx的整合
  6. 单例模式及多线程安全(C++版)
  7. Linux 用户及权限详解
  8. SEO如何辨别真假Baiduspider
  9. 硅谷新传奇Kevin Systrom
  10. 【Chrome】如何对Chrome浏览器内容进行长截图
  11. 怎么打小广告html,【制作】7个技巧教你如何完成一条低成本广告制作
  12. mac分区合并APFS容器
  13. DZY Loves Sequences (dp)
  14. kubectl查看node状态_【大强哥-k8s从入门到放弃03】查看K8S集群基本信息
  15. 做RAID和不做RAID的区别
  16. multiwii 2.4配置中文注释
  17. [OHIF-Viewers]医疗数字阅片-医学影像-ES6箭头函数(=)
  18. Python PaddleNLP实现自动生成虎年藏头诗
  19. qlib的工作流管理:mlflow机器学习生命周期管理平台
  20. 办公技巧:如何快速提取办公文档里面的所有图片

热门文章

  1. Python超过R,成为数据科学和机器学习的首选语言!
  2. 资源 | 盘点国外NLP领域40大高校及相关知名学者
  3. Java学生宿舍管理系统,即将毕业的兄弟有福了!
  4. 工作几年了,API 网关还不懂?
  5. 使用容器的正确方式,Docker在雪球的技术实践
  6. 分布式定时任务xxl-job的常用姿势都集齐了,So Easy!
  7. DCIC共享单车数据可视化教程!
  8. 如何配置一台深度学习工作站?
  9. 字节跳动大佬的Python自学笔记.pdf
  10. 4岁学编程,19岁创办以太坊,4年十亿身家!