今年秋招
之前,我曾以为我以后会是一名Java开发
,但是在真正的秋招过程中,我出轨了大数据
(呵呵,男人!),既然将它作为第一份职业,那就要好好来了解下它,要对现有的大数据的生态有个直观的理解,所以在此基础上列出自己的学习计划和自己的职业规划。在这里,要特别感谢韩顺平老师B站2020大数据公开课,受益匪浅,视频链接在参考文献中,感兴趣的小伙伴可以看看。
这篇文章是我在查阅了大量的资料后进行的总结,以自身小白的角度讲述,如有不正确的地方,还望读者不吝提出。
作为一名Java Developer,
曾经我以为,BS架构就是我在浏览器中向服务器提交一个资源申请,然后服务器返回相应的资源就好了,那这个结构就好简单,就是下面这样的。
慢慢的,当服务器压力过大,我们就会考虑到扩容,设置主从服务等操作,这时的架构就变这样了
哎,我关心的层面永远是实现某个业务的逻辑
,至于数据,我理解的也仅仅是业务数据
,只要保证它们能够正常入库,正常获取即可,也就是我们常说的增删改查
;当然,除正常的业务数据外,还会有很多的日志数据,可以利用他们定位错误。
如果仅从这个层面上看待,我也许永远不会理解马爸爸口中所说的数据就是财富
,为了拥抱财富,我窥探了下业务数据之外的数据,然后,没忍住,我好像变心了~。
那么,什么是大数据呢?
随着科技的发展,我们在网上留下的数据越来越多,大到网上购物、商品交易,小到浏览网页、微信聊天、手机自动记录日常行程等,可以说,在如今的生活里,只要你还在,你就会每时每刻产生数据,但是这些数据能称为大数据么?不,这些还不能称为大数据,那么大数据数据到底是什么呢?
我的个人理解是这样的,大数据
可以认为是数据的集合
,我们可以从这些数据中推理出一个近似客观的规律
,利用这个规律可以预测产生数据的本体下一次要发生的概率
。如一个用户经常在某电影网站上观看成龙的电影,那么当该用户下一次访问电影网站时,将有关成龙的电影放在推荐列表中比较靠前的位置,因为我们通过用户的浏览的数据发现他很喜欢成龙的电影,并且相信相信该用户的兴趣短时内不会发生变化。这时我们就会有疑问,用户的行为数据存到哪里了?怎样使用这些数据判断(计算)产生数据数据的本体下一次发生的概率。这就引出了大数据的最核心的两个概念:存储和计算
我们接着上面分析,想知道这些数据可以具体做什么,那么我们就从数据本身出发。试想一下,要想使用数据
,是不是要先采集数据
,采集的数据传输过程中如果数据流量太大,还要考虑下对数据缓冲
,如果采集的数据不是那么特别着急的需要(变现),我们可以考虑以离线的形式先存储起来,如果数据放起来就没有价值了啊,所以我们还是是要分析
、计算
、挖掘
数据里面的价值,但是数据的最终价值是要变现啊,money! money! money! ,怎么变现?当然是提供给业务方
喽,那么谁是业务代码的编写者,好像是曾经的我,Java Developer。
MMP
,搞了半天,这是闭环啊,又回到了老本行,有点懵?别慌,来张图
这张图简要分析了数据的实时/离线
处理过程,乍一看这个流程,这有啥难的,不就是五个流程么,
数据源可以是多种多样的,按照结构划分可以分为三类:
- 非结构化数据:图片视频
- 半结构化数据:日志数据
- 结构化数据:关系数据
数据采集常用的是Flume
,但是考虑数据流量过大,我们通常使用Kafka做缓冲。
数据采集肯定是一端进数据
,一端出数据
,找了官方的一张图,结构如下:
Source端
是数据的入口,Sink端
是数据的出口。中间的Channel是进行数据的清理的管道。
上面分析中我们提到过,当数据量过大的时候,我们通常会对数据进行缓冲,保证数据的进出适配
。我们可以使用Kafka这个组件,Kafka是一个非常优秀的数据队列与缓冲组件。
既然是大数据,那肯定不是一台服务器能够解决的,肯定是分布式存储HDFS,在大数据刚出来,就有人很多人认为大数据=hadoop,可见当时的hadoop的火热程度,实时上,这是因为hadoop同时具备了数据的存储与计算
。Hadoop的框架最核心的设计就是:HDFS
和MapReduce
。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。
除了Hadoop自身的计算组件,有一款专门进行数据内存计算的组件–Spark,它可以同时提供离线计算
和在线计算
。
数据的应用就比较广泛了,我们可以把处理好的数据放入MySQL,使用Java EE
那套技术根据业务的需要具体操作即可;举一个简单的例子,我们可以把处理好的数据可视化(Echarts、D3),这也算是发挥它的价值。
上面仅仅是粗略的介绍,并没有详细的介绍每个步骤所对应的技术,要想学好大数据,自己必须要规划一个清晰的学习路线
,坚持下去。下面,我们就聊一聊如何学习大数据,这个路线适合任何阶段的学习者。
大数据的技术路线还是非常庞大的,在这里,我要特别感谢尚硅谷韩顺平老师提供的技术路线,基本上包含了:入门
–>进阶
–>精通
–>成神
。
话不多说,先看下总体学习路线:
上面这张思维导图包含了我们学习大数据路线所需要的全部知识,可能除了计算机基础
、JAVA基础
,对其它技术体系可能有一点点感到迷茫,不要慌下面我们一一分析:
按照正常情况下,如果你想当个普通的程序员,这部分内容其实不学也行,因为技术的天花板很低,当达到一定水平后,就会原地踏步,停滞不前。但是如果你想在这个领域有所建树,发光发热,就得好好学习这些基础知识,这是为啥呢?你想想看,在这个文科可以使用Python来进行数据分析的时代,不搞点技能怎么傍身。当然,这是次要的,最主要的原因是当我们把某个领域学的一定阶段的时候,这时你接触的就会越接近于底层
,举个例子:当你学习Java中的内存管理、线程、进程和锁的知识点时,如果你不了解操作系统的知识,理解起来还是挺难的。
下面,我们介绍下具体学习那些基础,这里只列出书籍,每个人根据自己的学习情况具体学习即可
- 计算机网络
- 操作系统
- 数据结构与算法
- 计算机组成原理
- 离散数学及其应用
- 编译原理
学习大数据是必须要学JAVA的,为什么这么说呢?学习大数据,我们或多或少都听说过Hadoop
,很多同学甚至将Hadoop和大数据画了等号,可见Hadoop是必须要学的,而且我们知道Hadoop和其他大数据处理技术很多的部分都是由Java语言来实现的,所以在学习Hadoop的一个前提条件,就是掌握Java语言
。
那么,我们应该学习Java的那些内容呢,别单担心,贴心的Simon郎
为你画了张思维导图。
作为一个大数据工程师,理论上讲,JAVA EE的技术不是必须的
,为什么说呢,你想啊,JAVA EE开发是Java语言中的一个应用领域
,比如开发WEB程序;大数据开发也是Java语言中的一个应用领域,比如开发海量数据处理程序。两者就好比是学习了中文,一个用于写段子,一个英语写诗,两者没太大关系啊,都要依赖语言(Java)。
但是问题来了,既然两者都是Java语言的应用,那么为什么大数据路线中还要学习JAVA EE呢,我的理由很简单,大数据处理的数据是供给具体的业务使用的,如果你一点都不懂,说的过去么?再说了,JAVA EE中有很多框架的思想都是挺值得借鉴的,所以,我觉得,学习大数据路线上适当的学习JAVA EE,会有着不错的效果,至于具体学习到什么程度,自己可以把握。
学习大数据肯定绕不开Hadoop
,可见Hadoop的地位是多么重要,但是对于接触大数据时间较短或者尚未接触过大数据的同学来说,如果问他们我们应该学习Hadoop的那些内容,分布式存储
和计算
一定会说出来,但是仅仅这两个概念还是太笼统了,那么我们应该怎样把控Hadoop的学习呢,莫慌,且听Simon郎
慢慢道来。
话不多说,先看一张Hadoop生态体系
的脑图。
妈耶,咋那么多内容啊,快把我干懵逼了。千万别懵,虽然看起来很多,但是可以用一句总结:Hadoop是一个分布式计算开源框架
,提供了一个分布式系统
子项目(HDFS)和支持MapReduce分布式计算软件架构
。既然脑图的内容有点多,咱们就介绍几个在Hadoop家组中占有地位较高的几个组件,如果小伙伴对其它组件感兴趣,可以自行查阅。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hbase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建起大规模结构化存储集群。
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中
Zookeeper 是一个为分布式应用所设计的分布的、开源的协调服务,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
Ambari是一种基于Web的工具,支持Hadoop集群的供应、管理和监控。
Oozie是一个工作流引擎服务器, 用于管理和协调运行在Hadoop平台上(HDFS、Pig和MapReduce)的任务。
Hue是一个基于WEB的监控和管理系统,实现对HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。
…
Hadoop生态体系先介绍这么多,对其它内容感兴趣的同学自行补充
学习完Hadoop后,稍作调整后,就可以学习Spark了,这时,可能就有同学会问,Spark和Hadoop有啥区别呢?我们为什么还要学Spark呢?要学习Spark那些内容呢?
别慌,咱么一一解决
1. Spark和Hadoop有什么区别?
简单理解,Spark是在Hadoop基础上的改进
,是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行计算框架
,Spark基于map reduce算法实现的分布式计算,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是中间输出和结果可以保存在内存中
,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的map reduce的算法。
2.为什么要学Spark
基于MapReduce的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于任务管道承接的考虑,当一些查询翻译到MapReduce任务时,往往会产生多个Stage,而这些串联的Stage又依赖于底层文件系统(如HDFS)来存储每一个Stage的输出结果。
Spark是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,以弥补MapReduce的不足。
要学习Spark的那些内容呢?
首先要学的就是Scala
,因为Spark就是Scala写的,所以要好好学,这对于我们分析源码非常有帮助。这时你又有疑问,不是已经学了Java了么,怎么还学Scala,你个骗子!
别骂我,但是Scala是基于Java写的,难道学习Java还忽悠你了不成!
其次要学的就是Spark的基础知识,先把地基打牢,才能更上一层楼么。学完Spark后,就可以着手学习较有挑战性的SparkCore
、SparkSQL
、SparkStreaming
、MLib
SparkCore将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。
SparkSQL 是Spark来操作结构化数据的程序包,可以让我使用SQL语句的方式来查询数据,Spark支持 多种数据源,包含Hive表,parquest以及JSON等内容。
SparkStreaming是Spark提供的实时数据进行流式计算的组件。
MLlib提供常用机器学习算法的实现库。
马上2021年了,如果学习大数据还不知道flink就有点过分了,现在各个大厂都在尝试着使用flink,那么flink到底是什么
呢?
先看看官方的定义
:flink是一个框架和分布式的处理引擎
,用于对无界和有界数据流进行有状态的计算
。
定义明确了flink的作用是计算
,想一想,我们在上面已经介绍了Hadoop中的MapReduce和Spark都可以用于计算,怎么还要学,它的优势是什么呢?
其实蛮难的理解的,我查了很多的资料,我发现云栖社区的蒋晓伟老师的说的就挺明白,问题和回答的原话如下:
蒋晓伟:首先我们希望有个流计算和批处理的一体化处理方案。Spark和Flink都具有流和批处理能力,但是他们的做法是相反的。**Spark Streaming是把流转化成一个个小的批来处理,这种方案的一个问题是我们需要的延迟越低,额外开销占的比例就会越大,这导致了Spark Streaming很难做到秒级甚至亚秒级的延迟。Flink是把批当作一种有限的流,这种做法的一个特点是在流和批共享大部分代码的同时还能够保留批处理特有的一系列的优化。**因为这个原因,如果要用一套引擎来解决流和批处理,那就必须以流处理为基础,所以我们决定先选择一个优秀的流处理引擎。从功能上流处理可以分为无状态的和有状态两种。在流处理的框架里引入状态管理大大提升了系统的表达能力,让用户能够很方便地实现复杂的处理逻辑,是流处理在功能上的一个飞跃。流处理引擎对一致性的支持可以分为:best effort,at least once 和 exactly once。Exactly once的语义才能真正保证完全的一致性,Flink采用的架构比较优雅地实现了exactly once的有状态流处理。另外在保证了一致性的前提下Flink在性能上也是相当优秀的。总结一下,我们觉得在流处理方面Flink在功能,延迟,一致性和性能上综合来看是目前社区最优秀的。所以我们决定采用它来实现流和批的一体化方案。最后,还有一个很重要的原因是Flink有一个比较活跃的社区。
蒋晓伟:大数据是从批处理开始的,所以很多系统都是从批处理做起,包括Spark。在批处理上Spark有着较深的积累,是一个比较优秀的系统。随着技术的发展,很多原来只有批处理的业务都有了实时的需求,流处理将会变得越来越重要,甚至成为大数据处理的主要场景。**Flink把批当作流来处理有个很重要的优点是如果我们在流中引入一个blocking的算子,我们还能接着做批处理特有的优化,这个是以流处理为基础的计算引擎的一大优势。**所以我认为在架构上这种设计在批处理上是可以做到最优的,而且比传统的做法还有一些特别的优势,当然工程上的实现也很重要。
看了上面两个问答,大家应该对为什么使用flink有个比较宏观的了解,那我们具体学习什么呢,我觉得啊,学它的不同点就好啊
技术的学习是建立在职业规划上的,那么作为还未入门的大数据从业者,应该怎么规划自己呢?
据我了解,目前市面存在的大数据的岗位有以下几种:
因为市面上的岗位需求以大数据工程师
居多,在这里,我会着重介绍大数据工程师的职业规划,对其他岗位刚兴趣的可以自行查阅相关资料。
大数据工程师具体的工作内容取决于你在工作数据流中的那个环节,数据流的工作内容大致可以分为:数据采集
—>数据清洗
—>数据存储
—>数据分析和统计
—>数据可是化
正常情况下,大数据工程师按照不同的工具是要分类,如Hadoop工程师
,Spark工程师
,Flink工程师
,具体的使用工具取决于所在的部门,但是如果想要成为一名优秀的大数据工程师,这些工具都是需要掌握的。
人们常说,程序员到了35岁,就要转行送外卖
、开滴滴
了,虽然这是一句调侃,但是人到中年,危机意识还是要有的,搞不好部门下次优化的就是你。
就像文中开头所说,解决焦虑的最好办法就是面对焦虑
,既然知道有35岁危机,那么应该早早准备好自己的职业规划,并坚定不移的坚持下去。从大数据工程师的角度看,如果你一直从事大数据这个行业,有两大方向供你选择
大数据工程师—>大数据算法工程师—>大数据项目经理—>大数据架构师—>资深架构师—>大数据科学家
大数据工程师—>大数据产品经理—>资深大数据产品经理—>合伙人
相信大家看完了上述内容后一定会对大数据有个宏观的认识,细心的同学也可能发现了大数据路线
中还缺少两个模块,项目
和源码
,怎么说呢,我也有点发愁,所以我准备发完文章后好好去整理一下,既然整理了,那就全部搞完吧。
我会尽量在下次发文的时候整理好学习大数据所需的资料,包括文档
、视频
、书籍
等。
好了,今天的文章就到这里了,我是Simon郎
,一个Java开发,却在秋招出轨大数据的应届生,如果不嫌弃我,欢迎关注
、在看
和点赞
。
参考文献
http://flume.apache.org/
http://kafka.apache.org/documentation/
https://zhuanlan.zhihu.com/p/31545435
https://zhuanlan.zhihu.com/p/94842150
https://blog.csdn.net/sinat_26811377/article/details/104617969
https://www.bilibili.com/video/BV1zE411L7v7?from=search&seid=14312143415443224195