蚂蚁金服电话面试问题

我面试的职位是数据研发工程师。html

前几天投了蚂蚁金服的简历,以后打电话通知我次日进行电话面试。因为只剩一夜的时间了准备不够充分,回答的不是很好,在此再次重温一下面试过程。java

刚开始面试官就让我自我介绍嘛,就是说了说本身的状况以及作过的项目。(这点包括简历上写的很重要,由于面试官会根据你的回答来进行下一步的提问,没有作过的千万不要去说)。node

由于投的是大数据方向的,因此面试官问的全是大数据方向的。面试

1.阿里云和腾讯云的区别。(因为我是有阿里云和腾讯云服务器搭建大数据平台的,因此面试官问了这个)算法

  操做系统
    阿里云:CentOS、openSUSE、Ubuntu、Windows Server 2008 R二、Aliyun Linux、Debian(所Aliyun Linux外,全部系统均提供32位和64位版本、Win2008提供中/英文)
    腾讯云:CentOS、SUSE、Ubuntu、Windows Server 2008 R2(全部系统仅支持64位)
  特点系统
    阿里云:北京、杭州、青岛机房支持“镜像市场”,可选择已集成建站系统、开发环境的系统,如集成wordpress、LAMP、LNMP、ASP/.NET、JDK、WEB管理面板等等。
  数据盘
    阿里云:购买时最多可添加4块,每块最高2000GB,购买后不支持卸载。
    腾讯云:购买时可购一块,最高500G
  独立磁盘
    阿里云:可添加“独立的磁盘”,不限数量与容量,“独立云磁盘能够单独购买,按需付费,独立存在。独立云磁盘能够在同一可用区内的不一样ECS实例间自由挂载和卸载。”
    腾讯云:暂无缓存

2.HDFS上传文件的过程(工做机制)服务器

  1)客户端向namenode发送上传文件请求,namenode对要上传目录和文件进行检查,判断是否能够上传,并向客户端返回检查结果。框架

  2)客户端获得上传文件的容许后读取客户端配置,若是没有指定配置则会读取默认配置(例如副本数和块大小默认为3和128M,副本是由客户端决定的)。向namenode请求上传一个数据块。分布式

  3)namenode会根据客户端的配置来查询datanode信息,若是使用默认配置,那么最终结果会返回同一个机架的两个datanode和另外一个机架的datanode。这称为“机架感知”策略。wordpress

  4)客户端在开始传输数据块以前会把数据缓存在本地,当缓存大小超过了一个数据块的大小,客户端就会从namenode获取要上传的datanode列表。以后会在客户端和第一个datanode创建链接开始流式的传输数据,这个datanode会一小部分一小部分(4K)的接收数据而后写入本地仓库,同时会把这些数据传输到第二个datanode,第二个datanode也一样一小部分一小部分的接收数据并写入本地仓库,同时传输给第三个datanode,依次类推。这样逐级调用和返回以后,待这个数据块传输完成客户端后告诉namenode数据块传输完成,这时候namenode才会更新元数据信息记录操做日志。

  5)第一个数据块传输完成后会使用一样的方式传输下面的数据块直到整个文件上传完成。

3.yarn的工做原理

  ·当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该应用程序:

  第一个阶段是启动ApplicationMaster;

  第二个阶段是由ApplicationMaster建立应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。

  步骤1 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

  步骤2 ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通讯,要求它在这个Container中启动应用程序的ApplicationMaster。

  步骤3 ApplicationMaster首先向ResourceManager注册,这样用户能够直接经过ResourceManager查看应用程序的运行状态,而后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。

  步骤4 ApplicationMaster采用轮询的方式经过RPC协议向ResourceManager申请和领取资源。

  步骤5 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通讯,要求它启动任务。

  步骤6 NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并经过运行该脚本启动任务。

  步骤7 各个任务经过某个RPC协议向ApplicationMaster汇报本身的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而能够在任务失败时从新启动任务。

       在应用程序运行过程当中,用户可随时经过RPC向ApplicationMaster查询应用程序的当前运行状态。

   步骤8 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭本身。

  参考博客:https://blog.csdn.net/zmx729618/article/details/73321316

4.Hadoop的伪分布式运行模式

  伪分布式只有一个节点

  这种模式也是在一台单机上运行, 但用不一样的Java进程模仿分布式运行中的各种结点: (NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode)

  请注意分布式运行中的这几个结点的区别:

  1. 从分布式存储的角度来讲,集群中的结点由一个NameNode和若干个DataNode组成,另有一个SecondaryNameNode做为NameNode的备份。
  2. 从分布式应用的角度来讲,集群中的结点由一个JobTracker和若干个TaskTracker组成,JobTracker负责任务的调度,TaskTracker负责并行执行任务。TaskTracker必须运行在DataNode上,这样便于数据的本地计算。JobTracker和NameNode则无须在同一台机器上。一个机器上,既当namenode,又当datanode,或者说 既 是jobtracker,又是tasktracker。没有所谓的在多台机器上进行真正的分布式计算,故称为"伪分布式"。开启多个进程模拟彻底分布式,可是并无真正提升程序执行的效率。

 5.HDFS和Spark的对比

  参考博客:https://blog.csdn.net/yanjiangdi/article/details/78260186

6.除了spark你还了解过其余大数据框架么,有什么区别

Hadoop框架

提起大数据,第一个想起的确定是Hadoop,由于Hadoop是目前世界上应用最普遍的大数据工具,他凭借极高的容错率和极低的硬件价格,在大数据市场上风生水起。Hadoop仍是第一个在开源社区上引起高度关注的批处理框架,他提出的Map和Reduce的计算模式简洁而优雅。迄今为止,Hadoop已经成为了一个广阔的生态圈,实现了大量算法和组件。因为Hadoop的计算任务须要在集群的多个节点上屡次读写,所以在速度上会稍显劣势,可是其吞吐量也一样是其余框架所不能匹敌的。

Storm框架

与Hadoop的批处理模式不一样,Storm采用的是流计算框架,由Twitter开源而且托管在GitHub上。与Hadoop相似的是,Storm也提出了两个计算角色,分别为Spout和Bolt。

若是说Hadoop是水桶,只能一桶一桶的去井里扛,那么Storm就是水龙头,只要打开就能够源源不断的出水。Storm支持的语言也比较多,Java、Ruby、Python等语言都能很好的支持。因为Storm是流计算框架,所以使用的是内存,延迟上有极大的优点,可是Storm不会持久化数据。

Samza框架

Smaza也是一种流计算框架,但他目前只支持JVM语言,灵活度上略显不足,而且Samza必须和Kafka共同使用。可是响应的,其也继承了Kafka的低延时、分区、避免回压等优点。对于已经有Hadoop+Kafka工做环境的团队来讲,Samza是一个不错的选择,而且Samza在多个团队使用的时候能体现良好的性能。

Spark框架

Spark属于前两种框架形式的集合体,是一种混合式的计算框架。它既有自带的实时流处理工具,也能够和Hadoop集成,代替其中的MapReduce,甚至Spark还能够单独拿出来部署集群,可是还得借助HDFS等分布式存储系统。Spark的强大之处在于其运算速度,与Storm相似,Spark也是基于内存的,而且在内存满负载的时候,硬盘也能运算,运算结果表示,Spark的速度大约为Hadoop的一百倍,而且其成本可能比Hadoop更低。可是Spark目前尚未像Hadoop哪有拥有上万级别的集群,所以现阶段的Spark和Hadoop搭配起来使用更加合适。

Flink框架

Flink也是一种混合式的计算框架,可是在设计初始,Fink的侧重点在于处理流式数据,这与Spark的设计初衷偏偏相反,而在市场需求的驱使下,二者都在朝着更多的兼容性发展。Flink目前不是很成熟,更多状况下Flink仍是起到一个借鉴的做用。

 6.Java的内容泄漏

  内存泄露是指无用对象(再也不使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而形成的内存空间的浪费称为内存泄露。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。

  参考博客:https://www.cnblogs.com/panxuejun/p/5883044.html