原创

记一次阿里巴巴校招内推面试

电话面(50分钟左右)

我的心得体会

我强烈感觉到面试全过程都是围绕着我的简历还有我的GitHub来问的,简历写了什么就差不多会问你。

1.先简单介绍一下自己吧。

2.我看你的GitHub写了RabbitMQ和Kafka的教程,Star数一百多了啊?那你来说说什么是RabbitMQ和Kafka?说一下两者的区别?

RabbitMQ遵循AMQP协议,RabbitMQ的broker由Exchange,Binding,queue组成,其中exchange和binding组成了消息的路由键;客户端Producer通过连接channel和server进行通信,Consumer从queue获取消息进行消费(长连接,queue有消息会推送到consumer端,consumer循环从输入流读取数据)。rabbitMQ以broker为中心;

kafka遵从一般的MQ结构,producer,broker,consumer,以consumer为中心,消息的消费信息保存的客户端consumer上,consumer根据消费的点,从broker上批量pull数据。

消息确认机制不同:RabbitMQ 具有生产者confirm机制以及消费者的消息应答机制ack,而Kafka没有应答机制。

消息的顺序不同:在一个队列里面,rabbitmq的消息是严格顺序的,按照先进先出;在同一个partition中消息是有序的,但是生产者put到Kafka中数据会分布在不同的partition中,所有总体是无序的。

吞吐量:RabbitMQ在不使用ACK机制的时候吞吐量比使用ACK机制大;Kafka具有巨大的吞吐量,数据的存储以及获取是本地磁盘的批量处理,可以达到百万/s。

可靠性:RabbitMQ使用了MirrorQueue的机制,也可以做到多个机器进行热备;Kafka的broker支持主备模式。

持久化:RabbitMQ支持消息持久化;Kafka 是一个持久性消息存储。

3.了解过RabbitMQ哪些消息模式?

  • 简单队列:一个生产者P发送消息到队列Q,一个消费者C接收。
  • 工作队列:轮询分发,结果就是不管谁忙或清闲,都不会给谁多一个任务或少一个任务,任务总是你一个我一个的分。
  • 消息订阅模式:一个消息被多个消费者消费。
  • 路由模式:

  • 发送消息到交换机并且要指定路由key 。

  • 消费者将队列绑定到交换机时需要指定路由key。

  • 主题模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词。

  • RPC远程调用模式:如果需要在远程机器上运行个函数并等待结果,就需要使用RPC(远程过程调用)模式来实现。

4.如何保证kafka的高容错性?

生产者(producer)不使用批量接口,并采用同步模型持久化消息。

消费者(consumer)不采用批量化,每消费一次就更新offset。

5.说一下Zookeeper的选举机制?Zookeeper用来干嘛的?使用场景?

选举机制:

1)半数机制:集群中半数以上机器存活,集群可用。所以Zookeeper适合安装奇数台服务器。

2)Zookeeper虽然在配置文件中并没有指定Master和Slave。但是,Zookeeper工作时,是有一个节点为Leader,其他则为Follower,Leader是通过内部的选举机制临时产生的。

Zookeeper用来干嘛的:

为分布式应用提供协调服务的。

使用场景:

提供的服务包括:统一命名服务、统一配置管理、统一集群管理、服务器节点动态上下线、软负载均衡等。

6.Hadoop的一个block默认大小是多大?原因是什么?

Hadoop2.0以上是64MB,Hadoop2.0以下是64MB。

减少硬盘寻道时间;减少Namenode内存消耗;Map崩溃问题;监管时间问题;问题分解问题;约束Map输出。

7.我看你项目使用过ELK,说一下什么是ELK?你是如何项目中如何使用的?

ELK是Elasticsearch、Logstash、Kibana的简称。

我项目中是使用ELK作为日志分析系统,使用Logback集成RabbitMQ,RabbitMQ作为消息中间件,再使用Logstash将日志消息送到ElasticSearch中,Kibana作为ElasticSearch的可视化界面进行相关操作。

8.你会Spark?说一下Spark中的RDD是什么?谈谈spark中的宽窄依赖?

rdd是分布式数据集,是spark中最基本的数据抽象,它代表一个不可变,可分区,里面的元素可以并行计算的集合。

RDD和它的父RDD的关系有两种类型:窄依赖和宽依赖。

宽依赖:指的是多个子RDD的Partition会依赖同一个父RDD的Partition,关系是一对多,父RDD的一个分区的数据去到子RDD的不同分区里面,会有shuffle的产生

窄依赖:指的是每一个父RDD的Partition最多被子RDD的一个partition使用,是一对一的,也就是父RDD的一个分区去到了子RDD的一个分区中,这个过程没有shuffle产生。

9.使用过SpringCloud哪些组件并简述一下?

  • Eureka:注册中心。
  • Ribbon:负载均衡。
  • Feign:微服务之间的调用方式,包含了Ribbon。
  • Hystrix:服务垄断、隔离、仪表盘监控。
  • Zuul:路由网关。
  • Zipkin:分布式链路追踪系统。
  • Config:配置中心。
  • Bus:消息总线。

10.说一下SpringCloud和Dubbo的区别?

带宽占用:

springCloud是http协议传输,带宽会比较多,同时使用http协议一般会使用JSON报文,消耗会更大。

dubbo由于是二进制的传输,占用带宽会更少。

开发难易度:

springcloud的接口协议约定比较自由且松散,需要有强有力的行政措施来限制接口无序升级

dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决。

注册中心的选用:

dubbo的注册中心可以选择Zookeeper、redis。

springcloud的注册中心能用eureka、consul、Zookeeper。

11.说一下HBase的特点?解释一下HBase实时查询的原理?

HBase特点:

  1. hbase是一个分布式的,基于列式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理。
  2. hbase 适合存储半结构化或非结构化的数据,对于数据结构字段不够确定或者杂乱无章很难按照一个概念去抽取的数据。
  3. hbase为null的数据不会被存储。
  4. 基于的表包含rowKey,时间戳和列族,新写入数据时,时间戳更新,同时可以查询到以前的版本。
  5. hbase是主从结构,hmaster作为主节点,hregionServer作为从节点。

实时查询原理:

实时查询,可以认为是从内存中查询,一般响应时间在 1 秒内。 HBase 的机制是数据先写入到内存中,当数据量达到一定的量(如 128M),再写入磁盘中, 在内存中,是不进行数据的更新或合并操作的,只增加数据,这使得用户的写操作只要进入内存中就可以立即返回,保证了 HBase I/O 的高性能。

12.我看你会HBase和Hive,说一下它们的区别?

共同点:

  1. hbase与hive都是架构在hadoop之上的。都是用hadoop作为底层存储。

区别:

  1. Hive是建立在Hadoop之上为了减少MapReducejobs编写工作的批处理系统,HBase是为了支持弥补Hadoop对实时操作的缺陷的项目 。
  2. 想象你在操作RMDB数据库,如果是全表扫描,就用Hive+Hadoop,如果是索引访问,就用HBase+Hadoop 。
  3. Hive query就是MapReduce jobs可以从5分钟到数小时不止,HBase是非常高效的,肯定比Hive高效的多。
  4. Hive本身不存储和计算数据,它完全依赖于HDFS和MapReduce,Hive中的表纯逻辑。
  5. hive借用hadoop的MapReduce来完成一些hive中的命令的执行。
  6. hbase是物理表,不是逻辑表,提供一个超大的内存hash表,搜索引擎通过它来存储索引,方便查询操作。
  7. hbase是列存储。
  8. hdfs作为底层存储,hdfs是存放文件的系统,而Hbase负责组织文件。
  9. hive需要用到hdfs存储文件,需要用到MapReduce计算框架。

13.Redis有哪些常见数据结构?说一下使用场景?

  1. String:String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用; 常规计数:微博数,粉丝数等。
  2. Hash:Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 比如我们可以Hash数据结构来存储用户信息,商品信息等等。
  3. List:list就是链表,Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,最新消息排行等功能都可以用Redis的list结构来实现。
  4. Set:set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。
    当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
  5. Sorted Set:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

14.你还有什么要问我的吗?

这个过程我跟他聊了一下,问了他一些问题,内容略......

正文到此结束