超全面的大数据面试题,一道比一道难,快来挑战一下吧
发布日期:2021-06-30 11:29:11 浏览次数:2 分类:技术文章

本文共 10804 字,大约阅读时间需要 36 分钟。

【过往记忆大数据】已开通技术交流及招聘求职内推群,加微信号fangzhen0219 为好友后入群。

本文全文篇幅1万字左右,从数据结构到Java再到大数据都有整理,可以先收藏起来,查漏补缺。

Java基础

1、Queue和Stack你平时有用过么,说说你常用的方法,他们的区别在哪呢?

2、了解java的异常吗,有什么区别,常见的异常有哪些呢?

3、  两个字面值相同的Integer,它们两个用等于号去比较,结果是true还是false?(这个题要分两部分去回答,结果可能为true,也可能为false。因为有缓存)

4、可以讲一下你常用的集合类么?他们的实现类有哪些?

5、 ArrayList、LinkedList的区别,底层的实现呢了解吗,有没有什么优缺点,分别适合于什么样的场景,多线程环境下,有没有安全的list的实现类呢?

6、 其他数据结构的了解吗?LinkedHashMap、ConcurrentSkipHashMap(作为一个扩展,面试的时候问到的不是很多,能答出来挺好,答不出来也没关系)

7、 说一说你对HashSet的理解,越详细越好 ( tip:底层是用hashMap实现的),treeSet有了解吗?聊一聊?

8、HashMap的疯狂试探:

    a.  HashMap的底层数据结构是什么样子的

    b.  了解hash冲突吗?它是如何解决hash冲突的

    c.  请你简单叙述一下hashMap的put和get操作,当然,能说多细就说多细?

    d.  Jdk7和jdk8中对hashMap做了什么改进嘛(红黑树)?

    e.  有没有其他的解决冲突的办法呢

    f.  HashMap中的hash函数了解吗?那他的扩容机制了解吗?

    g.  HashMap为什么扩容是2倍呢,可以说说嘛?

    h.  假如说我加入一个键值对,这个时候出现了冲突,它只怎么把这个节点加入进去?是加入到当前bucket所对应的链表的头结点还是尾节点?(答不上来可以问一个稍微简单的,equals和 == 的区别,以及其中hashCode的作用)

    i.  可以说说什么条件下,可以把一个链表转成红黑树呢?它里面的大概流程是什么,了解吗?

    j.  有没有想过为什么选用了红黑树,而不是其他的数据结构,譬如说二叉树,二叉查找树,或者其他的树?

    k.  在高并发大流量的情况下,hashMap有什么问题吗,会不会造成cpu达到100%?如果会,那是在哪一步可能会出现这个问题呢(插入、删除、查找、扩容)?

9、ConcurrentHashMap的疯狂试探:

    a.  他和HashTable的区别呢?

    b.  说说你对JUC包的了解?

    c.  ConcurrentHashMap中是怎么加锁的?

    d.  1.7和1.8中,ConcurrentHashMap的区别是什么?

    e.  ConcurrentHashMap是怎么做到线程安全的呢?(CAS和锁)

    f.  为什么会抛弃分段锁,它有什么毛病吗(上面一个题回答上才可以问这个)?

    g.  知道红黑树的transfer过程么?简单的描述一下

10、多线程下的疯狂试探:

    a.  多线程了解吗?说说线程的生命周期?

    b.  线程池有用到过吗?怎么用的,jdk有提供那些线程池(总共提供了四种)?

    c.  线程的状态有哪些呢?

    d.  线程池的核心参数有哪些?(核心线程数、最大线程数、时间、时间单位、队列、拒绝策略、默认的线程工厂)

    e.   Wait,yeild,stop,sleep、join、start、run的区别和如何使用?

    f.   接着上题:这四种有什么区别吗,你用过哪一种,可能存在什么问题吗?

    g.  接上题:拒绝策略有哪些呢?了解吗?聊聊?

    h.  接上题:你刚才说了队列,线程池中的队列有哪些?有界队列、无界队列、同步队列都有了解吗?聊聊?

    i.  如何实现一个消费者和生产者的循环消费和生产呢?(有两种方式,一种是通过锁,lock或者Synchronize,还有一个是通过ArrayBlockingQueue实现)

    j.  你可以实现线程之间的相互通信吗?如何实现?要不写一个?

11、 线程安全的疯狂试探:

    a.  Synchronzie了解吗?谈谈你的理解

    b.  在一个普通方法上加synchronize和在一个静态方法上加synchronize有什么区别(对象锁和类锁的的区别)?

    c.   Synchronize和lock有什么区别呢?说说你对lock的理解?

    d.   Lock的公平和非公平锁?

    e.   说一说volitaile为什么保证不了原子性,可以保证可见性嘛?如何保证的(jvm的多线程的内存模型有关系)

    f.   了解CountDownLatch么,CyclicBarrier的区别呢?

    g.  Synchronize的实现原理知道吗?moniter的实现机制呢,为什么加了Synchronzie关键字,就可以在多线程下是安全的(这个回答要从java对象的Object头来回答)

    h.  类锁和对象锁的区别呢?字节码的体现呢?

    i.  Java中的自旋锁、偏向锁、读写锁、重锁等了解吗?

    j.   了解java重对象的对象头嘛?有哪些属性和字段呢?

    k.   Aqs(AbstractQueuedSynchronizer)了解吗?它和lock的关系?说说aqs中的核心思想?

    l.    Lock中存在锁升级嘛,他是可重入得嘛,那Synchronize是可重入得嘛,有没有锁升级的概念?

    m.   Volitaile了解吗?他的作用是什么呢,内存语义是什么呢?有没有了解过cpu的缓存一致性协议?

    n.   还知道其他的juc类嘛,有哪些呢(譬如lockSupport)?

12、 jvm的疯狂试探:

    a.   了解jvm么?jvm的内存模型?

    b.   Java如何判断一个对象是否还活着呢?

    c.  Java的类加载了解吗? 

    d.  Java类加载器了解吗,有哪些呢?那它的双亲委派了解吗?

    e.   Jvm指令你知道哪些(jps,jstack,jinfo,jmap……),都有什么作用呢?

    f.   Java的垃圾回收算呢,了解吗,G1回收算法了解吗?

    g.  Jvm参数你了解吗,知道多少说多少?

    h.    在实战中有进行过jvm调优嘛,怎么做的,

    i.    Java的对象年龄知道吗,有什么作用吗?

    j.    Young GC和fullGC了解吗,如何触发,如果在你的项目中,频繁出现young GC 怎么办?

13、设计模式的疯狂试探:

    a.    你了解的设计模式有哪些?

    b.   可以写一个单例模式嘛,工厂模式呢,抽象工程模式解决了什么问题?

    c.   策略模式、责任链模式、适配器模式写一个,写不出来的话,java中在哪用到了这些模式

    d.   代理模式了解吗,会写吗,jdk代理和cglib代理的区别呢,说说你的理解? 

数据结构与算法

1、排序算法了解什么?能不能手写一个快速排序、或者归并排序,堆排序有了解吗?

2、给你一个一元二次方程公式,你写一个方法,用计算机语言实现它。

3、图了解么,有向图呢?你可以实现一个有向图么?(假如他回答的是二维矩阵,可以反问他有没有更好的解决方案呢,因为这个图可能是个稀疏矩阵)

4、接上题,在图中,如何判断两个节点的联通性,可以写代码写出来么?

5、给你一个1T的Int文件,然后你只有一台内存是8G的机器,如何用最快的方法,求出里面出现频率最高的topN个数?

6、算法的时间复杂度和空间复杂度了解吗?说说你了解的算法的时间复杂度和空间复杂度。

7、 二叉树了解吗,树的广度优先算法和宽度优先算法了解吗?写一个他的前序(中序、后序)遍历可以么(递归和非递归的方式都可以写出来么)?

8、给你一个字符串,请检查中间出现的括号的正确性,譬如:({[]}),((()))这都是个合法的字符串,(()())((()这就不是一个合法的字符串;

9、给你一个单向链表,检测它有没有形成环?

10、给你一个单向链表,如何反转,可不可以把空间复杂度降低到O(1)级别?

11、写一个字符串匹配算法,判断在一个字符串中是否包含另外一个字符串(一般都会说循环去比较,这样的时间复杂度很高,有一个算法是KMP,面试者要是能提到KMP都就很不错了,因为很多面试官都不知道,也不会)?

12、可以用两个栈模拟一个队列么?

13、如何判断两棵树相不相等

14、 动态规划有了解吗?

    a.   给你一个机器人,它每次只能向右或者向下走一步,其中,中间有一个障碍物,不可以经过,请问,在一个n*m的矩阵中,这个机器人总共有多少种走的方法?(答不出来就降低一下难度,把中间的那个障碍物去掉)

    b.   青蛙跳知道吗?给你一个数组,里面的每一个数字代表青蛙可以前进的最大的步数,如何判断这个青蛙可不可以达到终点;譬如2,3,4,1就可以,1,2,1,0,1就不可以;

    c.   爬楼梯,假设有一个n阶的楼梯,你每次都只能爬1或者2个台阶,请问有多少种不同的方法可以爬上去呢?

    d.   给你一个整数数组,找到一个具有最大和的连续子数组(子数组至少包含一个元素),返回最大值

    e.   给你一个容量为V的背包,现在有N件商品(有重复,相同的商品可以随意取),每件商品的体积是v1,价值是w1,请问,这个背包所能容纳的最大价值是多少?

    f.    一个100层高的楼,有两颗鸡蛋,你需要用最少的次数找到那个临界点,这个临界点以上的楼层上摔下去,鸡蛋都会碎掉,以下的楼层,鸡蛋是不会碎的,(扩展,加入现在是N层高的楼房,你现在有m个鸡蛋,m>=1,用最少的次数找到那个临界点)

数据库大汇总

1、用过mysql嘛?了解吗?

2、Mysql事务了解吗,隔离级别呢,每种隔离级别会出现什么问题?

3、Mysql的锁了解吗(表锁、行锁、间隙锁,读写锁)?

4、Mysql引擎知道吗,innodb和myisam的区别知道吗,说说底层的实现?

5、聚簇索引和非聚簇索引知道么,有什么区别?

6、B+树知道吗?为什么使用B+树?

7、分库分表做过吗,如果让你去实现分库分表,你有什么需要考虑或者注意的嘛?

8、了解死锁嘛?知道他是怎么产生的嘛,如何避免呢?

9、Sql优化了解过吗?说说你的理解,给你一条sql,你会怎么优化?

框架

1、redis大家庭:

    a.  redis是什么,能干嘛,怎么用?

    b.  Redis的基础数据类型有哪些?

    c.  Reids除了这些,还有哪些数据结构,能解决什么问题?

    d.  Redis集群有搭建过么,说说你的实现

    e.  Redis如何实现分布式锁    

    f.  Redis的支持事务么?

    g. 位图了解吗?

    h. 布隆过滤器了解吗,他的原理是什么呢?

    i.  Redis的通信协议你知道嘛?

    j.  Redis中的数据结构底层了解吗?string的编码、list的编码、zset的编码;

    k. 在集群环境下,Redis的分布式锁一定可靠吗,redis社区有没有提供可靠地分布式锁的集群方案(有,红锁)?

    l. Redis的持久化你知道么,说说rdb和aof的区别

    m.  Aof瘦身知道么?如何瘦身

    n.  Redis的拒绝策略你知道么?那它的淘汰策略你知道么

    o.  Redis的哨兵模式呢,了解吗?

    p.  Zookeeper了解吗,用zookeeper实现分布式锁,和redis实现有什么不同呢,说说他们的原理?

2、Spring大家庭:

    a. Autowire和Resource 的区别

    b. 谈谈你对spring的理解,它干了什么?

    c. Spring的依赖注入和切面呢?

    d. Spring的事务了解吗,他的传播机制呢

    e.  Spring的aop切面详细说说,你的应用场景呢?

    f.  Springmvc用过吗?了解他的启动流程嘛?说说你的看法

    g.  Spring中的bean的生命周期呢,了解吗?如何扩展一个bean的生命周期?

    h.  Spring源码读过吗?有没有想过他是如何解析在xml中定义的bean的。

    i.  在spring的配置文件中加入component-scan标签,它就可以自动加载所有添加相应注解的java类,这个是怎么做到的呢,你知道嘛?

    j.  Dubbo了解吗?dubbo是怎么和spring想结合的?

3、消息中间件大家庭:

    a.  你了解消息中间件有哪些?

    b.  谈谈你对topic和partition的理解?

    c.  Kafka中的isr和osr有了解吗?

    d.  Kafka的高水位你知道嘛?

    e.  Kafka的分区器、拦截器、序列化器你了解吗?

    f.  消息的可靠性怎么保证?

    g.  消息丢失怎么办?kafka有什么保证策略?(我了解kafka,你们也可以问问其他的,譬如rocketMq)

    h.  Kafka的事务你了解过吗(这个特别难,一般别问昂)?

4、zookeeper大家庭:

    a.  谈谈你对zookeeper的理解?

    b.  Zookeeper的节点类型你知道么?

    c.  Zookeeper的心跳机制呢?

    d.  Zookeeper的优势在哪?

    e.  知道zookeeper的watch嘛?

    f.   Cap理论知道吗?

    g.  Paxos算法呢,了解吗?

5、springBoot大家庭:

    a.  什么是springboot?

    b.  为什么要用springboot呢?

    c.  Spring boot 的核心配置文件有哪几个?他们的区别是什么?

    d.  Spring boot 的配置文件有哪几种格式?区别?

    e.  Spring boot的核心注解是那个?它主要由哪几个注解组成的?

    f.   如何理解springboot的配置加载顺序?

离线方向

1.  数据优化中,需要注意哪些关键词

2.  Uninon 跟uninon all 的区别

3.  除了distinct外如何使用SQL对数据去重

4.  项目中etl过程

5.  Spark的运行流程

6.  Sql开窗函数,开窗函数中row_number与rank的区别

7.   Avg、sum、count 函数,在某列有空值的情况下,结果会有哪些不同

8.   一个表两个字段,一个id,一个values;values有连续相同;但是有缺失,找出缺失的地方补全(连续缺失的字段如何补全)

9.  数据仓库的基本原理

10. 数据表的各个模型,例如(雪花模型),简述

11. 数据优化中除了用过mapjoin之外,还用过哪些join(不是常见的五种),简述

12. 修改批量文件中的词

13. Shell脚本的定时任务

 

1.英语自我介绍,说一下遇到的最大的挑战

2.union和union all的区别

3.给了个题目,一个表两个字段,一个是id,一个是value,value是连续相同的,但是有缺失的,找出来缺失的地方补全

4.去重的操作

5.spark提交任务的流程

6.Spark oom怎么处理

7.join有哪些?mapsidejoin是什么知道吗(不知道,大概猜了下,然后就没继续问)

8.Linux指令用过哪些?

9.用shell直接查找到文件中的一个词,然后替换(这个不会)

10.Data modeler用过没

11.维度建模什么情况

 

1.用英语介绍下数据仓库和数据集市的区别

2.讲下 linux 免密登陆

3.介绍下spark执行流程

4.spl 开窗函数

5.shell 脚本读取文件

6.项目中最自豪的事情

7.数据库中count(*) 和count(1) 在什么情况下数据不一致

8.最有压力的事情

9.shell 脚本替换文件内容,替换文本

10.数据倾斜调优

 

1.英语介绍一下olap和oltp的区别

2.olap的产品知道哪些

3.数仓模型建设

4.对表的设计

5.data modeler工具

6.项目中的etl过程

7.统计人员使用什么工具查询

8.数据报表工具知道哪些

9.工作主要涉及的技术有哪些

10.每日数据量多少,存量多少

11.如何通过sparksql对数据进行更新

12.hbase数据如何更新

13.两表join跑不出数据会是什么原因,如何解决

14.如何进行mapjoin

15.开窗函数

16.linux命令考查

17.hdfs上跨节点如何数据迁移

18.免密登录如何实现

19.ip映射是记录在哪个文件中

20.如何批量修改文件中某一字符串

21.如何确保项目成功交付

22.项目交付时如何进行数据验证

23.项目中最有成就感的事情

Spark相关

Q: Spark任务提交后的流程

A: 只要能说出来sparkContext, DAG, Stage, Executor 就大致上应该了解些。

详细答案参考:

1)构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;

(2)资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;

(3)SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task

(4)Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。

(5)Task在Executor上运行,运行完毕释放所有资源。

 

Q: Spark的API有哪两大类?分别解释一下和举个例子?

A: Transformation & Action.Transformations是转换操作,如map, filter, union, reduceByKey等,Actions是执行操作,如count, collect, reduce, saveAsXXX等

 

Q: Spark中的union属于宽依赖还是窄依赖? 有无shuffle?

A:  属于窄依赖,无shuffle

 

SQL: 

Q: union all 和 union 有什么区别?哪个性能好?

A: union all 不去重, union会去重。Union all性能好,因为无需额外去重

 

Q: 如何判断一张表里某个字段有重复?

A:  利用COUNT 加HAVING ,答到这个的一般没问题, 具体如下:

     SELECT COL, COUNT(1) AS CNT FROM TABLEGROUP BY 1 HAVING CNT > 1

 

Q: 有一张表有两个字段,分别是商品ID和商品价格,如何取到商品价格是前10名的所有商品ID?

A:  如果只能想到ORDER BY + LIMIT的,说明SQL较弱。知道用窗口函数(PARTITION BY)的话,至少说明应该不止做过简单的SELECT * FROMTABLE,但想到用row_number()的话。。不行, 如果会问价格是否有重复的话,说明对问题考虑得算周全,因为价格通常都会重复,ID是一般唯一的,如果知道rank() , dense_rank()的话基本就没问题了。当然也有不用partition by 的方式,但步骤较多

 

数仓:

Q:  数据仓库一般的分层有哪些

A:  不同公司叫法不同,但是可以让他解释每层分别放什么样的数据, 下面是网上抄的,大同小异,知道基本概念就行

ODS:Operation Data Store

原始数据

DWD(数据清洗/DWI) data warehouse detail

数据明细详情,去除空值,脏数据,超过极限范围的

明细解析

具体表

DWS(宽表-用户行为,轻度聚合) data warehouseservice ----->有多少个宽表?多少个字段

服务层--留存-转化-GMV-复购率-日活

点赞、评论、收藏;

轻度聚合对DWD

ADS(APP/DAL/DF)-出报表结果 Application Data Store

做分析处理同步到RDS数据库里边

 

Q:  维度表和事实表分别是什么?举些例子?

A:  简单解释:

事实表就是交易表。

维度表就是基础表。

二者的区别:

维度表的冗余很大,主要是因为维度一般不大(相对于事实表来说的),而维度表的冗余可以使事实表节省很多空间。

事实表一般都很大,如果以普通方式查询的话,得到结果一般发的时间都不是我们可以接受的。所以它一般要进行一些特殊处理。如SQL Server 2005就会对事实表进行如预生成处理等。

事实表一般是没有主键的,数据的质量完全由业务系统来把握。

SQL相关

distributeby 、sort by 、cluster by 、order by 区别?

1). order by 只有一个reduce负责对所有的数据进行排序,若大数据量,则需要较长的时间。建议在小的数据集中使用order by 进行排序。

2). order by 可以通过设置hive.mapred.mode参数控制执行方式,若选择strict,则order by 则需要指定limit(若有分区还有指定哪个分区);若为nostrict,则与关系型数据库差不多。

3). sort by 基本上不受hive.mapred.mode影响,可以通过mapred.reduce.task 指定reduce个数,查询后的数据被分发到相关的reduce中。

4). sort by 的数据在进入reduce前就完成排序,如果要使用sort by 是行排序,并且设置map.reduce.tasks>1,则sort by 才能保证每个reducer输出有序,不能保证全局数据有序。

5). distributeby 采集hash算法,在map端将查询的结果中hash值相同的结果分发到对应的reduce文件中。

6). distributeby 可以使用length方法会根据string类型的长度划分到不同的reduce中,最终输出到不同的文件中。length 是内建函数,也可以指定其他的函数或这使用自定义函数。

7). cluster by 除了distribute by 的功能外,还会对该字段进行排序,但是排序只能是升序排序,不能指定排序规则为ASC或者DESC,所以cluster by = distribute by +sort by 。

 

请简述以下sql 的 执行顺序是什么?

select

    catid,

    count(orderid) as sales

from t_tab

where catid <> "c666"

group by  catid

having count(orderid) > 10

order by count(orderid) desc

limit 100

 

 

答:

from -> where -> group by ->having -> select -> order by -> limit

 

问:(1)两条语句的执行结果是否一样?为什么?

   (2)假设,数据量很大的情况下,您会选择哪种语句执行?也可以自行开发

 

--sql 语句 1

select

 t1.id,t1.xxx,t2.xxx

from t1 left join t2

on t1.id = t2.id and t1.id < 10

 

--sql 语句 2

select

   t1.id,t1.xxx,t2.xxx

from t1 left join t2

on t1.id = t2.id

where t1.id < 10

  

答:1)由于left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。

      sql 语句 1  中 采用的是left join,所以 on 里的 t1.id <10  对左表 t1 不起作用,结果还是会返回t1 表的所有数据          

       sql 2 则是先 通过 on 上的条件,将两表关联,在最终关联好的表上,在进行过滤,所以只会返回t1.id < 10 的所有数据

    2) 当数据量很大的情况下,基于上述情况我会选择 sql 2 ,但是性能不高,可以采用以下查询

           select

             tmp_t1.id,tmp_t1.xxx,t2.xxx

           from

           (

              select * from t1 where t1.id < 10

           ) tmp_t1 left join t2

           on tmp_t1.id = t2.id 

count(distinct user_id) 和 group by user_id 之后 求 count  两者有什么区别?

  首先要清楚,count(distinct) 的原理机制,首先他是将数据通过map端发往一个reduce,之后reduce接收到数据之后,会将数据放入到 hashset中去重,之后cleanUp() 方法,在执行最后的逻辑,比如:计算hashset的size等。

这里就出现了一些问题,

1)数据都发往一个reduce会造成数据倾斜,

2)程序从分布式变成单机程序,影响效率

3)程序执行过程中,只产生一个job

但也不是绝对的,当数据量很小的时候,此时我们并不需要采分布式执行,一个job运行足矣,但是,当数据量比较大的时候,这时count(distinct) 就暴露除了大大的弊端,所以,此时,不应该采用此法来实现去重

group() by  count()  当数据量比较大的时候,采用此法,先分组,这时已经在map端实现了去重机制,之后数据发往reduce 数据量已经变得很小了,并且此法涉及到shuffle ,所以reduce的压力不会集中在某个上,并且会产生多个job。

1.1 group() by  count()  一定比count(distinct) 性能要好吗?

不一定,当数据量比较大的时候采用group() by  count() 会比count(distinct) 要好,但是在数据量比较小的时候,一个job就可以处理,没必要用两个job,也没必要shuffle,所以调优看情况而定。

作者丨无精疯来源丨大数据肌肉猿过往记忆大数据欢迎大数据开发人员投稿,投稿请联系微信:fangzhen0219

【过往记忆大数据】已开通技术交流及招聘求职内推群,加微信号fangzhen0219 为好友后入群。

转载地址:https://iteblog.blog.csdn.net/article/details/108114460 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:请把这3个京东真实AI项目写到简历上!
下一篇:数据中台:浅析数据湖和数据中台的关系

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月09日 09时38分16秒