大数据&深度学习学习路线

现如今,IT互联网行业热度最高的技术领域要数大数据、云计算和人工智能了,我从13年毕业时就进入了大数据技术领域工作,在此简要谈谈自己的学习历程,希望对后来者有所启发。

其实在我大学刚毕业时(2013年),最火的技术领域是移动互联网,加上自己在校期间学过Android项目的开发,因此最开始找工作时也只是奔着做Android开发的岗位去的,只不过阴差阳错的进了一个做大数据的团队,不过现在看来,弃Android转BigData并没有选错。在刚接触大数据的时候,我并没有着急的去玩各种大数据开源项目,而是先去把理论搞清楚。为了搞清楚大数据相关的理论基础,我首先学习了Google发表的三篇论文:GFS、MapReduce、BigTable(号称是开启大数据时代的"三驾马车”), 从宏观层面了解了大数据技术产生的原因以及在尝试解决什么样的问题。在对大数据有了宏观层面的了解后,自然要动手实践了,当时我们公司有两个30多台服务器的生产集群和一个较小规模的测试集群,虽然测试环境配置不高,但对于验证集群功能还是足够的,所以这时候我就参考着官方文档所提到的各种功能特性在测试集群上一一实践。记得当时Hadoop还是1.x的版本,和现在的版本在功能以及性能上差异还是挺大的,个人觉得最大的差异就是Hadoop在2.x以后引入了Yarn这个资源管理框架以及高可用的实现。在了解了宏观层面的理论知识以及会玩一些大数据开源项目后,我觉得自己还应该再深入一点,怎么深入呢?那就去看源码吧,看看这些优秀的开源项目到底是怎样实现的。看源码也是有技巧的,首先我们不能一开始就细读,最开始我们只需要大概了解代码架构就行了,其次在接下来细读的时候,我们需要有明确的目的性。以我当初读HDFS源代码为例,我首先会去找程序的入口,因为这时候我已经从宏观层面了解到了HDFS由NameNode(NN)、JournalNode(JN)、DataNode(DN)组成,所以我首先会去看NN、JN、DN的启动过程,从项目的启动脚本里可以找到它们各自的启动类,找到启动类就好办了,直接在IDE里调试就可以了,不仅仅调试HDFS的各个进程,最后我还在IDE里将HDFS集群的所有进程都启动了起来,相当于是在IDE里模拟了一个分布式的HDFS集群。通过调试NN的启动过程,我知道了NN是怎样维护文件系统的结构以及它底层的RPC框架是怎样实现的,而且也知道了NN和JN、DN以及客户端的交互代码在什么地方。通过调试NN启动过程的代码,我对HDFS的代码架构有了一定的了解,之后再看代码时就会比较有目的性了,比如这次看客户端的写流程、下次看客户端的读流程、再下次看RPC框架的实现等等。
简单谈谈看源码的好处:

  1. 加深对开源项目了解程度,使得自己在使用时更加自信
  2. 一般大型的开源项目会用到许多优秀的其他开源项目,比如Hadoop里用到了Jetty、Guava、Protobuf, Spark里用到了Netty等,当在源代码里看到这些项目的使用时,也会促使你掌握这些项目的使用方式,进而促使你去研究这些项目的源码,也会促使你在自己的项目中自如地使用这些优秀的项目
  3. 看全世界的优秀的程序员写出的代码,也会潜移默化的影响你写出高质量的代码,提升自己的技术能力

以上就是我学习Hadoop生态系统相关技术的历程,HDFS、Yarn、MapReduce以及HBase算是深入到了源码层面,其他的如Hive、Zookeeper等还只是停留在使用层面而已,不过对于日常工作而言已经足够了。

离开第一家公司后,我选择了一家做大数据基础平台的公司。当时那家公司主要专注在实现大数据集群的可管理性、可运维性以及提供对用户友好的访问接口上。虽然我们是一家做基础软件平台的公司,但我们做出来的产品终究是要给客户使用的,因此需要有对接客户业务和技术平台的人,我当时就是在做类似的工作,具体一点的话就是前期的需求沟通、和友商PK、解决方案设计以及后期的实施维护之类等。虽然在这家公司里我并不是纯做技术,但我有机会接触客户,了解客户的应用场景,并且帮助客户设计合理的大数据解决方案,使得自己对于大数据技术的应用侧有了一定的了解。我一直觉得做技术的人还是应该多关心我们的技术到底解决了什么样的业务问题,因为毕竟技术是为解决具体问题而存在的。在这家公司里,我主要接触到了Spark生态系统里的东西,比如Spark sql、Spark streaming等,学习的过程和学习Hadoop相关技术差不多,只不过这次没有细读代码了,对于Spark的代码只是大概看了下,了解了大概的技术架构而已,主要是因为自己本身对scala不熟,但是对于日常使用来说已经足够了。

接下来谈谈关于深度学习的学习过程。其实对于深度学习技术我也只是在来到我们公司后利用业余时间学的,并没有具体的项目来推动我学习,主要是觉得自己在掌握了解决大数据的存储以及计算相关的技术后,再掌握一门强大的数据分析技术的话能使自己对于数据领域的技术掌握得更加系统,大概的数据领域的技术可以分为数据采集、数据存储、计算框架、数据分析、数据展现等,其中每一项也可以再细分,比如数据存储可以分为HDFS之类的分布式文件存储系统以及HBase之类支持随机读写的表格存储系统等,计算框架包括Yarn、Mesos等,数据分析领域包括各种提供Sql执行引擎的系统如Hive、Spark sql以及机器学习、深度学习技术等。在学习深度学习时,我先是了解了神经网络发展的一个大概历程,然后学习一些比较常用的网络架构,比如CNN、LSTM等,最后是研究一些开源深度学习框架的代码实现,总体上和学习Hadoop、Spark等技术的过程差不多,只不过深度学习等技术是强算法相关的,需要有比较深厚的统计学、概率论、微积分的知识储备,因此在学习过程中需要时不时的去学习这些知识,如果大学时这些学科学得好的话,一定是大有裨益的。在看网上的一些介绍神经网络、CNN、LSTM的介绍资料时,有些细节我始终想不明白,但只要去深入研究一下开源框架的实现代码,就会有豁然开朗的感觉,总之一句话,看开源项目代码是掌握相应技术的绝佳方式。
希望对您有所启发。

你可能感兴趣的:(大数据&深度学习学习路线)