面试系列一:精选大数据面试真题10道(混合型)-附答案详细解析 (一)

简介: 精选大数据面试真题10道(混合型)-附答案详细解析

本公众号(五分钟学大数据)将推出大数据面试系列文章—五分钟小面试,此系列文章将会深入研究各大厂笔面试真题,并根据笔面试题扩展相关的知识点,助力大家都能够成功入职大厂!


1650976129(1).png


大数据笔面试系列文章分为两种类型:混合型(即一篇文章中会有多个框架的知识点—融会贯通);专项型(一篇文章针对某个框架进行深入解析—专项演练)。


此篇文章为系列文章的第一篇(混合型)


第一题:大数据笔试题-Java相关(美菜网)


写出下列程序的输出:


class Father{
    static {
        System.out.println("Static Father");
    }
    {
        System.out.println("Non-static Father");
    }
    public Father(){
        System.out.println("Constructor Father");
    }
}
public class Son extends Father{
    static {
        System.out.println("Static Son");
    }
    {
        System.out.println("Non-static Son");
    }
    public Son(){
        System.out.println("Constructor Son");
    }
    public static void main(String[] args) {
        System.out.println("First Son");
        new Son();
        System.out.println("Second Son");
        new Son();
    }
}


运行结果:


Static Father
Static Son
First Son
Non-static Father
Constructor Father
Non-static Son
Constructor Son
Second Son
Non-static Father
Constructor Father
Non-static Son
Constructor Son


分析:


这道程序题考察的是Java中的静态代码块、构造代码块、构造函数的概念。


  • 静态代码块 static {}


随着类的加载而执行,即JVM加载类后就执行,而且只执行一次,执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。


  • 非静态代码块,也称构造代码块 {}


执行的时候如果有静态代码块,先执行静态代码块再执行非静态代码块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态代码块会在构造函数执行时,在构造函数主体代码执行之前被运行。


  • 构造函数


对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数是不会运行的。


一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次。


再来看本题,程序运行,执行main()方法会先加载main()方法所在的类,加载 Son 类,但是 Son 类继承自 Father 类,所以先加载父类,同时父类的静态代码块执行,然后加载 Son 类本身,Son 类自己的静态代码块开始执行,类加载完成之后执行main()方法内部的语句,打印 First Son,然后 new Son(),在创建对象时先构造父类的对象,因为静态代码块只在类加载时执行一次,所以不再执行,然后执行父类的构造代码块,构造函数,构造代码块的优先级大于构造函数。然后在执行 Son 对象本身。完成之后打印 Second Son,接着又 new Son(),重复以上步骤。构造代码块和构造函数在每次new的时候都会执行一次。


第二题:大数据面试题-JVM相关(丰巢科技)


问:解释内存中的栈(stack)、堆(heap)和静态存储区的用法?


答:通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。


String str = new String(“hello”);


上面的语句中str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。


补充:较新版本的Java中使用了一项叫“逃逸分析“的技术,可以将一些局部对象放在栈上以提升对象的操作性能。(在 Java SE 6u23+ 开始支持,并默认设置为启用状态,可以不用额外加这个参数。)


第三题:大数据面试题-海量数据相关(腾讯)


问:给 40 亿个不重复的 unsigned int 的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那 40 亿个数当中?


答:方案 1:申请 512M 的内存,512M是42亿多 bit,一个 bit 位代表一个 unsigned int 值。读入 40 亿个数,设置相应的 bit 位,读入要查询的数,查看相应 bit 位是否为 1,为 1 表示存在,为 0 表示不存在。


方案 2:这个问题在《编程珠玑》里有很好的描述,大家可以参考下面的思路,探讨一下: 因为 2^32 为 42 亿多,所以给定一个数可能在,也可能不在其中; 这里我们把 40 亿个数中的每一个用 32 位的二进制来表示 ,假设这 40 亿个数开始放在一个文件中。

然后将这 40 亿个数分成两类:


  1. 最高位为 0
  2. 最高位为 1


并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20 亿,而另一个>=20 亿(相当于折半); 与要查找的数的最高位比较并接着进入相应的文件再查找


然后再把这个文件为又分成两类:


  1. 次最高位为 0
  2. 次最高位为 1


并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10 亿,而另一个>=10 亿(相当于折半); 与要查找的数的次最高位比较并接着进入相应的文件再查找。


.....


以此类推,就可以找到了,而且时间复杂度为 O(logn)。


第四题:大数据面试题-Hadoop相关(阿里)


问:MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?


答:


  1. 一个 MapReduce 作业由 Map 阶段和 Reduce 阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce 框架本质就是一个 Distributed Sort。


  1. 在 Map 阶段,Map Task 会在本地磁盘输出一个按照 key 排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在 Reduce 阶段,每个 Reduce Task 会对收到的数据排序(采用的是归并排序),这样,数据便按照 Key 分成了若干组,之后以组为单位交给 reduce 处理。


  1. 很多人的误解在 Map 阶段,如果不使用 Combiner 便不会排序,这是错误的,不管你用不用 Combiner,Map Task 均会对产生的数据排序(如果没有 Reduce Task,则不会排序,实际上 Map 阶段的排序就是为了减轻 Reduce端排序负载)。


  1. 由于这些排序是 MapReduce 自动完成的,用户无法控制,因此,在hadoop 1.x 中无法避免,也不可以关闭,但 hadoop2.x 是可以关闭的。


第五题:大数据面试题-Kafka相关(商汤科技)


问:kafka数据分区和消费者的关系,kafka的数据offset读取流程,kafka内部如何保证顺序


答:


  1. kafka数据分区和消费者的关系:1个partition只能被同组的⼀一个consumer消费,同组的consumer则起到均衡效果


  1. kafka的数据offset读取流程:


  • 连接ZK集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息
  • 连接到对应Leader对应的broker
  • consumer将⾃自⼰己保存的offset发送给Leader
  • Leader根据offset等信息定位到segment(索引⽂文件和⽇日志⽂文件)
  • 根据索引⽂文件中的内容,定位到⽇日志⽂文件中该偏移量量对应的开始位置读取相应⻓长度的数据并返回给consumer


 3.kafka内部如何保证顺序:kafka只能保证partition内是有序的,但是partition间的有  序是没办法的。爱奇艺的搜索架构,是从业务上把需要有序的打到同一个partition。

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
7月前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
9月前
|
存储 安全 测试技术
Python面试题精选及解析
本文详解Python面试中的六大道经典问题,涵盖列表与元组区别、深浅拷贝、`__new__`与`__init__`、GIL影响、协程原理及可变与不可变类型,助你提升逻辑思维与问题解决能力,全面备战Python技术面试。
547 1
|
10月前
|
存储 分布式计算 Hadoop
Hadoop框架解析:大数据处理的核心技术
组件是对数据和方法的封装,从用户角度看是实现特定功能的独立黑盒子,能够有效完成任务。组件,也常被称作封装体,是对数据和方法的简洁封装形式。从用户的角度来看,它就像是一个实现了特定功能的黑盒子,具备输入和输出接口,能够独立完成某些任务。
|
7月前
|
监控 Java 关系型数据库
面试性能测试总被刷?学员真实遇到的高频问题全解析!
面试常被性能测试题难住?其实考的不是工具,而是分析思维。从脚本编写到瓶颈定位,企业更看重系统理解与实战能力。本文拆解高频面试题,揭示背后考察逻辑,并通过真实项目训练,帮你构建性能测试完整知识体系,实现从“会操作”到“能解决问题”的跨越。
|
11月前
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
6101 50
|
10月前
|
人工智能 分布式计算 DataWorks
多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望
阿里云ODPS技术栈通过MaxCompute、Object Table与MaxFrame等核心组件,实现了多模态数据的高效处理与智能分析。该架构支持结构化与非结构化数据的统一管理,并深度融合AI能力,显著降低了分布式计算门槛,推动企业数字化转型。未来,其在智慧城市、数字医疗、智能制造等领域具有广泛应用前景。
812 6
多模态数据处理新趋势:阿里云ODPS技术栈深度解析与未来展望
|
11月前
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
944 9
|
11月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
618 6
|
11月前
|
缓存 算法 NoSQL
校招 Java 面试高频常见知识点深度解析与实战案例详细分享
《2025校招Java面试核心指南》总结了Java技术栈的最新考点,涵盖基础语法、并发编程和云原生技术三大维度: 现代Java特性:重点解析Java 17密封类、Record类型及响应式Stream API,通过电商案例演示函数式数据处理 并发革命:对比传统线程池与Java 21虚拟线程,详解Reactor模式在秒杀系统中的应用及背压机制 云原生实践:提供Spring Boot容器化部署方案,分析Spring WebFlux响应式编程和Redis Cluster缓存策略。
334 0
|
11月前
|
存储 Java 数据库
应届生面试高频 Java 基础问题及详细答案解析
摘要: Java数据类型分为基本类型(如int、float等)和引用类型(如类、数组)。final可修饰类、方法和变量,使其不可继承、重写或修改。static用于类级别的变量和方法,共享于所有实例。&quot;==&quot;比较基本类型的值或引用类型的地址,而equals比较对象内容(需重写)。Java只有值传递,对于引用类型传递的是地址副本。String对象不可变,拼接操作会创建新对象而非修改原对象。Java 10的var支持类型推断,Java 16的Record提供不可变类简化。
258 0

热门文章

最新文章

推荐镜像

更多
  • DNS