自我介绍

Java、Linux、Python、MySQL,平时Java是第一语言,Python用得比较多,Liunx也比较熟悉……
我是**学校大三的学生,我今天过来是面试您公司的大数据开发实习生的职位,我的性格就不用介绍,我这个状态您就看得出来(无敌超级自信),我做过的项目主要就是简历上那几个具体地我都写得很清楚,然后我对Java、Liunx、MySQ比较熟悉但不是精通,Python也用得很多,嗯…,我的介绍大概就是这些,谢谢您。

项目介绍

实际上并没有太多项目经验,
我:好,那我讲一下最后那个Web项目吧,去年的时候我同学参加全国物流设计大赛,然后需要在设计的基础上开发一个Web系统,然后我主要负责开发系统,用到的技术是SSM、Vue、BootStrap,然后我自己买了华为的服务器和域名,然后我还完成了项目部署和域名解析。
面试官:那你这个开发过程中有没有遇到什么问题?你开发的时候版本控制是用的Git对吧?有没有用什么高级的命令还是就自己平时pull/push比较多?
我:嗯..因为上学期我们专业开了一门JavaEE课,然后我对三大框架还是比较熟悉的,后台开发的时候很顺利没有什么问题(其实问题还是有的,那会儿慌,少一事不如多一事,现在后悔没深入讲),主要是前端Vue在数据绑定的时候有点问题,这个系统我是前后端分离开发的。额..对,开发的时候我是用的Git版本控制,然后项目和平时的一些代码都是同步到GitHub和Coding上面的,高级命令的话…主要还是平时自己用,跟同学一起做项目的时候高级命令也用过,不过比较少。
面试官:哦….好,那你在开发的时候,有没有关注jvm的内存啊,比如一些参数啊
我:jvm内存我倒是没关注,我当时是用nomo命令看了个linux服务器上的CPU啊,IO啊,还有内存的情况。
面试官: 嗯对,这样也可以
项目主要就说了这一个,爬虫和FPGA的面试没有提。

手撕代码

快排
两个栈实现一个队列

基本功考察

1.操作系统中的进程和线程的区别。

2.JVM的内存模型说一下,堆,栈,永久区,GC。

JAVA堆

堆是Java虚拟机所管理的内存中最大的一块,它唯一的功能就是存储对象实例。几乎所有的对象(包含常量池),都会在堆上分配内存。
如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError 异常。
垃圾回收器的主要管理区域。
该区域,从垃圾回收的角度看,又分为新生代和老年代,新生代又分为 伊甸区(Eden space)和幸存者区(Survivor pace) ,Survivor 区又分为Survivor From 区和 Survivor To 区。

Java的多线程。
HTTP和TCP
写俩算法,可以用IDE。都是超简单的,有一个台阶,还有一个m的n次幂,自己写个测试试一下
写个sql
mysql的索引,如何实现的,何时失效,聚簇索引和非聚簇索引,

B+树
写个单例,懒汉饿汉。
处理数据倾斜

三面
项目
HTTP,TCP
操作系统的进程与线程
Java多线程,线程池

Java基础,说说

容器

请说一下Java容器集合的分类,各自的继承结构

  • Java中的容器集合分为两大阵营,一个是Collection,一个是Map
  • Collection下分为Set,List,Queue
  • Set的常用实现类有HashSet,TreeSet等
  • List的常用实现类有ArrayList,LinkedList等
  • Queue的常用实现类有LinkedList,ArrayBlockingQueue等
  • Map下没有进一步分类,它的常用实现类有HashMap,ConcurrentHashMap等

多线程,线程池
java的序列化方式,hadoop的序列化方式,Avro,parquet,transient关键字

这个环节,面试官主要是围绕我写的博客来问的,简历上给了自己的博客和GitHub的地址。
我:红黑树这个是我前天写的,我就简单讲一下吧,红黑树它首先是一个二叉搜索树,然后也是一个平衡树,然后它本身也是带有颜色属性的,除了二叉搜索树和平衡树以外,它还具有一些特点,主要是根节点是黑色的,不存在两个相邻的红色的节点…..
面试官:嗯…那你讲下,平衡树是怎么自动平衡的?

Q:嗯,Kafka你了解吧,你讲一下Kfaka
我:(卧槽,你打电话过来前10分钟我才开始学Kafka),好,Kafka底层实际上是基于消息队列的,然后主要是用于数据缓存、和即时性的这种日志提取嘛…..(胡说八道…..),额,Kafka我刚刚才开始学…

Q:好,没事,你讲讲hbase吧
我:(hbase是我学的比较浅的地方)hbase的产生背景主要是因为hive它速度很慢,时效性不高,而hbase这种框架的话,它本身这种查询和更新的速度时比较快的,然后它是一种面向列一种横向扩展的结构。

Q:那hbase为什么快,hive为什么慢,你详细说一下
我:hive之所以慢是因为它实际上是通过mapreduce来实现的,而mapreduce它本身就说很慢的,它主要需要经过切面、map、排序、合并还有归并这几个过程,而且它还有资源浪费的问题,比如map和reduce不是同时进行的,hbase的话,它不是通过mapreduce来是实现的,它是一种单独的查询更新的框架..

面试官:既然mapreduce这么慢,为什么还有这么多人用它?
我:嗯..实际上现在很多公司都在用Spark、Flink这些,然后mapreduce的话用来做离线分析还是可以的,毕竟对时间的要求不是很高。

面试官:RPC协议你懂对吧?你讲讲什么是RPC协议,怎么实现的?
我:RPC协议是HDFS中节点之间的通信协议,简单来讲就说在一台机器上面调用另机器上的程序,它主要是通过Java的序列化和反序列化来实现的,因为不同节点的信息主要是保存在java对象里面的嘛,序列化就是把java文件转化成字节的形式通过保存下来,然后通过网络发送到另一台机器上面。

面试官:嗯,好。我考你个linux命令哈,怎么把一台服务器上的文件复制到另一台文件上?
我:(之前在做hadoo的时候,我都是用的伪分布式,集群我没搭,我觉得没必要,所以这个命令我也没用过,不过我还是知道的)这个是通过ssh来是实现的嘛,嗯..就是那个scp命令。

面试官:嗯,好。java虚拟机内存管理,你大致讲讲
我:好!(自信),java虚拟机内存主要是虚拟机栈、堆、本地方法栈、方法区、程序计数器这六个部分。
面试官:再讲讲堆和栈主要有哪些区别,用来存放什么东西?
我:栈主要是用来存放一些基本类型的数据还有引用,堆是用来存放实例化的对象还有数组,另外GC垃圾回收也是在这一块。
面试官:嗯,好。我看你博客上面写了==和equals的区别,你讲讲
我:好(自信),equals本质上就说==,只不过像String还有Inetger这些类对原来的方法进行了重写,然后==是对象的地址和基本类型的值,equals的话对于普通对象,是比较地址的,然后那些没有重写它原来的方法的对象是比较值的(这个地方,我表达得有点问题,当时面试官就让重复说了一遍)
面试官:嗯,好,那你有没有看过什么源码?
我:(心好痛,我真的没看过,直接说没看过也不好)嗯…源码的话我之前看过Spring的源码,嗯…就说ioc切面那一块,还有平时在github上面也有看一些小项目的源码。另外,就bilibili的源码我也看过一点(尬笑)

面试官:嗯..你讲一下sping ioc是怎么回事?
我:好,我组织下语言哈,嗯…在没有ioc之前,我们如果要监控一个类里面的变量的情况,或者做事务处理,就必须得在那个被监控的类里面写代码,在有了ioc切面类以后,我们就可以单独写一个类来实现这种方法,它具体的细节是封装在底层的,我们不用关注。

面试官:那它怎么就实现了这种监控的呢?或者说怎么配置的?
我:它的配置是通过注解来实现的,然后好像也可以在XML文件里配置吧,然后它主要是由那5个方法来是实现的,也就是before、after、finaly、还有一个抛出异常的方法。

面试官:嗯,好。

写sql查询语句

你给我讲讲数据库的索引。

7、实现索引的方式? 索引的原理? 索引的代价? 索引的类型?
实现索引的方式有两种:针对一张表的某些字段创建具体的索引,如对oracle: create index 索引名称 on 表名(字段名);在创建表时为字段建立主键约束或者唯一约束,系统将自动为其建立索引。

索引的原理:根据建立索引的字段建立索引表,存放字段值以及对应记录的物理地址,从而在搜索的时候根据字段值搜索索引表的到物理地址直接访问记录。

引入索引虽然提高了查询速度,但本身占用一定的系统存储容量和系统处理时间,需要根据实际情况进行具体的分析.

  • 首先说不同的存储引擎的索引是不同的。然后谈到了InnoBD与ISAM的区别。然后画图并且解释,然后谈到了复杂度然后谈到了索引与二叉搜索树与二分查找的关系。时间复杂度。最后谈到了HBase中实现高性能的LSM树。
  • 然后谈到事务的实现方式MVCC,谈笑风生。
  • 最后是索引的优化与失效,《高性能MySQL》中独立的列。
  • 谈一下索引的页,我谈到了索引随机化产生的页分裂的问题。(其实这些知识都在《高性能MySQL中出现过》)。

一、Java核心

1.1 java核心语法

1.2 Java8新特性、java9-12新特性

1.3 设计模式

1.4 数据结构


二、JavaWeb前后端交互

2.1 MySQL数据库

2.2 JDBC技术

2.3 HTML基础和CSS

2.4 JavaScript和JQuery

2.5 XML与XML解析

6-Tomcat服务器安装与配置

7-HTTP协议

8-服务器组件Servlet

9-JSP

10-EL表达式

11-JSTL

12-会话控制和Session

13-过滤器Filter

14-监听器Listener

15-异步数据传输框架Ajax


三、Java高级框架

1-系统整体分层解耦框架Spring

2-MVC架构经典Web框架SpringMVC

3-分布式基础整合框架SpringBoot


四、常用工具和环境

1-项目构理、jar包管理工具Maven

6-MySQL优化

7-服务器操作系统Linux常用操作,进程,线程

10-LUinux命令解析器Shell


五、Hadoop生态体系

1-大数据分析存储框架Hadoop集群搭建

Hadoop由三个模块组成:分布式存储HDFS、分布式计算MapReduce、资源调度引擎Yarn

2.大数椒分析存储概架Hadoop之HDFS

  • HDFS模块:
    • namenode:主节点,主要负责HDFS集群的管理以及元数据信息管理
    • datanode:从节点,主要负责存储用户数据
    • secondaryNameNode:辅助namenode管理元数据信息,以及元数据信息的冷备份
  • Yarn模块:
    • ResourceManager:主节点,主要负责资源分配
    • NodeManager:从节点,主要负责执行任务
  • 类似HDFS,YARN也是经典的主从(master/slave)架构
    • YARN服务由一个ResourceManager(RM)和多个NodeManager(NM)构成
    • ResourceManager为主节点(master)
    • NodeManager为从节点(slave)

3-大数握分析存储粒架Hadoop之MapReduce

  • MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。
  • MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。
  • Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些==小任务可以并行计算,彼此间几乎没有依赖关系。==
  • Reduce负责“合”,即对map阶段的结果进行全局汇总。
  • 这两个阶段合起来正是MapReduce思想的体现。

    mapreduce编程指导思想(八个步骤背下来)

  • MapReduce的开发一共有八个步骤其中map阶段分为2个步骤,shuffle阶段4个步骤,reduce阶段分为2个步骤

    1. Map阶段2个步骤

  • 第一步:设置inputFormat类,将数据切分成key,value对,输入到第二步

  • 第二步:自定义map逻辑,处理我们第一步的输入kv对数据,然后转换成新的key,value对进行输出

    2. shuffle阶段4个步骤

  • 第三步:对上一步输出的key,value对进行分区。(相同key的kv对属于同一分区)

  • 第四步:对每个分区的数据按照key进行排序
  • 第五步:对分区中的数据进行规约(combine操作),降低数据的网络拷贝(可选步骤)
  • 第六步:对排序后的kv对数据进行分组;分组的过程中,key相同的kv对为一组;将同一组的kv对的所有value放到一个集合当中(每组数据调用一次reduce方法)

    3. reduce阶段2个步骤

  • 第七步:对多个map的任务进行合并,排序,写reduce函数自己的逻辑,对输入的key,value对进行处理,转换成新的key,value对进行输出

  • 第八步:设置将输出的key,value对数据保存到文件中

4-分布式服务管理框架Zookeeper

1. 什么是ZooKeeper?(5分钟)

  • 是Google的Chubby的一个开源实现版
  • ZooKeeper
    • 一个主从架构的分布式框架、开源的
    • 对其他的分布式框架的提供协调服务(service)
  • Zookeeper 作为一个分布式的服务框架

    • 它提供类似于linux文件系统(有目录节点树)的简版文件系统来存储数据
    • Zookeeper 维护和监控存储的数据的状态变化,通过监控这些数据状态的变化,从而达到基于数据的集群管理
    • 主要用来解决分布式集群中应用系统的一致性问题
      2. 为什么要用ZooKeeper(5分钟)
  • 分布式框架多个独立的程序协同工作比较复杂

    • 开发人员容易花较多的精力实现如何使多个程序协同工作的逻辑
    • 导致没有时间更好的思考实现程序本身的逻辑
    • 或者开发人员对程序间的协同工作关注不够,造成协调问题
    • 且分布式框架中协同工作的逻辑是==共性的==需求
  • ZooKeeper简单易用,能够很好的解决分布式框架在运行中,出现的各种协调问题。
    • 比如集群master主备切换、节点的上下线感知、统一命名服务、状态同步服务、集群管理、分布式应用配置管理等等

6-数据仓库工具Hive

image.png

  • Hive是基于Hadoop的一个数据仓库工具
    • 可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。
    • 其本质是将SQL转换为MapReduce的任务进行运算,底层由HDFS来提供数据的存储支持,说白了hive可以理解为一个将SQL转换为MapReduce任务的工具,甚至更进一步可以说hive就是一个MapReduce的客户端
    • 这里必须讲下MapReduce是一栋大厦的基底,学和用Hive都需要站在MapReduce这个巨人的肩膀上。(虽然偶还只是懂原理,还没啃源码,打算留在寒假慢慢啃)
  • Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。

    12-日志采集传输框架Flume

    1. 概述

  • Flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统。

  • Flume可以采集文件,socket数据包、文件、文件夹、kafka等各种形式源数据,又可以将采集到的数据(下沉sink)输出到HDFS、hbase、hive、kafka等众多外部存储系统中
  • 一般的采集需求,通过对flume的简单配置即可实现
  • Flume针对特殊场景也具备良好的自定义扩展能力,因此,flume可以适用于大部分的日常数据采集场景

    2. 运行机制

  • Flume分布式系统中最核心的角色是agent,flume采集系统就是由一个个agent所连接起来形成的

  • 每一个agent相当于一个数据传递员,内部有三个组件:
    • Source:采集组件,用于跟数据源对接,以获取数据
    • Sink:下沉组件,用于往下一级agent传递数据或者往最终存储系统传递数据
    • Channel:传输通道组件,用于从source将数据传递到sink

      13-分布式发布,订阅消息系统Kafka

      1)Kafka是大数据里面难度较大,而且使用广泛的一个技术,倒不是说使用起来难度大,而是说使用过程中容易出问题,但是生产又对其稳定性要求高。通过剖析其里面的源码可以帮助大家深刻理解Kafka的原理,便于大家去解决生产中的问题。

15-非关系型列式存储数握库HBase

1.1 HBase的概念

  • HBase基于Google的BigTable论文,是建立的==HDFS==之上,提供高可靠性高性能列存储可伸缩实时读写的分布式数据库系统。
  • 在需要==实时读写随机访问==超大规模数据集时,可以使用HBase。

    1.2 HBase的特点

  • ==海量存储==

    • 可以存储大批量的数据
  • ==列式存储==
    • HBase表的数据是基于列族进行存储的,列族是在列的方向上的划分。
  • ==极易扩展==
    • 底层依赖HDFS,当磁盘空间不足的时候,只需要动态增加datanode节点就可以了
    • 可以通过增加服务器来对集群的存储进行扩容
  • ==高并发==
    • 支持高并发的读写请求
  • ==稀疏==
    • 稀疏主要是针对HBase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。
  • ==数据的多版本==
    • HBase表中的数据可以有多个版本值,默认情况下是根据版本号去区分,版本号就是插入数据的时间戳
  • ==数据类型单一==
    • 所有的数据在HBase中是以==字节数组==进行存储

17-数据传输框架Sqoop

1. 概述

  • Sqoop是apache旗下的一款 ”Hadoop和关系数据库之间传输数据”的工具导入数据:将MySQL,Oracle导入数据到Hadoop的HDFS、HIVE、HBASE等数据存储系统导出数据:从Hadoop的文件系统中导出数据到关系数据库

    2. Sqoop的工作机制

  • 将导入和导出的命令翻译成mapreduce程序实现

  • 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制

19-任务调度框架Azkaban

Azkaban介绍

  • Azkaban是由Linkedin开源的一个批量工作流任务调度器。用于在一个工作流内以一个特定的顺序运行一组工作和流程。
  • Azkaban定义了一种KV文件(properties)格式来建立任务之间的依赖关系,并提供一个易于使用的web用户界面维护和跟踪你的工作流。
  • 它有如下功能特点:

    • Web用户界面
    • 方便上传工作流
    • 方便设置任务之间的关系
    • 调度工作流
    • 认证/授权(权限的工作)
    • 能够杀死并重新启动工作流
    • 模块化和可插拔的插件机制
    • 项目工作区
    • 工作流和任务的日志记录和审计

      azkaban的基本架构

  • Azkaban由三部分构成

    • 1、Azkaban Web Server提供了Web UI,是azkaban的主要管理者,包括 project 的管理,认证,调度,对工作流执行过程的监控等。
    • 2、Azkaban Executor Server负责具体的工作流和任务的调度提交
    • 3、Mysql用于保存项目、日志或者执行计划之类的信息

      六、Spark

      Spark是一个快速(基于内存),通用、可扩展的计算引擎,采用Scala语言编写。2009年诞生于UC Berkeley(加州大学伯克利分校,CAL的AMP实验室),2010年开源,2013年6月进入Apach孵化器,同年由美国伯克利大学 AMP 实验室的 Spark 大数据处理系统多位创始人联合创立Databricks(属于 Spark 的商业化公司-业界称之为数砖-数据展现-砌墙-侧面应正其不是基石,只是数据计算),2014年成为Apach顶级项目,自2009年以来,已有1200多家开发商为Spark出力!

1-多范式编程语言Scala

1. scala简介

  • scala是运行在 JVM 上的多范式编程语言,同时支持==面向对象==和==面向函数编程==
  • scala大概是在==2003年==才正式诞生,而java的诞生可以追溯到1995年
  • 早期scala刚出现的时候,并没有怎么引起重视,随着==Spark==(2010开源、2014成为apache顶级项目)和==Kafka==这样基于scala的大数据框架的兴起,scala逐步进入大数据开发者的眼帘。
  • scala的主要优势是它的==表达性==。
  • 官网地址

  • 开发大数据应用程序(Spark程序、Flink程序)

  • 表达能力强,一行代码抵得上Java多行,开发速度快
  • 兼容Java,可以访问庞大的Java类库

2-多范式编程语言Scala数据结构和算法

3-大数据分析框架Spark 集群搭建

4-大数据分析框架Spark Core

5-大数据分析框架Spark SQL

七、Flink生态体系

  • Apache Flink 是一个分布式大数据处理引擎,可对有界数据流和无界数据流进行有状态的计算。能够部署在各种集群环境,对各种规模大小的数据进行快速计算。
  • 在实际生产的过程中,大量数据在不断地产生,例如金融交易数据、互联网订单数据、 GPS 定位数据、传感器信号、移动终端产生的数据、通信信号数据等,以及我们熟悉的网络 流量监控、服务器产生的日志数据,这些数据最大的共同点就是实时从不同的数据源中产生, 然后再传输到下游的分析系统。针对这些数据类型主要包括实时智能推荐、复杂事件处理、 实时欺诈检测、实时数仓与 ETL 类型、流数据分析类型、实时报表类型等实时业务场景,而 Flink 对于这些类型的场景都有着非常好的支持。

1-大数据分析框架Flink 集群搭建
2-大数据分析框架Flink运行架构原理
3-大数据分析框架Flink DataStream API
4-大数据分析框架Flink EventTime和Window
5-大数据分析框架Flink有状态计算