HR面试:

1.个人介绍
2.求职原因
3.发展规划
4.个人经历
5.有什么需要问的?

技术面试:

1.开发环境:开发工具、版本控制工具等等
2.技术架构:技术栈
3.组织架构:人员数、人员结构
4.部门期望我未来发挥什么作用

网络面试题(题目是别人的,答案是自己的)

大数据开发工程师面试经验(北京) - 甲乙丙丁

面试过程:
公司氛围还可以,面试过程中也没什么特别的,就是提问回答,说对说错都直接问下一个问题,最后面试完成后回去等通知
面试官问的面试题:
kafka的三种部署模式
答:分别是单broker(单机模式)、单机多broker(伪分布式)、多机多broker(完全分布式)
kafka的三种消费者模式

  • 最多一次:将自动提交设置为false,先提交offset,再消费
  • 最少一次:将自动提交设置为false,先消费,再提交offset
  • 精准一次:将自动提交设置为false,先消费,消费逻辑保证幂等性,最后再提交offset。

kafka生产者发送消息的三种方式
答:直接发生不等结果、同步发送等待结果、异步发送回调结果
kafka怎么优化
答:

  • broker优化:资源最优化、调大num.io.threads(处理消息disk io线程,默认为8,调为2*cpu)、调大num.network.threads(处理消息网络请求线程数,默认为3,调为cpu+1)。
  • 加分区、加消费者、调消费者拉取消息的batchsize
  • 生产者使用异步提交
  • 调大生产者队列缓冲区:queue.buffering.max.messages
  • 使用多个生产者

数据量有多少(清洗前和清洗后)
答:
清洗:一天大概7千万笔日志、每天大概100G、平均每条消息大概1k~2k、每个月大概3T~4T。
清洗后:大概差不多(忘记了)
服务器有多少台
答:50台(含虚拟机)
集群的内存,cpu有多大
答:物理机128G、20cpu、40线程、10t硬盘
spark为什么快
答:map之间的转换不落盘
flink和spark哪个快,为什么
答:flink没用过不清楚
推荐中用到了哪些算法
答:没用过,只有了解过,比如聚类、回归等
余弦相似度在项目中是用来做什么的
答:没接触过
说一些常用的算子
答:map、flatmap、fliter、coalese、repartition、reducebykey、aggregateByKey、CombineBykey
map算子和mappartitions的区别
答:map算子的函数应用于每条分区的记录,mappartitions的函数运用于每个分区
grouobykey和reducebykey的作用
答:都是聚合的作用,reducebyky在map端有预聚合,groupbykey没有预聚合
mr原理
答:

  • 两个阶段:map、reduce
  • map端:1. client端会产生分片信息文件、作业配置文件 2.根据不同的inputFormat进行任务的拆分,然后根据不同的recordreader读取文件记录,最后输出给map端 3.在shuffle write时,首先写缓冲区,缓冲区满后再溢写磁盘文件,溢写前先按分区排序,当溢出文件到达一定数量后,进行合并,再合并前再进行分区排序 4.再shuffle read阶段,reduce端再读取时也是先读到缓冲区,缓冲区满后也会溢写到磁盘文件,reduce端是一般读取再一般聚合,5.聚合完毕后,根据不同的outputformat输出文件。

我们在用sqoop传递数据时最终结果会比原数据量多十几条数据,怎么解决
答:

  • 在我的项目中,主要是字段出现了hive的行分割符,行被截断了,解决的办法是加入去除字段分割符的参数、或者替换掉字段的行分割符。—注:加上—hive-drop-import-delims
  • 使用了多个map到执行导入任务,有一种可能是拆分的key不是int或者是没有规则的,会导致多条导入。

所以解决办法有两个:
一是将 -m5 改成 -m1 直接不切分;
二是 —split-by制定另外的字段,换一个int型的或者有明确排序顺序的字段。
mr怎么进行二次排序
答:先分区排序,再按key排序
你对hbase的了解
答:hbase是一个可以进行海量数据存储的nosql,架构包含:hmaster、regionserver,zookeeper,hdfs。
hbase的rowkey是怎么设计的
答:

  • 遵守三个原则:1.长度原则 2.散列原则 3.唯一原则
  • 散列原则:1.使用随机数或者是散列值 2.有一些可以使用字符串反转 比如:跟时间有关的key

项目中什么数据存储在hbase中
答:结构化和半结构化数据,如:日志、kafka数据等。

遇到过数据倾斜吗,怎么解决
答:
两个思路:
避免shuffle,如:使用mapjoin。使用预聚合
增加reduce并行度,可以缓解数据倾斜
对于某些数据量比较大的key,可以想办法将key打散,比如:加前缀。
hive和spark的优化
答:
hive端:

  1. 资源最优化 将map和reduce程序内存调大、cpu调大
  2. 合理控制map和reduce并行度
  3. shuffle优化
  4. 数据倾斜优化
  5. map输出采用压缩
  6. sql任务并行度

spark端:

  1. 资源最优化,包括:nodemanager cpu和内存、executor内存和cpu、nodemanager对executor 内存和cpu上限的设置
  2. 合理控制reduce并行度
  3. 调大spark任务本地化等待时间
  4. 使用rdd缓存或checkpoint
  5. 使用广播变量
  6. 算子的优化:使用coalse、repartition进行重新分区,控制map端的任务数,使用mappartition、reducebykey,使用map端join。
  7. shuffle优化:调大shuffle write/read 的缓冲区、调大预写文件合并比例、调大reduce read失败重试次数和重试等待时间、调大reduce read连接等待时间。
  8. 数据倾斜优化
  9. jvm优化:开启并调大非堆内存

大数据开发工程师面试经验(北京) - 快手

| 猎头
面试过程:
面试官很年轻,来的有点迟到,大概迟到了10分钟吧,上来看了一眼简历,说了一句工作经验挺多的,都写了两页纸。然后让自我介绍。介绍完之后,问了一个数据结构题目,如何把一个List> 合并为List,中间不能new对象。
面试官问的面试题:
1、如何把一个List> 合并为List,中间不能new对象。并且可以根据index,找到具体的值。
我当时做法是,封装了一个对象,通过两层索引,去找对应的值。答案应该是错的,因为这一道题就让回去了,嫌弃的看了时间10:47,说了一句,一道题50分钟(他把自己迟到十分钟,我自己介绍,他了解简历的时间全加了进去,还差三分钟)这么久,今天结束了。看着挺不错的小伙子,做事真让人生气,

大数据开发工程师面试经验(上海) - 趣头条

| 社会招聘
面试过程:
拉钩推荐投递的,hr电话安排面试,第二天下午就电话面试,应该是大数据平台的部门,可能我面的不太好没有给二面还有不太想做平台想做数据分析开发所以没给二面。
面试官问的面试题:
1.自我介绍
2.kafka原理,如何持久化。
3.zookeeper如何为kafka工作
4.100G数据如何找前一百数据,堆排序,复杂度
5.java集合了解多少,HashMap 原理,hashcode怎么生成,线程安全么?何时不安全?
6.ArrayList 和LinkedList区别,查询和插入的复杂度,存储10个数据哪个大。
7.JVM内存模型讲解下,GC回收的是哪个,GC回收机制了解么,老年代,年轻代回收算法,
如何确定OOM问题在哪,怎么解决的。
蛮基础,我工作经验一年,天天写业务,所以回答不太好,面的是大数据平台要求对原理理解比较高。

目录 - 知乎分享

最近由于要准备面试就开始提早看些面试、笔试题。以下是自己总结的一些经常出现、有价值的试题,包含hadoop、hive、hbase、storm、spark等。答案仅供参考,如有错误,请指出。试题不定时更新。
hadoop相关试题
MapTask并行机度是由什么决定的?
由切片数量决定的。
MR是干什么的?
MR将用户编写的业务逻辑代码和自带的默认组件结合起来组成一个完整的分布式应用程序放到hadoop集群上运行。
MR的实例进程:
driver(mr的job提交客户端)
MRAppMaster
MapTask
ReduceTask
combiner和partition的作用:
combiner的意义就是对每一个maptask的输出进行局部汇总,以减小网络传输量
partition的默认实现是hashpartition,是map端将数据按照reduce个数取余,进行分区,不同的reduce来copy自己的数据。
partition的作用是将数据分到不同的reduce进行计算,加快计算效果。
什么是shuffle
map阶段处理的数据如何传递给reduce阶段,是mapreduce框架中最关键的一个流程,这个流程就叫shuffle;
shuffle: 洗牌、发牌——(核心机制:数据分区,排序,缓存);
具体来说:就是将maptask输出的处理结果数据,分发给reducetask,并在分发的过程中,对数据按key进行了分区和排序;
MR原理(详细解释参照:MR运行原理剖析):
InputFormat来读取数据,按行读取,返回KV值传到map方法中,
context.write方法将处理后数据输出到outputCollector中,
当outputCollector中的数据累计到一定数量后再将数据传到内存的环形缓冲区做处理,
当环形缓冲区中的数据累积到一定数量后再将数据通过Splier多次溢出到本地磁盘的多个文件中,期间会对各个溢出的数据进行分区、排序
然后对多个文件进行merge(归并排序)形成一个输出结果大文件
ruduceTask根据自己的分区号去各个mapTask机器上取输出结果文件
将得到的各个结果文件进行merge,然后进入reduce阶段,
context.write将最终结果输出到outPutformat上,进而输出到本地文件中。
举一个简单的例子说明mapreduce是怎么来运行的 ?
什么是yarn?
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而mapreduce等运算程序则相当于运行于操作系统之上的应用程序。
namenode的safemode是怎么回事?如何才能退出safemode?
namenode在刚启动的时候元数据只有文件块信息,没有文件所在datanode的信息,需要datanode自己向namenode汇报。如果namenode发现datanode汇报的文件块信息没有达到namenode内存中所有文件块的总阈值的一个百分比,namenode就会处于safemode。
只有达到这个阈值,namenode才会推出safemode。也可手动强制退出。
secondarynamenode的主要职责是什么?简述其工作机制
sn的主要职责是执行checkpoint操作
每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)
如果namenode宕机,datanode节点是否也会跟着挂掉?

一个datanode 宕机,怎么一个流程恢复?
Datanode宕机了后,如果是短暂的宕机,可以实现写好脚本监控,将它启动起来。如果是长时间宕机了,那么datanode上的数据应该已经被备份到其他机器了,
那这台datanode就是一台新的datanode了,删除他的所有数据文件和状态文件,重新启动
hadoop 的 namenode 宕机,怎么解决?
先分析宕机后的损失,宕机后直接导致client无法访问,内存中的元数据丢失,但是硬盘中的元数据应该还存在,如果只是节点挂了,
重启即可,如果是机器挂了,重启机器后看节点是否能重启,不能重启就要找到原因修复了。
但是最终的解决方案应该是在设计集群的初期就考虑到这个问题,做namenode的HA。
简述hadoop安装
改IP,修改Host文件;
装JDK配置环境变量;
装Hadoop配置环境变量;
修改hadoop的配置文件如core-site、marp-site、yarn-site、dfs-site等;
namenode进行格式化;
start-all;
请列出hadoop正常工作时要启动那些进程,并写出各自的作用。
namenode:管理集群并记录datanode的元数据,相应客户端的请求。
seconder namenode:对namenode一定范围内的数据做一份快照性备份。
datanode:存储数据。
jobTracker:管理客户端提交的任务,并将任务分配给TaskTracker。
TaskTracker:执行各个Task。
用mapreduce怎么处理数据倾斜问题?
数据倾斜:map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,
这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,
从而导致某几个节点迟迟运行不完,此称之为数据倾斜。
解决:自己实现partition类,用key和value相加取hash值。
Mapreduce 的 map 数量 和 reduce 数量 怎么确定 ,怎么配置?
map的数量有数据块决定,reduce数量随便配置。
hdfs的体系结构
hdfs有namenode、secondraynamenode、datanode组成。
namenode负责管理datanode和记录元数据
secondraynamenode负责合并日志
datanode负责存储数据
说下对hadoop 的一些理解,包括哪些组件
详谈hadoop的应用,包括的组件分为三类,分别说明hdfs,yarn,mapreduce。
一些传统的hadoop 问题,mapreduce 他就问shuffle 阶段,你怎么理解的
Shuffle意义在于将不同map处理后的数据进行合理分配,让reduce处理,从而产生了排序、分区。
NameNode 负责管理 metadata,client 端每次读写请求,它都会从磁盘中读取或则会写入 metadata信息并反馈client 端。(错误)
修改后分析:
NameNode 不需要从磁盘读取 metadata,所有数据都在内存中,硬盘上的只是序列化的结果,只有每次
namenode 启动的时候才会读取。
Hive相关试题
你的数据库是不是很大么,有没有分表,分区,你是怎么实现的
hive内部表和外部表的区别
内部表:加载数据到hive所在的hdfs目录,删除时,元数据和数据文件都删除
外部表:不加载数据到hive所在的hdfs目录,删除时,只删除表结构。
分桶的作用
最大的作用是提高join的效率。(1)获得更高的查询处理效率。(2)使取样(sampling)更高效。
Hive 你们用的是外部表还是内部表,有没有写过UDF。
UDF:
1、写对应的java代码自定义函数的逻辑
2、将代码打成jar包上传到hive
3、在hive创建临时函数与对应的class类相关联
4、在hive中调用临时函数。
Hbase相关试题
hbase的rowkey怎么创建好?列族怎么创建比较好?(重点)
hbase存储时,数据按照Row key的字典序(byte order)排序存储。设计key时,要充分利用排序存储这个特性,将经常一起读取的行存储放到一起。(位置相关性)
一个列族在数据底层是一个文件,所以将经常一起查询的列放到一个列族中,列族尽量少,减少文件的寻址时间。
Redis,传统数据库,hbase,hive 每个之间的区别?(问的非常细)
redis:分布式缓存,强调缓存,内存中数据
传统数据库:注重关系
hbase:列式数据库,无法做关系数据库的主外键,用于存储海量数据,底层基于hdfs
hive:数据仓库工具,底层是mapreduce。不是数据库,不能用来做用户的交互存储
hdfs 和 hbase 各自使用场景。
整理总结:
首先一点需要明白:Hbase 是基于 HDFS 来存储的。
HDFS:
1、一次性写入,多次读取。
2、保证数据的一致性。
3、主要是可以部署在许多廉价机器中,通过多副本提高可靠性,提供了容错和恢复机制。
Hbase:
1、瞬间写入量很大,数据库不好支撑或需要很高成本支撑的场景。
2、数据需要长久保存,且量会持久增长到比较大的场景
3、hbase 不适用与有 join,多级索引,表关系复杂的数据模型
4、大数据量 (100s TB 级数据) 且有快速随机访问的需求。
如:淘宝的交易历史记录。数据量巨大无容置疑,面向普通用户的请求必然要即时响应。
5、容量的优雅扩展
大数据的驱使,动态扩展系统容量的必须的。例如:webPage DB。
6、业务场景简单,不需要关系数据库中很多特性(例如交叉列、交叉表,事务,连接等等)
7、优化方面:合理设计 rowkey。因为 hbase 的查
Spark相关试题
你觉得spark 可以完全替代hadoop 么?
spark会替代mr,不会代替yarn和hdfs.
公司之后倾向用spark 开发,你会么(就用java代码去写)
会,spark使用scala开发的,在scala中可以随意使用jdk的类库,可以用java开发,但是最好用原生的scala开发,兼容性好,scala更灵活。
我为大家整理了部分大数据学习教程与大家共享,每个人可以根据自己的需要来选择,需要的小伙伴可以+下个人vx:xt加上aaa最后是01字母数字连起来就是了。

美团java面试 - 微信公众号

美团技术一面

1、自我介绍

说了很多遍了,很流畅捡重点介绍完。

2、问我数据结构算法好不好

挺好的(其实心还是有点虚,不过最近刷了很多题也只能壮着胆子充胖子了)

3、找到单链表的三等分点,如果单链表是有环的呢

用快慢指针,一个走一步,一个走三步。如果有环,先判断环在哪,找最后一个节点,然后用之前的无环的做法

4、讲一下项目的架构

我重点讲了MVC

5、说一下你熟悉的设计模式

我重点讲了单例、工厂方法、代理

5、有没有配置过服务器啥啥啥

这个我真不知道,都没听过呢,只能诚实说没有,毕竟都没法扯。

一面挺匆忙的,我估计面试官刚开完会还没吃饭呢。他说让我等,可能再找一个同事面我,可能就直接告诉我结果了。从一面面试官的声音和口吻,我判断他一定是个部门老大,问的设计偏多,后面hr告诉我他就是我要去的部门的老大。哈哈。

美团技术二面

跟一面比起来,二面面试官的声音听起来就像是搞技术开发的,果不其然,一个小时的纯技术电话面试!面的特别全面!

1、Spring:有没有用过Spring,Spring IOC、AOP机制与实现,Spring MVC

其实我挺不想被问到Spring的细节的,框架这些我都没有复习不太记得了。所以我对面试官说Spring里面的一些比较重要的机制我理解的还不错,然后我用一个实际的例子把我对IOC、AOP理解讲了一下,他听了说对,理解的不错(难得遇到一个边面试边能给反馈的面试官,好开心)

Spring MVC其实我用过,我就对面试官讲了我的项目中用到的Servlet,jsp和javabean实现的MVC,以及MVC各个模块职责以及每个模块是怎么联系到一起的,最后我补充了一句我想SpringMVC的思想其实跟这个是一样的(他说对的,嘿嘿有反馈真好)

2、多线程:怎么实现线程安全,各个实现方法有什么区别,volatile关键字的使用,可重入锁的理解,Synchronized是不是可重入锁

这里我就主要讲了Synchronized关键字,还有并发包下面的一些锁,以及各自的优缺点和区别。volatile关键字我主要从可见性、原子性和禁止JVM指令重排序三个方面讲的,再讲了一下我在多线程的单例模式double-check中用到volatile关键字禁止JVM指令重排优化。

3、集合:HashMap底层实现,怎么实现HashMap线程安全

我讲了一下HashMap底层是数组加单链表实现,Node内部类,add的过程,Hash冲突解决办法,扩容,三种集合视图。HashMap线程安全的实现方式主要讲了HashTable、ConcurrentHashMap以及Collections中的静态方法SynchronizedMap可以对HashMap进行封装。以及这三种方式的区别,效率表现。

Hashtable: key和value不能为null,在读写时使用sychronized锁住整个map,效率比ConcurrentHashMap低。
ConcurrentHashMap: 把map分成N段(默认是16段),读不加锁(使用valotiel修饰),写操作只对相应的段加锁,比hashtable要高效。
SychronizedMap: key和value可以为null,读写时使用sychronized锁住整个map,效率比ConcurrentHashMap低。
4、JVM内存管理,GC算法,HotSpot里面的垃圾回收器、类加载

JVM内存主要分为五个区,哪些是线程共享的,哪些是线程独享的,每个区存放什么。GC方面:怎么判断哪些对象需要被GC,GC的方法,Minor GC与Full GC。HotSpot GC算法以及7种垃圾回收期,主要讲了CMS和G1收集器。类加载:类加载的过程,Bootstrap classloader-ExtClassloader-AppClassloader,父类委托机制

5、进程和线程的区别

从调度、并发性、拥有的资源和系统开销四个方面回答的。

6、HTTP有没有状态,我说无状态,怎么解决HTTP无状态 怎么解决HTTP无状态其实就是怎么进行会话跟踪,有四种方法:URL重写、隐藏表单域、Cookie、Session。

7、Java IO,NIO,Java中有没有实现异步IO

Java IO实现的是同步阻塞,它是怎么实现同步阻塞的。我拿了read()方法举例来讲的。NIO实现的是同步非阻塞,我详细讲了一下Selector中的select()方法轮询说明它是如何实现多路复用IO的。然后对比了一下他们的效率。面试官可能看我对这一块比较了解,又继续问我Java中有没有实现异步IO,我感觉好像没有,但面试官说有,让我想想,其实这里我并不清楚啦,所以我就对面试官讲了一下我对Unix中异步IO模型的理解,然后说至于Java里面有没有我真的不太清楚。(他居然笑了!说你理解是对的,Java里面有没有不重要!哈哈)
java io:java io是居于流的,只能往前读,不能前后移动。java io在读写时是阻塞线程的。
NIO:NIO是居于buffer的,可以前后移动。NIO 在读写时由一个线程处理所有读写请求,然后通过selector分发给相应的channel进行处理,是非阻塞的。

8、前端会不会,Ajax是什么,Ajax实现原理

前端我只是会用一些js而已,用过jquery框架,问我Ajax全称是啥,我猜是异步的js和xml。Ajax实现原理其实我也不懂,我就只简单讲了一下它通过XMLHttpRequest对象进行异步查询,Ajax引擎在客户端运行,减少了服务器工作量。

9、让我设计一个线程池

因为我简历中有写到我对多线程、并发这一块理解比较好。所以他老问这方面的题。这个问题因为我之前看过ThreadPoolExecutor的源代码,所以我就仿照那个类的设计思路来想的,详细讲了一下核心池、创建线程可以用工厂方法模式来进行设计、线程池状态、阻塞队列、拒绝策略这几个方面。设计的还算比较周全。

10、讲几个设计模式,哪些地方用到了,为什么要用

单例模式,jdk中的getRuntime();工厂方法模式,ThreadPoolExcutor用到ThreadFactory;观察者模式:java.util包下面的Observable和Observer。最后主要讲了一下工厂方法模式的使用场景。

11、Mysql优化、索引的实现

我从数据库设计优化和查询优化两方面讲的。索引B+树实现,InnoDB和MyISAM主键索引的实现区别,一个聚集一个非聚集。

12、事务的隔离级别

四种隔离级别,可能会出现哪些异常,mysql中默认级别。

13、有没有用过Hibernate、mybatis、git

这个简单讲一下就好,分别是干什么的

14、Linux

我说这个本科学过,但是很久没用,命令忘光了。他说没事,考你几个简单的:cd、ls、dir(真的是简单的)

15、算法题

1、从10万个数中找最小的10个,时间复杂度分析(最大堆,考虑内存)2、从一个有正有负数组中找连续子数组的最大和,时间复杂度分析(动态规划)3、满二叉树第i层有多少个节点,n层的满二叉树共有多少个节点

答:3. n层满二叉树有2^n-1个节点,第i层有2^(i-1)
—-补充—-
树的遍历顺序:

  1. 先序:先根节点、再左树、最后右树
  2. 中序:先左树、再根节点、最后右树
  3. 后序:先左树、再后树、最后根节点

终于到我提问环节了

1、你们是什么部门(他说是核心部门,大数据研发)

2、我对高并发和负载均衡挺有兴趣的,但是我平时在学校也没有这个环境让我在这方面有所体验,那你建议我目前可以怎么学呢(他说这确实是不太好学,只能看些理论和别人的博客,以后工作中才能慢慢学)

3、中间件具体是做什么的,是解决高并发和负载均衡吗(他说差不多是的,然后他说我们这个部门不是中间件,是大数据部门啊,我说恩我知道)

最后没啥问题了,他让我保持电话畅通。

这一面面完,口干舌燥,我一度怀疑他可能不知道我是在应聘实习生的岗位。有太多要总结的了,放在总结的地方一起讲吧。

美团技术三面

面试官说是他是另外一个部门的,需要进行交叉面试。

1、MySql优化

2、说下项目做了些什么,架构之类的

3、在collabedit上在线写代码,题目很简单是编程之美上的原题,一个有序的整数数组,输出两个数,使它们的和为某个给定的值。之前做过很快写好,然后给他讲思路。他继续问如果数组无序怎么办,先排序。

4、两个文件,每个文件中都有若干个url,找出两个文件中相同的url(用HashMap)

这一面挺简单的,只是增加之前面试没有过的在线写代码环节,collabedit后来我才了解,像facebook一些互联网公司远程面试都会用这个在线编辑器写代码,就是文本文档写,没有提示,不能编译运行,跟白板写一样。平时练练手就好。

美团技术HR四面

三面面试官说他那就是终面,说我过了等hr联系我。万万没想到半小时后的hr面居然也是技术。

1、自我介绍,都四面了还自我介绍?!我还以为是单纯的hr面,所以介绍的都是我的性格和生活方面的,结果并不是。

2、问项目,问的特别特别细,技术细节,还有遇到什么问题,怎么解决的,做项目有没有人带,怎么跟别人沟通的。

3、数据库优化,如果数据库一个表特别大怎么办 数据库优化我就讲了之前讲过很多遍的点,他问一个表特别大怎么办:大表分小表,怎么实现:使用分区表

4、问研究生的科研题目,为什么选这个题,看了一些什么论文(细到问我那些论文是发表在什么期刊上的,作者是哪所学校的),为什么要选这个算法,怎么优化的,实验结果怎么跟别人作对比的,为什么比别人的算法好(一个个问题不断砸过来,我猜我说的那些专业名词他应该不太懂,只是判断一下是不是我做的而已。。)

5、确定实习时间 这一面确实让我感到有压迫感,项目是本科做的,挺久了,一些技术细节上也没太总结,所以问细了我只能连想带编,嘿嘿。科研方面倒还好,上个学期都在弄这个,一些算法的实现和改进、对比都还记得比较清楚,回答的挺流畅的,可能这真的就是技术型的hr面吧。

SSM框架面试题 —微信公众号

1、如何理解Spring?
答:提供功能:1.ioc 2.aop 3.mvc
2、介绍一下Spring的事务管理
答:spring事务是指对于数据库一序列操作的提供原子性管理,提交时,要么全部成功,要么就回滚(全部失败)。
spring事务是由transationManager类负责,有两种编码方式:1. 手动提交和回滚 2. 注解事务
3 、Mybatis优缺点、使用场景?
答:与hibernate相比而言,学习成本低,mybatis直接写sql来操作数据库,不用而外的学习。还有一个是相比hibernate来说要灵活一点,对性能的控制相对要容易。缺点就是不能做到数据库无关性,这一点则恰好是hibernate的优点。一般mybatis用在互联网数据库中,因为互联网行业一般需求变更快。
4、MyBatis 中使用#和$书写占位符有什么区别?
答:使用#号会把传入的数据当成字符串,而且会加分号。而$将传入的值显示在sql中。$可能会导致sql注入,一般能用#号则尽量用。
5、解释一下 MyBatis 中命名空间(namespace)的作用。
答:mybatis的命名空间是为了解决sql id号冲突的。在mybatis中每个sql语句对应一个id,如果sql语句多了,有可能id冲突,加上命名空间后可以解决即使id号一样的情况。
6、什么是 IoC 和 DI?DI 是如何实现的?
答:IOC是控制反转的意思,是将对象的创建交给容器。DI是依赖注入,可以通过构造方法和属性字段来实现DI。
7、解释一下什么叫 AOP(面向切面编程)?
答:切面编程是通用功能模块化思想,底层是使用动态代理来实现,将一些通用的功能进行封装,提高功能代码复用性和简洁性。
8、你是如何理解”横切关注”这个概念的?
答:”横切关注”是会影响到整个应用程序的关注功能,它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。
9、你如何理解 AOP 中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念?
答:a. 连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后,方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就是连接点。Spring 仅支持方法的连接点。
b. 切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP 的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
c. 增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring 提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice 等。很多资料上将增强译为“通知”,这明显是个词不达意的翻译,让很多程序员困惑了许久。
说明:Advice 在国内的很多书面资料中都被翻译成”通知”,但是很显然这个翻译无法表达其本质,有少量的读物上将这个词翻译为”增强”,这个翻译是对 Advice 较为准确的诠释,我们通过 AOP 将横切关注功能加到原有的业务逻辑上,这就是对原有业务逻辑的一种增强,这种增强可以是前置增强、后置增 强、返回后增强、抛异常时增强和包围型增强。
d. 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态的未该业务类添加接口的实现逻辑,让业务类成为 这个接口的实现类。
e. 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP 有三种织入方式:
①编译期织入:需要特殊的 Java 编译期(例如 AspectJ 的 ajc);
②装载期织入:要求使用特殊的类加载器, 在装载类的时候对类进行增强;
③运行时织入:在运行时为目标类生成代理实现增强。Spring 采用了动 态代理的方式实现了运行时织入,而 AspectJ 采用了编译期织入和装载期织入的方式。
f. 切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。
10、Spring 支持的事务管理类型有哪些?你在项目中使用哪种方式?
答:Spring 支持编程式事务管理和声明式事务管理。许多 Spring 框架的用户选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。
11、Spring MVC的工作原理是怎样的?
答:
1)客户端的所有请求都交给前端控制器 DispatcherServlet 来处理,它会负责调用系统的其他模块来真正处理用户的请求。
(2) DispatcherServlet 收到请求后,将根据请求的信息(包括 URL、HTTP 协议方法、请求头、请求参数、Cookie 等)以及 HandlerMapping 的配置找到处理该请求的 Handler(任何一个对象都可以作为请求的 Handler)。
(3)在这个地方 Spring 会通过 HandlerAdapter 对该处理器进行封装。
(4)HandlerAdapter 是一个适配器,它用统一的接口对各种 Handler 中的方法进行调用。
(5)Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给 DispatcherServlet,
ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。
(6) ModelAndView 的视图是逻辑视图,DispatcherServlet 还要借助 ViewResolver 完成从逻辑视图到真实视图对象的解析工作。
(7)当得到真正的视图对象后,DispatcherServlet 会利用视图对象对模型数据进行渲染
(8)客户端得到响应,可能是一个普通的 HTML 页面,也可以是 XML 或 JSON 字符串,还可以是一张图片或者一个 PDF 文件。
12、什么是 XSS 攻击?
答:XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式。跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意 脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛、微博发布含有恶意脚本的 URL 就属于这种方式)和持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据 库中被加载到页面执行,QQ 邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台)。XSS 虽然不是什么新鲜玩意,但是攻击的手法却不断翻新,防范 XSS 主要有两方面:消毒(对危险字符进行转义)和HttpOnly (防范 XSS 攻击者窃取 Cookie 数据)。
13、SQL 注入攻击?

14、什么是CSRF攻击?
答:CSRF 攻击(Cross Site Request Forgery,跨站请求伪造)是攻击者通过跨站请求,以合法的用户身份进行非法操作(如转账或发帖等)。CSRF 的原理是利用浏览器的 Cookie 或服务器的Session,盗取用户身份,其原理如下图所示。防范 CSRF 的主要手段是识别请求者的身份,主要有以下几种方式:
(1) 在表单中添加令牌(token);
(2) 验证码;
(3) 检查请求头中的 Referer。
令牌和验证都具有一次消费性的特征,因此在原理上一致的,但是验证码是一种糟糕的用户体验,不是必要的情况下不要轻易使用验证码,目前很多网站的做法是如果在短时间内多次提交一个表单未获得成功后才要求提供验证码,这样会获得较好的用户体验。
15、简述Mybatis一级、二级缓存
答:1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
16、JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
答:
(1)数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
解决:在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
(2) Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。
(3) 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
解决:Mybatis自动将java对象映射至sql语句。
(4)对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。

MyBatis 面试题 —微信公众号

1、什么是 Mybatis?
答:(1)Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
(2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返回 result 的过程)。
2、Mybaits 的优点:
答:
(1)基 于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML标签,支持编写动态 SQL 语句,并可重用。
(2)与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
(3)很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要JDBC 支持的数据库 MyBatis 都支持)。
(4)能够与 Spring 很好的集成;
(5)提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
3、MyBatis 框架的缺点:
答:(1)SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL 语句的功底有一定要求。
(2)SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
4、MyBatis 框架适用场合:
答:(1)MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。
(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis 将是不错的选择。
5、MyBatis 与 Hibernate 有哪些不同?
答:(1)Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句。
(2)Mybatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套 sql 映射文件,工作量大。
(3)Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。
6、#{}和${}的区别是什么?
答:
#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。
7、当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第 1 种:通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

  1. <select id=”selectorder” parametertype=”int” resultetype=”me.gacl.domain.order”>
  2. select order_id id, order_no orderno ,order_price price form orders
  3. where order_id=#{id};
  4. </select>

第 2 种:通过来映射字段名和实体类属性名的一一对应的关系。

<select id="getOrder" parameterType="int"resultMap="orderresultmap">
select * from orders where order_id=#{id}
</select>
<resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
  <!–用 id 属性来映射主键字段–>
  <id property=”id” column=”order_id”>
    <!–用 result 属性来映射非主键字段,property 为实体类属性名,column
为数据表中的属性–>
  <result property = “orderno” column =”order_no”/>
  <result property=”price” column=”order_price” />
</reslutMap>

8、 模糊查询 like 语句该怎么写?
答:
第 1 种:在 Java 代码中添加 sql 通配符。
string wildcardname = “%smi%”;list names = mapper.selectlike(wildcardname);
第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入
string wildcardname = “smi”;list names = mapper.selectlike(wildcardname);

9、通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
答:Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的值;接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的参数,就是传递给 sql 的参数。
Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为 key 值,可唯一定位一个 MapperStatement。在 Mybatis 中,每一个