大概两年前写过同样标题的一篇文章,对于这个问题感兴趣的人不少,后台收到不少同学的提问,所以准备细致地解答一下这些问题,希望能解决掉大家90%的疑问。下次再看到相关的提问我会理直气壮地把这篇文章的链接甩你脸上。但是可能又会有同学有疑问了,那剩下10%的疑问怎么办?可以关注我的公众号【老蒙大数据】。
言归正传,对于新手来说,老是会有类似这样的问题,“做大数据需要学Java吗?”“不会Java可以吗”“需要学到什么程度”...我的回答是“需要!”,“不可以”,“精通”。当然对于一个新手来说让你精通Java是不可能的,写Java没个十年半载真的不敢说精通,但是你得走在通往“精通”的这条路上,精通程度和你拿到的钱是成正比的。
其实我想表达的是,不要有侥幸心理,不要觉得大数据就是搭搭环境,用用组件,大数据是正儿八经需要写代码做开发的,而且对代码能力的要求是比较高的,为什么这么说,因为大数据生态圈有很多优秀的开源组件,如果你的 Java 是半吊子的水平那我可以很明确地说,你能看得懂的代码可能都不超过100行。不信的话可以找个开源项目看看。
Java 可以说是大数据开发的第一语言,至少当前还是的,虽然垃圾回收的问题经常被大家诟病,但是有庞大的生态圈在呢,一时半会都还会是 Java 的天下。“Java 要学到什么程度?”JavaSE 必须掌握,JVM,多线程之类的都是基础,面试必问系列;JavaEE 必须熟悉,丢个Java web项目给你,不求你把底层了解地多么透彻,但是必须得会写,因为大数据开发实际工作中少不了写接口。
SQL。如果说有一门语言可能会撼动 Java 一哥的位置的话,那绝对是 SQL,虽然 SQL 和 Java 都算不上是一个层面上的语言,但是它太重要了,太多人的 SQL 写得太渣了,太多人写 SQL 的时候不考虑底层优化了,要重视呀兄弟们,不是增删查改就完事了的。有小伙伴问过要怎么提升写 SQL 的能力?孰能生巧,多写,多了解底层原理,多思考优化的方案。
Scala 要学到什么程度?语法得懂,除了基本的,还有什么隐式转换,什么柯里化,什么闭包等等。学Scala 最大的目的就是写 Spark,Spark 在大数据生态圈的存在感太强了,学习一门语言最好的方式就是实践,多写写 Spark 相关的项目,或者去看看 Spark 的源码。
shell 也是必不可少的,大数据开发其实一般都会承担起大数据集群的运维工作,说到运维,shell的重要性应该不用我多说了吧。
语言是程序员的兵器,兵器肯定是越锋利越好,种类越多越好,弓箭,刀,剑,盾,都有它们各自使用的场景。程序员不要有侥幸心理,不要得过且过,对于技术来说要知其然且知其所以然,如果你还达不到这个地步,那一定要走在这个方向上。
上面这张让人犯密集恐惧症的东西是什么?是2019年据不完全统计的大数据产品。
是的,人人都知道,大数据技术实在是太多了,变化也太快了,新技术层出不穷,作为一个新人在面对这些技术的时候,常有的一个状态就是懵,所以新人加我微信最常见的问题就是怎么学?这个要不要学?那个需要学到什么程度?等等。
hadoop基础全家桶,hdfs,yarn,hbase,hive,zookeeper等,再加个 spark 全家桶,以及流式计算全家桶kafka,flink,redis。
如果真的是认认真真吃透了上面的那些技能的话,那我能保证你已经基本上能解决90%的大数据问题,那剩下的10%怎么办?这个问题好像有点熟悉,当然还是继续学,但是你有了这解决90%问题的能力,剩下的10%的问题其实也不是什么大问题了。
从局部到整体。说得通俗一点就是要脚踏实地,不要老是飘在天上,因为在天上看到的是一整个生态,你当然会看到有很多很多东西,但是如果你不走近看的话你是不会知道,其实有很多东西都是类似的,经典的理论就那么几个,大家的系统很多都是照着这些理论去实现的,只是实现的方式会有些不一样,所以同类型的产品可能场景会稍有不同,但是架构是非常类似的,熟悉了之后你会发现,分布式系统万变不离其宗。
简单地说,从一个入手,比如存储,举个例子可以从HBase入手,因为它算是一个比较经典的分布式存储引擎,《Big Table》也是非常经典的一篇paper,HBase里面存在的 LSM-Tree,Bloom Filter,压缩,分区等等原理和概念在很多分布式存储中也是适用的。
再比如,计算,mr很经典,但是我还是建议直接从Spark入手,它的很多设计是基于mr又超过了mr的,而且 spark 生态系统非常的全能,能干的事情非常多,先学Spark Core,搞懂编程模型,了解大概原理,接着学SparkSQL,了解catalyst等,再接着就是SparkStreaming,以及后面的StructedStreaming,学到到这里,如果学得足够有深度,Flink也是可以轻松拿下的了,二者都大量借鉴了《DataFlow》这篇paper的理论,还是那句话,万变不离其宗。
还有很多的其他的例子,比如调度系统 AirFlow,Azkaban 以及最近挺火的 DolphinScheduler,本质上的实现都是类似的,只是在各自都增加了不同的功能来满足用户的需求。
还有数据可视化等等很多的例子就部一一列举了。
说这么多目的只有一个,脚踏实地一步一步走,程序猿这个工种还是很依赖经验的,孰能生巧是没有错的。
我再强调一遍大数据平台的开发人员不是简简单单会个搭建和使用就可以的了,这是最基础和浅显的内容,所以平时有些小伙伴贴一大堆报错信息给我,问我安装怎么报错了,怎么这个功能用不了了,这些问题基本上我都不会回答,除非我那天真的我心情非常好。因为如果你连这些在google一搜一大把的问题都没法解决的话,你觉得你是不是应该重新思考一下自己的职业选择。
回到正题,要学到什么程度,取决于你现在什么水平,如果你刚入门,你要学会理解场景,搭建,使用;熟练了之后就要理解原理,懂得调优;再接下来,需要你主动去发现应用中的问题,以及找解决方案来解决问题,这个时候就不仅限于眼前的某一种技术了,需要有一个大局观,如何培养你的这种大局观呢,多混社区多和优秀的同行交流,多看源码多学习优秀的开源项目。
当然最好是能够成为优秀开源项目的 contributor 甚至 committer,这无论是在跳槽的面试中还是在晋升的述职中都是非常亮眼的加分项。
学好语言的目的是为了写代码,写优秀的代码,那么如何能写出优秀的代码呢,人类最初学习的过程是从模仿开始的。
上面都提到了源码,为什么我要反复提这个问题呢,大数据的技术逐渐成熟,大数据的下半场绝对不会像前几年一样会搭个Hadoop,会写个Spark就能拿比较高的薪资,高薪大数据平台方向的程序员未来的趋势一定能够是捣鼓各种源码进行二次开发的。
都说一入开源深似海,那为什么还是有那么多人往坑里跳呢,坑里有好处呀。
首先开源的目的就是能给更多的人使用这个产品,同时能让开发者参与开发,让使用者提出需求,这对产品而言是有积极推进作用的,但是,开发者核心团队会筛选使用者的需求,因为开源的东西考虑的是大多数人通用的需求,不可能为个人定制,所以它是不能适应所有的场景,而业务是千变万化的,需求方是神通广大的,他们总是能够发掘一些刁钻的需求,总是会“想方设法”地为难你,如果你经常被难倒的话,N+1会在不远处向你招手。而如果你能够改动一下源码,让这个东西满足你的需求,不是很美好吗?
参与开源项目的建设是提升程序员个人水平的一个很好的方式,通过一些头部的开源项目,你可以看到业界优秀的程序员是怎么合理设计架构的,是怎么写出高质量代码的,是怎么实现刁钻需求的。人总是在模仿中不断成长的,你的水平怎么样很大一部分取决于你接触的人水平怎么样,这也是大厂经历可以给简历加分的原因,没有大厂经历怎么办呢,送你四个字,“入开源坑”。
大部分人工作说到底都是为了钱,不晋升哪来的钱。造轮子,二次开发都是晋升很好的资本,不然阿里在github也不会有那么多KPI产物了。你可以看不惯,但是没办法,这就是竞争力,别人都没有做出来,而你做出来了。
那么如何入坑呢,先从简单的开始,最好是能结合公司现在在使用东西,或者潜在需要使用的东西来下手。国外apache的项目一般都是比较高质量的,也要参照一下github上的star个数和活跃度来看,另外没进入apache的一些项目,比如cloudera,facebook,linkin等这些公司开源的也有很多高质量的大数据项目。
国内的话,阿里也有不少应用非常广泛的Java项目,比如druid,fastjson,datax,canal等等,可以先从这些下手,先读懂,然后可以看看 Github 上的 Issues,有没有和自己遇到的问题类似的,或者有没有问题是你可以解决的,提个PR,至此,你已经迈出了第一步,一只脚已经踩进坑里了。
总而言之,要多读优秀源码,模仿人家写代码的思想。源码阅读相关的内容可能会枯燥乏味,但是一点点坚持下来的话,各方面都会有蜕变的。
还没有看够?扫下面的二维码关注下公众号吧!