0%

面试题总结

本文主要包括:

  • spark面试题
  • hbase面试题
  • kafka面试题
  • flume面试题
  • hive面试题
  • kudu面试题
  • presto面试题
  • flink面试题
  • redis面试题
  • mongodb面试题
  • es面试题
  • 数据仓库面试题
  • java面试题
  • scala面试题
  • sqoop与datax面试题

Spark面试题总结

Kafka面试题总结

  • Kafka 分布式的情况下,如何保证消息的顺序?
    Kakfa不保证数据的整体有序,但是可以设置分区内消息有序,可以设置相同的key到同一个partition,这样就可以保证同一个key的消息,肯定是有序的

数据仓库面试题总结

Hbase面试题

  • Hbase是写快还是读快?为什么?
    Hbase是写快读慢。
    Hbase写入速度比读取速度要快,根本原因LSM存储引擎
    LSM核心思想的核心就是放弃部分读能力,换取写入的最大化能力
    LSM核心思路就是假定内存足够大,因此不需要每次有数据更新就必须将数据写入到磁盘中,而可以先将最新的数据驻留在内存中,等到积累到最后多之后,再使用归并排序的方式将内存内的数据合并追加到磁盘队尾
    将对数据的修改增量保持在内存中,达到指定的大小限制后将这些修改操作批量写入磁盘,不过读取的时候稍微麻烦,需要合并磁盘中历史数据和内存中最近修改操作,所以写入性能大大提升,读取时可能需要先看是否命中内存,否则需要访问较多的磁盘文件
    LSM树原理把一棵大树拆分成N棵小树,它首先写入内存中,随着小树越来越大,内存中的小树会flush到磁盘中,磁盘中的树定期可以做merge操作,合并成一棵大树,以优化读性能

Sqoop与DataX面试题

  • Sqoop与DataX优缺点比较?
    功能 DataX Sqoop
    运行模型 单进程多线程 MapReduce
    Mysql读写 单机压力大;读写粒度容易控制 mr模式重,写出错处理麻烦
    hive读写 单机压力大 很好
    分布式 不支持,可以通过调度系统规避 支持
    流控 有流控功能 需要定制
    DataX是单机的,不是分布式的,但是可以通过在多台脚本机上启动任务来规避。但是DataX比较灵活,Sqoop重一点。
    DataX虽然是单机的,但是,它的客户端是与namenode通信,走的是hdfs写数据流程,写数据的过程是并行执行的

Canel 是实时的,可以采集mysql的Binlog数据

Redis面试题

  • Redis有哪些优缺点
  • *优点**
  • 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
  • 支持数据持久化,支持AOF和RDB两种持久化方式。
  • 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
  • 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点

  • 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

  • Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

  • Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

  • 为什么要用 Redis 而不用 map/guava 做缓存?
    缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
    使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。

  • Redis 的持久化机制是什么?各自的优缺点?
    Redis 提供两种持久化机制 RDB(默认)AOF 机制
    RDB:是Redis DataBase缩写快照

    RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

优点:
1、只有一个文件 dump.rdb,方便持久化。
2、容灾性好,一个文件可以保存到安全的磁盘。
3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
4.相对于数据集大时,比 AOF 的启动效率更高。

缺点:
1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)

AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

优点:
1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))

缺点:
1、AOF 文件比 RDB 文件大,且恢复速度慢。
2、数据集大的时候,比 rdb 启动效率低。

RDB(默认)AOF 机制优缺点是什么?

AOF文件比RDB更新频率高,优先使用AOF还原数据。
AOF比RDB更安全也更大
RDB性能比AOF好
如果两个都配了优先加载AOF

  • Redis的过期键的删除策略

    MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

  • 全局的键空间选择性移除
    noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
    allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
  • 设置过期时间的键空间选择性移除
    volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
    volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
    volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。

flink面试题

移步Flink面试题总结