打字猴:1.700509313e+09
1700509313 数据科学家养成手册 [:1700503623]
1700509314 数据科学家养成手册 13.3 文件还是数据库
1700509315
1700509316 在13.2节我们已经讨论过,如果数据库中的数据是供使用者频繁查找的,尤其是扫描所获取的内容在被扫描的数据量中占比很低的情况下,通常不推荐写入程序直接写文件,并把该文件作为查找介质直接使用。在这种场景中,首选肯定是数据库,其数学方面的原理会在13.5.2节讨论。
1700509317
1700509318 数据库作为专业的数据存储和查找引擎,已经有超过30年的历史了,而且其功能越来越强大。以甲骨文著名的数据库产品Oracle为例,其数据库引擎Oracle Database从8i、9i、10g、11g到12c,一路升级,辅助性组件也在不断丰富。与Oracle Database结合最为紧密的有Dataguard和Golden Gate等补充型产品组件。Dataguard提供Oracle Database高可用解决方案,Golden Gate则用来做数据同步。
1700509319
1700509320 数据库作为数据存储的载体,其选型也是有一些讲究的。
1700509321
1700509322 从数据的组织形式来说,目前有两大类,一类是RDBMS(关系型数据库管理系统,Relational Database Management System),另一类是NoSQL(2)。
1700509323
1700509324 RDBMS通常用数据库、表、字段3层对数据进行描述。这种结构应用非常广泛,历史悠久,普及性极高。在这类数据库中,一个数据库(Database)下可以建立若干个表(Table),一个表中可以建立若干个字段(Field)。在一个表的内部,每一行数据都必须具有相同的字段描述。
1700509325
1700509326 NoSQL通常是用数据库、表、键值对3层对数据进行描述。一个数据库下可以建立若干个表。NoSQL和RDBMS的区别在于,NoSQL表内部不设置字段,表内部的每一行数据都用Key-Value键值对来描述,也就是说,每一行的字段都可以不同。
1700509327
1700509328 乍一看这只是形式上不同,其功能都是存储数据,但是它们的使用场景有着比较大的区别。RDBMS注重关系,并且在查找引擎上注重对多表联查(3)的支持和优化,适合做复杂的多维数据分析。而NoSQL表天生就是一种稀疏矩阵的数据逻辑架构,适用于那种在大量不规则的数据结构中查找一条数据的场景,例如博客系统等。由于多表查询很不方便,所以在供分析的数据存储场景中,通常不推荐使用NoSQL类型的数据库。
1700509329
1700509330 在数据量非常大且预算有限的情况下,还是推荐使用开源的Hive、SparkSQL或者PrestoDB on HDFS。这类数据仓库对海量数据的支持特性非常优秀,而且有丰富的文档可以参考。
1700509331
1700509332
1700509333
1700509334
1700509335 数据科学家养成手册 [:1700503624]
1700509336 数据科学家养成手册 13.4 要不要支持事务
1700509337
1700509338 对于在线数据库OLTP来说,事务通常是比较重要的。事务是指那种一次涉及多个表、多条数据的写操作(4),要求是要么都生效,要么都不生效。
1700509339
1700509340 事务在对业务提供线上支持的数据库中是非常重要的,尤其是对涉及支付的系统,更是必需的。不过,我们所说的日志分析场景中的数据不一定是必需的,而且在我的工作经验中,没有事务的情况似乎更好、更自由。
1700509341
1700509342 在数据分析场景中,通常会使用OLAP数据仓库。常见的OLAP数据仓库有Oracle、DB2、Teradata、Greenplum等。这些数据仓库的特点是吞吐量比较大,尤其是对多表联查的效率支持很高,而其缺点也非常明显,例如对一次涉及几条数据的小事务来说性能支持非常不好。
1700509343
1700509344 如果觉得上述这些数据仓库价格高昂,还有Hive、SparkSQL、PrestoDB on HDFS可以选择。这些分布式数据仓库通常有更高的单次访问延迟,不过这种代价对于OLAP的场景来说无足轻重,关键是获得了极高的可扩展性和大规模数据的读写性能。这个性能的提升主要通过“读写分散”获得,下面我们就以Hive为范例进行讲解。
1700509345
1700509346 Hive在底层是基于HDFS和MapReduce的,写入集群时遵循HDFS的写入原则。只要向Hive的数据仓库里写数据,就必须使用诸如
1700509347
1700509348 LOAD DATA LOCAL INPATH ‘/Linklog_20161122.txt’ OVERWRITE INTO TABLE Linklog PARTITION(dt=‘20161122’);
1700509349
1700509350 这种语句。
1700509351
1700509352 以上语句实际上就是把本地文件“/Linklog_20161122.txt”复制到集群hdfs:///user/hive/ warehouse中去。这里为什么不使用事务呢?因为在OLAP环境中,数据一般都是已经存在的历史数据,几乎没有回退的机会。如果一定要使用事务,就必须有与Oracle结构相同的更新逻辑。
1700509353
1700509354 以更新一个数据块D为例,如图13-6所示。
1700509355
1700509356
1700509357
1700509358
1700509359 图13-6 事务中的Undo和Redo
1700509360
1700509361 (1)要更新数据块D的时候,为了保证事务隔离,首先必须保证其他事务能访问提交前的数据块D,此时会生成一个Undo块信息U来记录数据块D更新前的信息。
1700509362
[ 上一页 ]  [ :1.700509313e+09 ]  [ 下一页 ]