大数据-面经附个人理解(HBase、MongoDB、Redis)(2)

在这里插入图片描述

HBase
  0.定义:
    HBase存储容量大,一个表可以容纳上亿行、上百万列,可应对超大数据量要求
    扩展简单的需求。 Hadoop的无缝集成,让HBase的数据可靠性和海量数据分析
    性能(MapReduce)值得期待。
  
  1.用途
    1.特别适用于简单数据写入(如“消息类”应用)和海量、结构简单数据的查询
     (如“详单类”应用)。特别地,适合稀疏表。(与网页内容很匹配)
    2.作为MapReduce的后台数据源,以支撑离线分析型应用。
  
  2.数据格式:
    1.HBase 允许表下某行某列值为空时不做任何存储(也不占位),
      减少了空间占用也提高了读性能。
  
  3.特点:
    1.可以通过Java API来访问数据,也可以通过REST、Avro或者Thrift的API来访问。
  
  4.性能:
    1.HStore存储是HBase存储的核心,它由两部分组成,
      一部分是MemStore,一部分是StoreFiles。
    2.MemStore 是 Sorted Memory Buffer,用户写入的数据首先会放入MemStore,
      当MemStore满了以后会Flush成一个StoreFile(底层实现是HFile),
      当StoreFile文件数量增长到一定阈值,会触发Compact合并操作,
      将多个StoreFiles合并成一个StoreFile,合并过程中会进行版本合并和数据删除,
      因此可以看出HBase其实只有增加数据,所有的更新和删除操作都是在后续的
      compact过程中进行的,这使得用户的写操作只要进入内存中就可以立即返回,
      保证了HBase I/O的高性能。
 
  5.优点:
    1. 存储容量大,一个表可以容纳上亿行,上百万列;
    2. 可通过版本进行检索,能搜到所需的历史版本数据;
    3. 负载高时,可通过简单的添加机器来实现水平切分扩展,跟Hadoop的无缝集成保障
       了其数据可靠性(HDFS)和海量数据分析的高性能(MapReduce)
    4. 在第3点的基础上可有效避免单点故障的发生。

  6.缺点:
  1. 基于Java语言实现及Hadoop架构意味着其API更适用于Java项目;
  2. node开发环境下所需依赖项较多、配置麻烦(或不知如何配置,如持久化配置),缺乏文档;
  3. 占用内存很大,且鉴于建立在为批量分析而优化的HDFS上,导致读取性能不高;
  4. API相比其它 NoSql 的相对笨拙。

在这里插入图片描述

MongoDB:
  0.定义:
    MongoDB是高性能、无模式的文档型数据库,支持二级索引,非常适合文档化格
    式的存储及查询。MongoDB的官方定位是通用数据库,确实和MySQL有些像,现
    在也很流行,但它还是有事务、join等短板,在事务、复杂查询应用下无法取代
    关系型数据库。
  
  1.特点:
    1.是一个介于关系型和非关系型之间的一个产品吧,类SQL语言,支持索引
    2.MongoDb在类SQL语句操作方面目前比HBase具备更多一些优势,有二级索引,
      支持相比于HBase更复杂的集合查找等。
    3.BSON的数据结构使得处理文档型数据更为直接。支持复杂的数据结构
    4.MongoDb也支持mapreduce,但由于HBase跟Hadoop的结合更为紧密,
      Mongo在数据分片等mapreduce必须的属性上不如HBase这么直接,需要额外处理。

  2.数据格式:
    1.文档是对数据的抽象,它的表现形式就是我们常说的 BSON(Binary JSON )。
    
    2.BSON 是一个轻量级的二进制数据格式。
      MongoDB 能够使用 BSON,并将 BSON 作为数据的存储存放在磁盘中。
      BSON 是为效率而设计的,它只需要使用很少的空间,同时其编码和解码都是非常快速的。
      即使在最坏的情况下,BSON格式也比JSON格式再最好的情况下存储效率高。
      
    3.对于前端开发者来说,一个“文档”就相当于一个对象:
      {“name":"mengxiangyue","sex":"nan"}
    4.对于文档是有一些限制的:有序、区分大小写的。
    5.多个文档则组合为一个“集合”。可不同格式:
      {"name":"mengxiangyue"}  
	  {"Name":"mengxiangyue","sex":"nan"}

  3.性能:
    1.MongoDB 目前支持的存储引擎为内存映射引擎。
      当 MongoDB 启动的时候,会将所有的数据文件映射到内存中,
      然后操作系统会托管所有的磁盘操作。

	2. MongoDB 中关于内存管理的代码非常精简,毕竟相关的工作已经有操作系统进行托管。
	3. MongoDB 服务器使用的虚拟内存将非常巨大,并将超过整个数据文件的大小。
	   不用担心,操作系统会去处理这一切。不用担心,操作系统会去处理这一切。

    4.MongoDB 提供了全索引支持:包括文档内嵌对象及数组。
      Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
      通常能够极大的提高查询的效率。

  
  4.优点:
	1. 强大的自动化 shading 功能(将数据水平切分到不同物理节点)
	2. 全索引支持,查询非常高效;
	3. 面向文档(BSON)存储,数据模式简单而强大。
	4. 支持动态查询,查询指令也使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
	5. 支持 javascript 表达式查询,可在服务器端执行任意的 javascript函数。
	
  5.缺点:
	1. 单个文档大小限制为16M,32位系统上,不支持大于2.5G的数据;
	2. 对内存要求比较大,至少要保证热数据(索引,数据及系统其它开销)都能装进内存;
	3. 非事务机制,无法保证事件的原子性。 
	
  6.适用场景:
    1. 适用于实时的插入、更新与查询的需求,并具备应用程序实时数据存储所需的复制及高度伸缩性;
	2. 非常适合文档化格式的存储及查询;
	3. 高伸缩性的场景:MongoDB 非常适合由数十或者数百台服务器组成的数据库。
	4. 对性能的关注超过对功能的要求。
Redis:
  0.定义:
    Redis是内存型Key/Value系统,读写性能非常好,支持操作原子性,
    很适合用来做高速缓存。
    
  1.特点:
    1.Redis为内存型KV系统,处理的数据量要小于HBase与MongoDB
    2.Redis很适合用来做缓存,但除此之外,它实际上还可以在一些“读写分离”的场景下
      作为“读库”来用,特别是用来存放Hadoop或Spark的分析结果。

  2.数据格式:
    1.String
      1.string 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,
        一个key对应一个value。
      2.string 类型是二进制安全的。意思是 Redis 的 string 可以包含任何数据。
        比如 jpg 图片或者序列化的对象 。
      3.string 类型是 Redis 最基本的数据类型,一个键最大能存储512MB。
      
      4.示例:
        redis 127.0.0.1:6379> SET name zfpx
        OK
        redis 127.0.0.1:6379> GET name
        "zfpx"

    2.Hash:
      1.Redis hash 是一个键值对集合。
      2.Redis hash 是一个 string 类型的 field 和 value 的映射表。
      3.hash 特别适合用于存储对象。
      4.每个 hash 可以存储 2^32-1键值对(40多亿)。
      
      5.示例:
        redis 127.0.0.1:6379> HMSET user:1 username zfpx password 123
        OK
        redis 127.0.0.1:6379> HGETALL user:1
        1) "username"
        2) "zfpx"
        3) "password"
        4) "123"

    3.List:
      1.Redis 列表是简单的字符串列表,按照插入顺序排序。
      2.你可以添加一个元素导列表的头部(左边)或者尾部(右边)。
      3.每个 List 可以存储 2^32-1键值对(40多亿)。
      
      4.示例:
        redis 127.0.0.1:6379> lpush name zfpx1
		(integer) 1
		redis 127.0.0.1:6379> lpush name zfpx2
		(integer) 2
		redis 127.0.0.1:6379> lpush name zfpx3
		(integer) 3
		redis 127.0.0.1:6379> lrange name 0 -1
		1) "zfpx3"
		2) "zfpx2"
		3) "zfpx1"
		
  
    4.Sets:
      1.Redis的Set是string类型的无序集合。 
      2.集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
      3.添加一个string元素到 key 对应的 set 集合中,成功返回1,
        如果元素已经在集合中返回0。
      
      4.示例:
        redis 127.0.0.1:6379> sadd school zfpx1
		(integer) 1
		redis 127.0.0.1:6379> sadd school zfpx1
		(integer) 0
		redis 127.0.0.1:6379> sadd school zfpx2
		(integer) 1
		redis 127.0.0.1:6379> sadd school zfpx2
		(integer) 0
		redis 127.0.0.1:6379> smembers school
		1) "zfpx1"
		2) "zfpx2"
		

    5.zset/sorted set:
      1.Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 
        不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集
        合中的成员进行从小到大的排序。
      2.zset的成员是唯一的,但分数(score)却可以重复。
        可以通过 zadd 命令(格式如下) 添加元素到集合,
        若元素在集合中存在则更新对应score。
    
  3.对HBase的优势:
    1.Redis的读写性能在100,000 ops/s左右,时延一般为10~70微妙左右;而HBase的单
      机读写性能一般不会超过1,000ops/s,时延则在1~5毫秒之间。
    2.Redis的魅力还在于它不像HBase只支持简单的字符串,他还支持集合set,有序集合
      zset和哈希hash。
    
    3.示例:zadd key score member
      redis 127.0.0.1:6379> zadd school 0 zfpx1
		(integer) 1
		redis 127.0.0.1:6379> zadd school 2 zfpx2
		(integer) 1
		redis 127.0.0.1:6379> zadd school 0 zfpx3
		(integer) 1
		redis 127.0.0.1:6379> zadd school 1 zfpx4
		(integer) 0
		redis 127.0.0.1:6379> ZRANGEBYSCORE school 0 100
		1) "zfpx1"
		2) "zfpx3"
		3) "zfpx4"
		4) "zfpx2"


	4.性能:
	  Redis数据库完全在内存中,因此处理速度非常快,每秒能执行约11万集合,
	  每秒约81000+条记录。

	5.优点:
	  1. 非常丰富的数据结构;
	  2. Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断;
	  3. 数据存在内存中,读写非常的高速,可以达到10w/s的频率。
	  
	6.	缺点:
	  1. Redis3.0后才出来官方的集群方案,但仍存在一些架构上的问题;
	  
	  2. 持久化功能体验不佳——通过快照方法实现的话,需要每隔一段时间
	     将整个数据库的数据写到磁盘上,代价非常高;而aof(appendOnlyFile)
	     方法只追踪变化的数据,类似于mysql的binlog方法,但追加log可能过大,同
	     时所有操作均要重新执行一遍,恢复速度慢;
	   
	  3. 由于是内存数据库,所以,单台机器,存储的数据量,跟机器本身的内存大小。
	     虽然redis本身有key过期策略,但是还是需要提前预估和节约内存。如果内存
	     增长过快,需要定期删除数据。虽然redis本身有key过期策略,但是还是需要
	     提前预估和节约内存。如果内存增长过快,需要定期删除数据。
一句话总结HBase、MongoDB、Redis:
  MongoDB做高性能数据库,Redis做缓存,HBase做大数据分析;
  MongoDB还无法取代关系型数据库。

猜你喜欢

转载自blog.csdn.net/weixin_41227335/article/details/88068115
今日推荐