本篇博客将收集总结一些,本博主面试
大数据开发工程师 岗位遇到的面试题,虽然不一定高频,但是也算经验之谈,希望对各位有所帮助。
1.什么是Spark RDD
RDD:弹性分布式数据集 (Resilient Distributed DataSet)。
Spark 中最基本的数据抽象是 RDD。
创建RDD方法两种: 1.Driver并行化现有的Scala集合 2.引用外部存储系统
2.Spark算子有哪些
转换算子:map、filter、flatMap、mapPartition、mapPartitionwithIndex、coalesce、repartition、union、join、 cogroup、reduceByKey、aggregateByKey(部分即可)
动作算子:reduce、collect 、first、take 、aggregate、countByKey、foreach(部分即可)
所有的转换算子都是lazy执行的,只有在动作算子触发的时候任务才会被提交,这个时候转换算子才 会真正去执行。转换算子的返回值是RDD、而动作算子的返回值可以是Unit、Array,一个任务中只 能有一个动作算子,但是允许有多个转换算子。
3.Spark 有几种部署方式
①.Local: 运行在一台机器上,通常是练手或者测试环境。
②.Standalone:构建一个基于Mster+Slaves的资源调度集群,Spark任务提交给Master运行。是Spark自身的一个调度系统。
③.Yarn: Spark客户端直接连接Yarn,不需要额外构建Spark集群。有yarn-client和yarn-cluster两种模式,主要区别在于:Driver程序的运行节点。
④.Mesos:国内大环境比较少用。
4.什么是kafka 架构
kafka: 开源的流处理平台,该平台提供了消息的订阅与发布的消息队列,一般用作系统间解耦、异步通信、削峰填谷等作用。
5.hive出现reduce端OOM,怎么检查问题
这种情况一般是数据倾斜
造成的,这时去查找聚合算子,修改该算子。
数据倾斜只会发生在shuffle过程中。这里给大家罗列一些常用的并且可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时,可能就是你的代码中使用了这些算子中的某一个所导致的。
6.什么是Hbase
HBase 是一个基于Hadoop的分布式,可扩展,巨大数据仓库.
7.Hbase的Rowkey设计原则
①.固定格式
②.不可使用随机的 UUID
③.将查询的数据作为rowKey的组成部分
8.规避Hbase热点写问题
①.Rowkey设计为Hash、随机值
②.在Hbase上嫁接MQ充当缓冲区
③.Rowkey设计为 hash+ElasticSearch 充当二次索引
9.多线程的创建
①.继承Thread类
②.实现Runnable接口
③.通过Callable和FutureTask创建线程
④.通过线程池创建线程
10.线程池
(根据个人理解)线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。
参考博客:
https://www.cnblogs.com/jiawen010/p/11855768.html
1.怎么保证kafka的数据顺序消费
答:写N个queue,将具有相同key的数据都存储在同一个queue,然后对于N个线程,每个线程分别消费一个queue即可。
参考博客: https://blog.csdn.net/qq_31329893/article/details/90451889
2.hive中,一个10条数据的表left join 一个5条数据的表 on l.key=r.key 会产生多少条数据
答: 10条或以上
存在,第二个表中存在多个key相等的状态,这时,对于第一个表就有一行数据对应多行。
3.hbase与传统数据库的区别
①.数据类型
②.数据操作
③.存储模式
④.数据维护
⑤.可伸缩性
⑥.事务
参考博客: https://blog.csdn.net/joananjin/article/details/80002364
4.抽象类和接口有何区别
①.构造方法
②.成员变量
③.抽象方法
④.方法的访问类型
⑤.静态方法
⑥.静态成员变量
⑦.实现与继承
参考博客: https://blog.csdn.net/qq_41933748/article/details/82670072
5.SpringBoot的入口类、入口类的一些注解和配置文件
@SpringBootApplication
@MapperScan(…)
用在入口类上{}
application.yml 配置文件(<==>application.properties
)
6.Yarn的调度器
① FIFO 单一队列
生产环境不使用
② Capacity Scheduler(容量调度器) 多队列,同时执行 ,并行度=队列数
③ Fair Sceduler(公平调度器) 多队列,执行并行度 >=队列数
7.HashMap
又是你!!!HashMap !!! 参考博客: https://www.cnblogs.com/duodushuduokanbao/p/9492952.html
1.
计算插入元素的key的hash值(n-1)& hash ,判断数组中是否存在该值,不存在则直接放入。存在,进行 key的 equals 判断。
2.
如果,2个key相等,则覆盖。如果key不等 :分为 如果是链表结构 则放入链表,判断长度是否>8,大于则链表转为红黑树。如果是红黑树,则直接放入节点中。
3.
.计算节点数是否大于阈值 (),大于,则扩容2倍。
8.算法
(这个题的我的答案肯定不是最优解,希望有仁兄给小弟指正~)题 :假设某几天的股票价格已知【假设数组的数据已知】,你要先买进股票(必须先买)再卖出,求你采用最优化交易手段后,获得的最大利润是多少。
CODE:
package com.baizhi;
public class Temp {
public static void main(String[] args) {
/**
* 根据题意,假设,我们已知某5天的股票价格是 3,4,1,2,5
*/
double[] prices = {3.0, 4.0, 1.0, 2.0, 5.0};
//定义一个标记值,这个值是个负值
double flag = Integer.MAX_VALUE+1;
/**
* 思路:我们总是要先买股票,然后才能卖出,也就是说,卖出的价格只可能是在前一次价格之后
*/
System.out.println("flag = " + flag);
for (int i = 0; i < prices.length ; i++) {
for (int j = i+1; j < prices.length; j++) {
/**
* 后面的价格减去前面的价格,获取差价是正数并且是最大的部分,即是我们的最大收益
*/
double temp = prices[j] - prices[i];
//如果,这个差值大于flag,对flag,进行交换
if(temp>flag){
flag = temp;
}
}
}
System.out.println("最大可获取收益是 \t" + flag);
}
}
9.你设计的第8个程序的时间复杂度是多少
(告辞,日后再解决)参考博客:https://blog.csdn.net/virus2014/article/details/52274849
传送门:
https://blog.csdn.net/ASYMUXUE/article/details/105559809