(2)内存处理优点:去除硬盘读写开销,提高处理速度。 (3)关系型内存数据库: Memory-resident:可能在buffer pool中。 MMDB:可能彻底不用buffer pool,改变了系统内部设计。 2、关键技术 Sorting优化:使用quick sort而不是replacement selection Hash join优化 B+ trees Vectorization;处理器加速;压缩 3、MonetDB SQL -> MAL -> BAT;内存列式存储,数据在类似数组的结构中。 4、在商用数据库中的实现 SAP HANA:所有数据存为列,变长数据存在dictionary,列中存dictionary的位置;Main data为了读,过段时间更新,Delta data为了写;热点数据放在内存里;目标:OLTP和OLAP放在一个系统。
二、内存键值系统 1、Memcached 单机的内存的key-value syore;数据在内存中以hash table的形式存储;支持最基础的<key, value>数据模型;通常被用于前端的cache;可以使用多个memcached+sharding建立一个分布式系统。 2、Redis 提供更加丰富的类型;key可以包含hashes,lists,sets和sorted sets;支持副本和集群。 3、Memcached内部结构
(1)单机系统 (2)实现自定义的协议,支持Get/Put等请求和响应。<文本方式的协议,二进制协议> (3)采用多个链表管理内存。采用多个链表,每个链表内存块大小相同。 (4)key-value采用一个全局的Hash Table进行索引。 (5)多线程并发互斥访问。
三、内存MapReduce Spark:面向大数据分析的内存系统 1、原理 可以从HDFS中读数据,但是运算中数据存放在内存中,不使用Hadoop,而是新实现了分布式的处理。 目标是低延迟的分析操作。
2、运算和数据的表达 目标:高效、容错 RDD(resilient distributed data sets):一个数据集;只读,整个数据集创建后不能修改;通常进行整个数据集的计算。 优点:并发控制被简化了;可以记录lineage(数据集上的运算序列),可以重新计算。并不需要把RDD存储在stable storage 上。 3、RDD运算 (1)Transformation:RDD->RDD (2)Action:RDD->计算结果 4、编程 Spark支持的语言:Scala,Java,Python 流程:建立SparkContext -> 读文本文件生成一个RDD -> 进行RDD操作 (1)Java RDD的类型
- Class JavaRDD<T>:元素类型为T的RDD
- Class JavaPairRDD<K,V>:元素包含一个K和一个V
- Class JavaSparkContext中函数
- JavaSparkContext.textFile(path):从文本文件读入,每一行是一个元素,元素类型为String;返回JavaRDD<String>。
- JavaSparkContext.wholeTextFiles(path):读一个目录,每个文件称为一个元素;key是文件路径,value是文件内容。返回JavaRDD<String,String>
5、实现 (1)运算过程 读入内存一次,在内存中可以多次处理。 (2)系统结构
每个应用程序包含: 一个SparkContext(driver主程序创建,协调多个worker运行,发出RDD操作要求),多个Executor(在不同worker node上,执行并行运算,存储数据)(多个应用程序的SparkContext隔离,无法共享数据,必须通过外部的文件系统进行数据共享)。(3)Spark中RDD存储方式内存缓存、内存Serialized(顺序化)、多个内存副本、硬盘保存、多种组合(4)Spark运算的运行Transformation(仅记录不运算,lazy);Action(遇到Action时才执行之前记录的运算)。容错/内存缓冲替换:当内存缓冲的RDD丢失时,可重新执行记录的运算,重新计算该RDD。