1.自我介绍
二本学校毕业5年,在某已倒闭手机厂商做安卓开发3年,到银行外包写SQL1年,现在在某大厂做大数据开发工作即将一年,月处理数据量PB级别。
2.为什么要转型
转型有两个原因,一个是技术相关的,刚毕业心态没调整好,没有把心思放在技术上,然后做的工作技术要求也不高,就这么混了几年;一个是工资相关的,工资真尼玛低,都快混不下去了。
3.转型的心态和行动
16年公司内部培训的时候了解到大数据,那时候还没放心思去学。因为以上说的原因开始专心搞大数据,每天晚上8点准时学习到12点。从Hadoop开始,到Hive、Spark、Hbase、Redis、Mongodb,storm、zookeeper,把大数据常见的组件都学了一遍。
4.转型过程
那时候基本上是按照每个月一个组件,然后上网找视频,对着视频边看边敲代码。
最大的困难有几个:
一是大数据领域组件太多,相应的知识点就很多,学了前面忘了后面;
二是没有实战经验,没有真实的应用场景,不知道每个组件在生产中具体是怎么应用的,心里没底。
还有一个,就是公司倒闭了,顿时陷入了失业的状态。19年初的时候公司招聘很少,要招都是招高级的,这种就是实打实的考验功力了,所以基本上是面一个挂一个。那时候只剩下一个信念,相信自己一定能成功,每天脑子里都在想着知识点,吃饭想,走路想,睡觉想。
中间实在没办法了,就去银行外包先做起,做传统数据仓库相关的。主要就是用hql写SQL,框架有人定好了,就是按照模板往里填SQL。为了生活走到了这一步,心里一直想着几个月后一定要往前迈一步,可以去一个小厂做有技术含量的大数据开发,更好的就是能去大厂做大数据开发了。
每天的状态就是,早上六点起床坐一个小时公交到公司上班,白天做公司的事情,晚上下班马上自己学习大数据视频,一边跟着敲代码,一边脑子里面想面试题,就是要把知识点刻在脑子里。反正每天都在想着怎么学更多的东西,中间向公司比较有经验的人咨询,说实话没有得到什么帮助。
然后又关注了很多大数据的公众号,加了很多大数据的群,了解大数据从业者平时工作是做什么,然后中间有幸和好几位公众号作者交流了,他们都很无私的帮助了我。从写简历,到面试,到大数据知识点,学了很多,很感谢这一路帮助过我的人。
5.学习过程
首先先把Java相关的复习了一遍,然后学习大数据的东西。
Java方面(一个半月)
由于之前一直在写业务代码,然后业余时间也没有专研,导致好多Java知识都忘了,所以先从Java开始学习。学习目标是先只要求把JavaSE复习完,不然时间不够。
学习手段是看《Java编程思想》刷了一遍,重点关注数组和并发两个章节,中间也会找各大厂的面试题,边看知识点,边敲代码,然后刷题,做到一看到相关的题目,脑子里面就会有完整的知识体系。
接着是算法和数据结构方面,就刷《剑指offer》和Leecode上面的题目,每天刷两到三道题,做到看到题目脑子里面有大概的思路。
大数据方面(五个月)
在网上报了个培训班,跟着他们学。现在想起来,那个培训班很坑,好几个老师分别讲不通的大数据组件,没有连贯性,讲的也很浅。那时候报的目的也是说自己摸索太慢,想花钱找捷径,最终目的勉强算达到了吧。
它的课程是先Linux基础知识,Hadoop,hive,HBASE,redis,MongoDB,storm,辅助框架,Scala,kafka,spark,最后两个项目(电商和交通相关的)。
如果现在让我去学,是数据仓库或者离线实时业务代码开发方向,首先会先去学Hadoop,这个是基础,大数据很多东西都是基于Hadoop延伸出来的。Hadoop里面,最重要的肯定是MR整个流程,包括map端做了什么,shuffle做了什么,reduce做了什么,中间还把源码看了一遍,然后在源码里面找到MR流程的每一个对应点。
然后是hdfs的原理,包括数据的读写原理,数据副本之前的协作等等。最后就是yarn了,yarn是作为资源调度的,这个没有太多内容。
如果是数仓的,可以再学习hive,花半个月了解hive语法,组成原理,再了解点数据仓库知识,就可以去面试了,问到啥不懂的,马上学,这个是学习最快的方式。现在才知道,不要等到自己认为准备好了再去做,因为从来没有准备好的时候,做着做着你也就做成了,一边面试一边学习。
如果是做离线实时业务开发的,那要多学点。花两个星期看下kafka,目标是kafka会用而且常见的原理能解释,如kafka的producer、consumer的使用,topic和partition这些,ISR等等。花两个星期看下HBASE,了解读写原理,数据存储方式,rowkey设计以及热点问题等等。
接着就是重点了,学习spark。spark包括spark core、spark SQL、spark streaming、structured streaming,内容很多很多,真的要多敲例子,多整理思维导图,不然没几天就全部混到一块了。
先学spark core,了解spark的计算执行过程,熟悉常见的算子,没事就多看算子的源码,我一开始一直记不清楚map和flatmap的区别,就去看了两个的源码,梳理了整个流程,后面就再也没有忘了。
如果学好spark core,那么学习spark SQL相对会简单点,主要就是DS和DF的应用,大同小异。sparkstreaming会稍微难点,也是spark的一个重点,它用来做实时流处理,需要考虑和其他大数据组件的交互,如kafka和HBASE这些,然后还有数据消费准确性、数据容错性的考虑,内容挺多的。其他组件看情况学了,面试问到了不懂就补。
最后项目是很重要的一个部分,一个好的项目能帮你把之前学的东西全部串连起来。有几点需要注意,首先项目场景一定要基于你做过的业务来构思,不然面试的时候稍微问你业务你就挂了;
接着要多去了解真实业务场景,如生产中常见的问题有哪些,解决方案是什么。面试的时候在这个环节卡了很久很久,之前都是按照培训时候的项目写简历,业务逻辑都没想清楚。后面峰哥指导下,根据做过的业务场景重新构思项目,业务的整体框架,提前准备重点和难点,后面就越面越顺了。每次面完也找峰哥过下思路,都可以从不同角度总结到新的知识点,特别是有些公司的CTO面。
6.笔试面试
19年初的时候公司招聘很少,要招都是招高级的,这种就是实打实的考验功力了,所以基本上是面一个挂一个。七八月的时候接触到锋哥,向他咨询了很多关于学习路线以及面试相关的技巧,然后他还提供了他面试总结的面经。
通过系统梳理了学习路线,也搞定了简历的项目,不断面试,然后看面经总结,后面是越面越顺,拿了五六家offer,最后选择来现在这个公司。
面试题:
一、XX网络
1.生产环境中报错怎么排查?
一般开发程序的时候,都会在关键的地方打上log,这样方便后续定位问题。
可以在yarn上面查看log,定位问题。
2.讲一个业务需求,并且里面的算子是怎么使用的
mapToPair()->groupByKey()->flatMapToPair()->countByKey()->count()
3.几种数据倾斜方案的适用场景
二、华为面试
1.运行下列程序,会产生什么结果
public class MyThread extends Thread implements Runnable{ //第一行 public void run(){ //第二行 System.out.println("this is run()"); //第三行 } public static void main(String[] args){ //第四行 Thread t=new Thread(new MyThread ()); //第五行 t.start(); //第六行 }}
A、第一行会产生编译错误
B、第六行会产生编译错误
C、第六行会产生运行错误
D、程序会运行和启动
答案:答案是D,程序正常运行,并且打印"this is run()"。
2.int a=2,b=3,c=4,d; d=++a+b+++c++; 请问各个值大小
a进行++a运算,则a为3
b进行b++运算,需要下一次取值的时候才会加1,故为3
c进行c++运算,同b一样,为4
故d等于3+3+4=10
3.byte a = 124和Byte a = 240哪个有问题
貌似两个都会报错,类型错误。但是这一题估计是考byte的范围的,byte大小是-128-》127,所以有可能是byte a = 124
4.找出字符串中第一个不重复的字符
参考https://blog.csdn.net/danyuliuyan/article/details/80263646
或者去Leecode官网找标准答案
5.map操作后内存数据不会不翻倍
应该是翻倍了,由RDD1生成了RDD2,这样从原来的RDD1变成RDD1和RDD2两个,故翻倍了。
三、XX总部岗位
1. 常用的算子
map,reduceByKey,groupByKey,这里重点说了repartition算子,底层是由coalesce实现的,coalesce有两个参数,第一个是分区个数,第二个是是否shuffle。
repartition默认是调用coalesce(num, true),故适合扩大分区数,一般用coalesce来减少分区数。
2.做过哪些调优
除了上面的repartition,还用过广播,讲了广播的使用场景是把reduce join改为map join。还讲了shuffle file not find的情况,这个需要设置spark.shuffle.io.maxRetries为60,以及设置spark.shuffle.io.retryWait为60s。
3.hive调优做过吗
做过很多,举了个例子,如设置序列化为kryo。
4.说下cache和checkpoint的区别
cache后会保留血缘关系,checkpoint后会断开血缘关系。
讲了cache的底层实现是基于persist(),又讲了persist()方法的几个不同的参数值。
5.讲讲kafka
主要讲了kafka的整体架构,包括topic、partition、副本,这三者之间的关系和作用,接着讲了producer发送消息到分区的三种方式,还有几个ack值的含义,最后是讲到副本之间的复制,讲到了HW和LEO这些,最后再讲了下消费者消费的时候用到了offset。
6.spark SQL的架构
主要是讲了spark SQL的执行过程,包括用ANT4解析SQL,然后转化为逻辑计划,最后转化为物理计划,再执行。这里说到了CBO,讲了它的作用等等。
7.场景题,他们打算用sqoop实时采集MySQL数据,给个思路
用sqoop去读binlog,然后再去根据时间戳来判断是否为新增数据。面试官说这样很难做到实时,他打算检测insert操作,如果有insert操作就直接读取数据。
四、XX云客
1.数据倾斜解决方案
分类型来说,group的情况,join的情况,窗口的情况,还有了解下spark如何配置自动解决数据倾斜的
2.如果实时计算的时候需要获取历史数据,需要怎么保证时效性
使用HBASE来存储结果,这样实时的数据和HBASE的数据做关联运算,结果就OK。
3.宽依赖和窄依赖
宽依赖,一个子RDD的分区,依赖多个父RDD的分区。然后再说下spark1.2之前和之后的shufflemanager的区别
4.集群规模
内存有58.2TB,硬盘有4.33PB,vcore有8176个.
五、XX网络科技
第一轮面试
1.说说你最近了解的前沿技术
说了kafka的副本复制机制,说了HW和LEO这些。
2.一个表有两百个字段,每个字段内容大于15位,我们从15个维度里面求出20个指标,用你能想到的手段来提高性能,假设就操作一个表数据,不会出现shuffle。
这道题主要考察你的优化思路,从哪些方面进行优化。
一看到这个题目,他说就要想到key有300位,那么就要对这个key进行优化。这里就涉及到了一个思想,通过把key变大或者变小来提高效率,变大可以加盐,变小可以用MD5加工成32位,再用base64加工成20位。优化处理效率,从这些思想入手。首先看源头,从源头减少数据处理量,或者和产品沟通减少数据处理逻辑。接着是加工层面,通过key变大变小来提高执行效率。
3.如果groupbykey的时候,key的字符串是10位,但是value是一篇文章,请问value用什么结构存储比较好?
用list
第二轮面试
1.说收Java常见的数据类型
2.byte和char的区别
3.hashmap和tuple的区别
参考https://www.2cto.com/net/201712/707476.html
4.saveAsNewAPIHadoopFIle和saveAsHadoopFile的的区别
http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.SparkContext
5.用伪代码实现下快速排序
六、XX科技
第一轮面试:
1. 主要面的是数据仓库相关的,问了几道物流相关的SQL场景题
给了两张表,表A的字段大概有:订单号,订单收入,订单类型
001, 10, A
001, 20, A
002, 10, A
表B的字段大概有:订单号,订单成本,成本类型(运维成本包括雇员,车辆等等;管理成本包括管理系统等等,有点忘了)
001, 2, 雇员
001, 5, 车辆
第一个问题,算每个订单的订单收入,这个直接根据订单group by一下
第二个问题,算出订单收入前5的订单号,用rank函数。
第三个问题,从表A和表B计算出每个订单号的利润,
表A和表B根据订单号join下然后订单收入减去订单成本就好了
第四个问题,上一个问题用的是inner join,那如果一个订单没有订单成本,只有订单收入,join后怎么保留订单收入,不被删掉。
考left join的用法,右表为空左表还是保留。
第五个问题,怎么在一行列出某个订单的订单号,运维成本,管理成本。
列转行的问题,可以用case when来处理。
第六个问题,不用full join,怎么把订单号,订单收入,运维成本,管理成本放到一行
用union all可以操作
2.有没有遇到数据倾斜
groupbykey出现数据倾斜,可以把出现倾斜的key挑出来,单独处理;
大小表join出现数据倾斜,可以转为map 端join,只要设置参数hive.auto.convert.join=true;然后还说了几个优化参数,如设置spark引擎,开启动态分区的时候需要注意哪些点,设置spark.serializer=org.apache.spark.serializer.KryoSerializer;
3.说了维度表生命周期管理
其实就是说拉链表,维度变化的时候怎么处理,幸好之前看了《大数据之路:阿里巴巴大数据实践》,说拉链表有三种设计方案,第一种是直接更新,第二种是设置代理键,第三种是用极限存储,感觉面试官挺满意的
4.讲一个业务场景,说下维度表你们是怎么用的
5.你们表的存储格式
两种类型,一个行式存储,一个列式存储,一般用列式,包括orc和parquet,如果是用hive表直接计算就用orc格式,如果用spark计算可以设置为parquet
第二轮面试:
HR面试,不说了。
第三轮面试:
部门负责人面试,主要是考查对数据挖掘的理解,考了在实际业务场景下算法模型的使用。
还有就是对前沿技术的了解,介绍了几个。
第四轮面试:
总监面试,没问技术,问了优点缺点,职业规划,学习方法这些。
7.经验心得分享
时隔一年做总结感受颇多,做我们这一行的没有一劳永逸的,还是得不断学习。还是得及时跳出舒适区,早点做准备,目前已经适应了手头上的工作,但还是得继续学习,继续精进,加油!
--end--