从0开始学大数据(17)答疑:这么多技术,到底都能用在什么场景里?

答疑:这么多技术,到底都能用在什么场景里

经过前面的章节,学习了大数据最经典、最主流的一些技术和产品,今天再回过头来梳理一下这些技术和产品。

大数据技术产品

从上面这张图来看大数据技术的分类,我们可以分为存储、计算、资源管理三大类。

最基本的存储技术是 HDFS。比如在企业应用中,会把通过各种渠道得到的数据,比如关系数据库的数据、日志数据、应用程序埋点采集的数据、爬虫从外部获取的数据,统统存储到 HDFS 上,供后续的统一使用。

HBase 作为 NoSQL 类非关系数据库的代表性产品,从分类上可以划分到存储类别,它的底层存储也用到了 HDFS。HBase 的主要用途是在某些场景下,代替 MySQL 之类的关系数据库的数据存储访问,利用自己可伸缩的特性,存储比 MySQL 多得多的数据量。比如滴滴的司机每隔几秒就会将当前的 GPS 数据上传,而滴滴上的司机数量号称有上千万,每天会产生数百亿的 GPS 数据,滴滴选择将这样海量的数据存储在 HBase 中,当订单行程结束的时候,会从 HBase 读取订单行程期间的 GPS 轨迹数据,计算路程和车费。

大数据计算框架最早是 MapReduce,目前看来,用的最多的是 Spark。但从应用角度讲,我们直接编写 MapReduce 或者 Spark 程序的机会并不多,通常我们会用 Hive 或者 Spark SQL 这样的大数据仓库工具进行大数据分析和计算。

MapReduce、Spark、Hive、Spark SQL 这些技术主要用来解决离线大数据的计算,也就是针对历史数据进行计算分析,比如针对一天的历史数据计算,一天的数据是一批数据,所以也叫批处理计算。而 Storm、Spark Streaming、Flink 这类的大数据技术是针对实时的数据进行计算,比如摄像头实时采集的数据、实时的订单数据等,数据实时流动进来,所以也叫流处理大数据技术。

不管是批处理计算还是流处理计算,都需要庞大的计算资源,需要将计算任务分布到一个大规模的服务器集群上。那么如何管理这些服务器集群的计算资源,如何对一个计算请求进行资源分配,这就是大数据集群资源管理框架 Yarn 的主要作用。各种大数据计算引擎,不管是批处理还是流处理,都可以通过 Yarn 进行资源分配,运行在一个集群中。

所以上面所有这些技术在实际部署的时候,通常会部署在同一个集群中,也就是说,在由很多台服务器组成的服务器集群中,某台服务器可能运行着 HDFS 的 DataNode 进程,负责 HDFS 的数据存储;同时也运行着 Yarn 的 NodeManager,负责计算资源的调度管理;而 MapReduce、Spark、Storm、Flink 这些批处理或者流处理大数据计算引擎则通过 Yarn 的调度,运行在 NodeManager 的容器(container)里面。至于 Hive、Spark SQL 这些运行在 MapReduce 或者 Spark 基础上的大数据仓库引擎,在经过自身的执行引擎将 SQL 语句解析成 MapReduce 或者 Spark 的执行计划以后,一样提交给 Yarn 去调度执行。

这里相对比较特殊的是 HBase,作为一个 NoSQL 存储系统,HBase 的应用场景是满足在线业务数据存储访问需求,通常是 OLTP(在线事务处理)系统的一部分,为了保证在线业务的高可用和资源独占性,一般是独立部署自己的集群,和前面的 Hadoop 大数据集群分离部署。

讲到王小波的《我的精神家园》,读这本书,大概是在大学快毕业的时候,当时面临种种困惑,努力思考自己这一生应该如何度过,自己应该做一个什么样的人。

当时我就读于一所不入流的大学,在大学里面我又是个不入流的学生,从当时的趋势看,我未来的人生大概率也是不入流的人生,浑浑噩噩、蝇营狗苟度过一生。

虽然有的时候踌躇满志,也想要改变自己,将来有一天能出人头地。但是更多的时候想想自己的天分、背景,就不由得万念俱灰。进一步想,如果自己注定要平庸一生,活着又有什么意义。现在想来,当时可能是有一点抑郁的。

也就在那个时候读到了王小波的杂文集,关于人应该如何度过自己的一生,有了不一样的理解。王小波说:“我活在世上,无非想要明白些道理,遇见些有趣的人,做一些有趣的事。倘能如我所愿,我的一生就算成功。

王小波的书当时给了我一种全新的认知世界的视角,我不一定要出人头地才叫成功,我能把自己的一生过得有趣、好玩,我也就算没白活一生。

但是如果简单的把好玩、有趣理解成自得其乐、不思进取,这样的生活肯定是有问题的。看王小波的其他文章就会明白,这个好玩、有趣也不是一件容易的事,没有一定的知识、见识,没有有深度的思考,没有经历过足够的困难、挫折,就根本不能理解哪些是真正好玩、有趣的人和事。

所以你必须还是要努力拼搏、锐意进取,然后在这个过程中才能真正明白一些道理,并且会遇到一些有趣的人。“我只愿蓬勃生活在此时此刻,无所谓去哪,无所谓见谁。那些我将要去的地方,都是我从未谋面的故乡。以前是以前,现在是现在。我不能选择怎么生,怎么死;但我能决定怎么爱,怎么活。

想通了这一点后,我就不再纠结自己是不是足够的优秀,能够成就什么样的事业。我只要每天都有一点点进步,明白一点点道理,生活就是值得的。所以毕业以后我觉得编程好玩,就去自学编程;觉得自己学得差不多了,就去找了一份程序员的工作;觉得缺乏创造、不断重复的程序员工作并不好玩,就去考计算机专业的研究生;后来又去北京、杭州、上海不同的城市生活;去阿里巴巴、Intel、创业公司等不同的公司去工作;期间遇到过很多有趣的人,跟很多聪明的人合作,明白了一些道理,也做过一些有趣的事。

再说几本对我影响比较大的技术书籍。我大学读得不是计算机专业,后来偶尔在图书馆里看到一本C语言编程的书,讲图形编程和游戏编程的,当时觉得特别好玩,就开始自学编程。但是后来做了程序员以后,却发现天天按着需求写代码特别无聊,既没有挑战也没有创新,偶然看了一本名为《Effective Java》的书,发现这些常规的程序也有很多有意思的写法。

这本书讲了很多有趣的编程技巧,当时我在北京的中关村上班,每天上下班的地铁上,刚好可以看完一个技巧,很多技巧可以直接用在工作中,特别好玩。同时我也意识到,很多时候不是事情本身无趣,而是做事情的方式无趣。循规蹈矩、反复重复可以把事情做完,但是这样就会很无聊,如果去寻找更巧妙的解决之道,事情就变得有趣多了。

后来我就想,能不能把这些技巧提炼出来,让大家一起用,所以在看到《敏捷软件开发:原则、模式与实践》这本书的时候,我非常激动。在读这本书之前,我也看过设计模式的书,不过感觉这些书都把设计模式当做编程技巧来讲,虽然也有意思,但是技巧嘛,看得多了也就那么回事。

但是《敏捷软件开发》这本书把设计模式上升到设计思想的高度,书中说“软件设计不应该是面向需求设计,而应该是面向需求变更设计”,也就是说在设计的时候,主要要考虑的是当需求变更的时候,如何用最小的代价实现变更。优秀的工程师不应该害怕需求变更,而应该欢迎需求变革,因为优秀的工程师已经为需求变更做好了设计,如果没有需求变更,那就显示不出自己和只会重复的平庸工程师的区别。这就非常有意思了不是吗。

因为比较关注设计,并且后来又做了一些架构设计、框架和工具开发的工作,也因此我看到《企业应用架构模式》这本书的时候特别震撼。当时自己觉得能够做框架、工具的开发很了不起,能够做架构设计、指导其他工程师开发挺厉害,但是看了《企业应用架构模式》这本书,才发现我做的这些事情只不过是在更大的领域解决方案、架构模式里非常小的一个部分,同类的东西还有很多。当时我感觉自己真的是坐井观天、夜郎自大,也非常羞愧。

如果感觉《敏捷软件开发》的作者 Bob 大叔、《企业应用架构模式》的作者 Martin Fowler 比自己牛太多还没有太多感觉,因为毕竟隔得太远、没有交集,所以触动还不是特别大,那么后来在工作中遇到被高手全方位碾压的时候,就真正的感受到:生活还真是有意思呢。

如果你也有和我一样有过类似的困惑,不知该如何面对理想和现实之间的差距,希望我的经验可以给你一些启发。人类的进步是因为人们对美的不懈追求,而有趣也是美的一种,追逐有趣就是在追求进步,而一点一滴的进步终会引领我们实现自己的人生价值和目标。