欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

从传统数仓到互联网大数据开发,不走弯路很重要

程序员文章站 2022-04-28 09:54:06
...

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--

推荐阅读:

五年Java外包转型大数据架构

北美零基础转行开发求职面经

双非硕士阿里大数据开发面经

一位材料专业研究生的Java转型复盘

从车辆工程到大数据开发,我经历了什么?

我,30岁,部队服役5年,零基础转大数据

Java干了半年,我机智地跳到了大数据开发

日本留学生算法转型大数据开发?听他怎么说

传统金融IT男转型互联网大数据码农,图啥?

从安卓主管转型大数据开发,我经历了什么?

专升本程序媛,实习期间月薪10K,有点厉害

我是程序媛,从事大数据开发两年,我有话说

材料学博士转型大数据开发,是一种什么体验?

我,32岁零基础转大数据,不需要别人怎么看!

两年车间技术员转型大数据开发,说说转型这点事儿

3年Java开发转型大数据开发,如何跳出CRUD舒适区?

我是DBA,从大数据小白到阅读框架源码,薪资翻了三倍

双非菜鸡3个月收割头条大数据offer,方向真的比努力更重要!

国企车间流水线5年,重新考研,弯道超车,收割百度腾讯offer

二本电气工程应届生收割5个offer,转型大数据真的与专业无关

被培训机构坑了,面国企要求唱歌...谈谈我转型大数据的心酸历程

土木工程转专业,上岸趣头条、今日头条后端开发,学习历程分享

警犬专业专科生,过阿里一面,又收作业帮offer,跟你聊聊大数据学习

学了三年的嵌入式,但我还是转型了大数据,跟你聊聊我学习的心路历程

扫描下方二维码

添加好友,备注【交流群

拉你到学习路线和资源丰富的交流群

从传统数仓到互联网大数据开发,不走弯路很重要