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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 从传统数仓到互联网大数据开发,不走弯路很重要

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


相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
1月前
|
SQL 分布式计算 DataWorks
DataWorks产品使用合集之如何开发ODPS Spark任务
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
11天前
|
SQL 分布式计算 大数据
代码编码原则和规范大数据开发
此文档详细规定了SQL代码的编写规范,包括代码的清晰度,执行效率,以及注释的必要性。它强调所有SQL关键字需统一使用大写或小写,并禁止使用select *操作。此外,还规定了代码头部的信息模板,字段排列方式,INSERT, SELECT子句的格式,运算符的使用,CASE语句编写规则,查询嵌套规范,表别名定义,以及SQL注释的添加方法。这些规则有助于提升代码的可读性和可维护性。
12 0
|
11天前
|
SQL 分布式计算 大数据
大数据开发SQL代码编码原则和规范
这段SQL编码原则强调代码的功能完整性、清晰度、执行效率及可读性,通过统一关键词大小写、缩进量以及禁止使用模糊操作如select *等手段提升代码质量。此外,SQL编码规范还详细规定了代码头部信息、字段与子句排列、运算符前后间隔、CASE语句编写、查询嵌套、表别名定义以及SQL注释的具体要求,确保代码的一致性和维护性。
15 0
|
1月前
|
消息中间件 存储 大数据
大数据-数据仓库-实时数仓架构分析
大数据-数据仓库-实时数仓架构分析
86 1
|
1月前
|
存储 运维 Cloud Native
"Flink+Paimon:阿里云大数据云原生运维数仓的创新实践,引领实时数据处理新纪元"
【8月更文挑战第2天】Flink+Paimon在阿里云大数据云原生运维数仓的实践
214 3
|
2月前
|
SQL 分布式计算 MaxCompute
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
SQL开发问题之对于ODPS中的UNION操作,执行计划的问题如何解决
|
1月前
|
数据可视化
Echarts数据可视化开发| 智慧数据平台
Echarts数据可视化开发| 智慧数据平台
|
1月前
|
数据可视化
Echarts数据可视化大屏开发| 大数据分析平台
Echarts数据可视化大屏开发| 大数据分析平台
|
1月前
|
分布式计算 关系型数据库 Serverless
实时数仓 Hologres产品使用合集之如何将ODPS视图表数据导入到Hologres内表
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
1月前
|
存储 分布式计算 关系型数据库
实时数仓 Hologres产品使用合集之创建外部表时提示不支持ODPS的datetime数据类型,该怎么解决
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。

热门文章

最新文章