打字猴:1.700509221e+09
1700509221 数据科学家养成手册 [:1700503617]
1700509222 13.1.1 读多写少
1700509223
1700509224 “读多写少”是一种在互联网领域很常见的读写模型(如图13-1所示)。在微博、新闻等网站都会有这样的模式:一个进程向磁盘上的某个地方写了一段数据,无论数据载体是数据库还是文件,此后高频次的访问都会扫描磁盘的这块地方。
1700509225
1700509226
1700509227
1700509228
1700509229 图13-1 读多写少
1700509230
1700509231 这种情况下,通常考虑直接把读I/O的部分分摊到多个读I/O单元中去。例如,MySQL的读写分离就是一种典型的应对“读多写少”的方式,先在主库中写一份数据,再同步到N个从库。这样,再从从库中读取数据时,吞吐能力就变成了原来的N倍。这种方式在其他类似的场景中同样适用。
1700509232
1700509233 数据科学家养成手册 [:1700503618]
1700509234 13.1.2 读少写多
1700509235
1700509236 “读少写多”是一种在数据收集过程中比较容易见到的场景(如图13-2所示)。
1700509237
1700509238
1700509239
1700509240
1700509241 图13-2 读少写多
1700509242
1700509243 当多个数据点向一个数据载体写入数据时,伴随着相对较少的数据读取。对于较高的写并发,同样建议把写并发的I/O分散到不同的主机或者磁盘上,这种情况下使用Hadoop或者Ceph一类的集群均可。在Hadoop集群中,同样建议将较小的数据积累成较大的数据块(例如数百MB的数据块)再写入,这样做效率比较高。因为每次写操作都要对NameNode这个热节点进行访问,所以还是要尽可能减少这种访问带来的单点压力。
1700509244
1700509245 数据科学家养成手册 [:1700503619]
1700509246 13.1.3 读写都多
1700509247
1700509248 对于“读写都多”的场景,除了在单台计算机上使用诸如RAID10这样的技术进行数据条带化(Striping)以外,还可以利用集群读写分散的特性,或者使集群中各台主机的读写时间错峰的特性(如图13-3所示)。
1700509249
1700509250
1700509251
1700509252
1700509253 图13-3 读写都多
1700509254
1700509255 在这类场景中,使用Hadoop(HDFS)或者Ceph一类的集群存储系统当然可以,但一定要尽量避免将读写操作都放在某一台或几台计算机上,进而导致性能歪斜。我的建议是先看读出的特性。以Hadoop集群为例,如果读出时每次都扫描时间最晚的写入数据块,就有可能与写入进程同时访问相应的主机。这种情况下,建议使用与时间无关的哈希方法来写入不同的文件,从而保证将数据写入不同的DataNode节点。如果读出是半随机方式的,没有明显的时间偏好,写入时就可以不用太在意这一点,只要按时间顺序将一个文件写入Hadoop集群就可以了。
1700509256
1700509257 解决I/O征用的方法其实比较少,主要就是靠征用资源的时间和空间的分散化,这是最为根本的思路。
1700509258
1700509259
1700509260
1700509261
1700509262 数据科学家养成手册 [:1700503620]
1700509263 数据科学家养成手册 13.2 进快还是出快
1700509264
1700509265 在第11章中我们学习了很多关于排序和检索的算法,其中有一个体会:由于数据的产生大部分是随机的,所以,如果想在某一次检索中很快地检索出一个数据,那么在检索之前准备工作的成本就比较高;相反,如果不想花费这个准备成本,就要忍受在检索时所花费的成本。这就是一对矛盾。
1700509266
1700509267 我们先来说说追求写入速度的情况。
1700509268
1700509269 数据科学家养成手册 [:1700503621]
1700509270 13.2.1 最快写入
[ 上一页 ]  [ :1.700509221e+09 ]  [ 下一页 ]