打字猴:1.700509233e+09
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 最快写入
1700509271
1700509272 在选定一块SSD或者机械硬盘的时候,I/O峰值是有限定的。所以,这时写入的最高速度也不可能逾越硬盘自身的写入峰值。以我使用的测试机的硬盘为例,可以用“dd”命令进行写入操作,以测试连续写入速度。
1700509273
1700509274 root@henry-B85-HD3-A:/tmp# time dd if=/dev/zero of=/tmp/writetest bs=100M count=1010+0 records in10+0 records out1048576000 bytes(1.0 GB)copied, 0.689278 s, 1.5 GB/s    real 0m0.690suser 0m0.000ssys 0m0.484s
1700509275
1700509276 通常第一次测试的速度都不太“稳定”,会显得写入速度非常快。例如,在以上测试中我们可以看到,写入速度大约为1.5GB/s,但实际上不可能达到这个速度,因为大部分数据都写到了缓冲区中。这种情况下,逐步提高写入的数据量就可以测出磁盘真实的写入速度了。
1700509277
1700509278 root@henry-B85-HD3-A:/tmp# time dd if=/dev/zero of=/tmp/writetest bs=100M count=2020+0 records in20+0 records out2097152000 bytes(2.1 GB)copied, 11.3685 s, 184 MB/s    real 0m11.476suser 0m0.000ssys 0m1.240sroot@henry-B85-HD3-A:/tmp# time dd if=/dev/zero of=/tmp/writetest bs=100M count=3030+0 records in30+0 records out3145728000 bytes(3.1 GB)copied, 16.4094 s, 192 MB/s    real 0m16.595suser 0m0.000ssys 0m1.884sroot@henry-B85-HD3-A:/tmp# time dd if=/dev/zero of=/tmp/writetest bs=100M count=4040+0 records in40+0 records out4194304000 bytes(4.2 GB)copied, 21.6509 s, 194 MB/s    real 0m21.906suser 0m0.000ssys 0m2.552sroot@henry-B85-HD3-A:/tmp# time dd if=/dev/zero of=/tmp/writetest bs=100M count=5050+0 records in50+0 records out5242880000 bytes(5.2 GB)copied, 27.1801 s, 193 MB/s    real 0m27.637suser 0m0.000ssys 0m3.360s
1700509279
1700509280 这个稳定在190MB/s的写入速度就是当前这块SSD磁盘的写入峰值速度。
1700509281
1700509282 机械硬盘(如图13-4所示)的测试方法与此类似。在盘片高速旋转的过程中,机械硬盘的磁头根据CPU传来的指令滑动,同时进行读写操作。对于机械硬盘,写入速度最快的方式就是在当前文件的尾部追加数据,这属于连续写入。因为所有的数据在磁盘上是连续的,也就意味着可以在高速旋转中不间断地写入数据,没有过多的寻址开销,所以对硬盘来说这种写入方式效率最高。如果这些数据是按照时间顺序直接来源于外界报送的话,这就是一种按照时间顺序连续写入的场景。
[ 上一页 ]  [ :1.700509233e+09 ]  [ 下一页 ]