大数据应用| 技术的学习| 社区的参与
1. 大数据应用
大数据技术,其实起源于 Google 在 2004 年前后发表的三篇论文,也就是我们经常听到的“三驾马车”,
分别是分布式文件系统 GFS、大数据分布式计算框架 MapReduce 和 NoSQL 数据库系统 BigTable。
搜索引擎主要就做两件事情,一个是网页抓取,一个是索引构建,而在这个过程中,有大量的数据需要存储和计算。这“三驾马车”其实就是用来解决这个问题的,你从介绍中也能看出
来,一个文件系统、一个计算框架、一个数据库系统。
众多 Hadoop 周边产品开始出现,大数据生态体系逐渐形成,其中包括:专门将关系数据库中的数据导入导出到 Hadoop 平台的 Sqoop;针对大规模日志进行分布式收集、聚合和传
输的 Flume;MapReduce 工作流调度引擎 Oozie 等。
2012 年,Yarn 成为一个独立的项目开始运营,随后被各类大数据产品支持,成为大数据平台上最主流的资源调度系统。
MapReduce 每执行一次 Map 和 Reduce 计算都需要重新启动一次作业,带来大量的无谓消耗。还有一点就是 MapReduce 主要使用磁盘作为存储介质
2012 年的时候,内存已经突破容量和成本限制,成为数据运行过程中主要的存储介质
像 MapReduce、Spark 这类计算框架处理的业务场景都被称作批处理计算,因为它们通常针对以“天”为单位产生的数据进行一次计算,然后得到需要的结果,这中间计算需要花费的
时间大概是几十分钟甚至更长的时
大数据流计算,相应地,有 Storm、Flink、Spark Streaming 等流计算框架来满足此类大数据应用的场景。 流式计算要处理的数据是实时在线产生的数据,所以这类计算也被称为大数
据实时计算。
NoSQL 曾经在 2011 年左右非常火爆,涌现出 HBase、Cassandra 等许多优秀的产品,其中 HBase 是从 Hadoop 中分离出来的、基于 HDFS 的 NoSQL 系统。
数据分析主要使用 Hive、Spark SQL 等 SQL 引擎完成;数据挖掘与机器学习则有专门的机器学习框架 TensorFlow、Mahout 以及 MLlib 等,内置了主要的机器学习和数据挖掘算法。
大数据应用领域:数据驱动一切
大数据在教育领域的应用
大数据在线教育利用大数据技术进行分析统计,完全可以做到根据学生能力和学习节奏,及时调整学习大纲和学习进度,提供个性化和自适应的学习体验。除此之外,人工智能在教育的其他方面也取得很好的进展。AI 外语老师、 智能解题
大数据在社交媒体领域的应用
舆情监控与分析,
舆情实时监控可用于商业领域,引导智能广告投放;可用于金融领域,辅助执行自动化股票、期权、数字货币交易;可用于社会管理,及时发现可能引发社会问题的舆论倾向。
在美国总统大选期间,候选人就曾雇佣大数据公司利用社交媒体的数据进行分析,发现选票可能摇摆的地区,有针对性前去进行竞选演讲。并利用大数据分析选民关注的话题,包装自己的竞选主张。Facebook 也因为授权大数据公司滥用自己用户的数据而遭到调查和谴责,市值蒸发了数百亿美元。
大数据在金融领域的应用
大数据风控。在金融借贷中,如何识别出高风险用户,要求其提供更多抵押、支付更高利息、调整更低的额度,甚至拒绝贷款,从而降低金融机构的风险;
利用股票、外汇等历史交易记录,分析交易规律,结合当前的新闻热点、舆论倾向、财经数据构建交易模型,进行自动化交易,这就是金融领域的量化交易。
大数据在新零售领域的应用
新零售使用大数据进行全链路管理。从生产、物流、购物体验,使用大数据进行分析和预判,实现精准生产、零库存、全新的购物体验。
亚马逊 Go 无人店使用大量的摄像头,实时捕捉用户行为,判断用户取出还是放回商品、取了何种商品等。这实际上是大数据流计算与机器学习的结合,最终实现的购物效果是,无需排队买单,进去就拿东西,拿好了就走,超级科幻有没有。
大数据在交通领域的应用
交通也是一个对大数据实时采集与处理应用比较广的领域。现在几乎所有的城市路段、交通要点都有不止一个监控摄像头在实时监控,一线城市大约有百万计的摄像头在不停地采集数据。
各种导航软件也在不停采集数据,通过分析用户当前位置和移动速度,判断道路拥堵状态,并实时修改推荐的导航路径。你如果经常开车或者打车,对这些技术一定深有体会。
无人驾驶技术,无人驾驶就是在人的驾驶过程中实时采集车辆周边数据和驾驶控制信息,然后通过机器学习,获得周边信息与驾驶方式的对应关系(自动驾驶模型)。然后将这个模型应用到无人驾驶汽车上,传感器获得车辆周边数据后,就可以通过自动驾驶模型计算出车辆控制信息(转向、刹车等)。计算自动驾驶模型需要大量的数据,所以我们看到,这些无人驾驶创业公司都在不断攀比自己的训练数据有几十万公里、几百万公里,因为训练数据的量意味着模型的完善程度。
2. 源码的阅读
通过文档来了解开源项目
通过看文档,你可以快速地掌握这个软件整体的结构,它有哪些功能特性,它涉及到的关键技术、实现原理和它的生态系统等等。在掌握了这些之后,你对它有个整体的了解,然后再去
看它的源代码,就不会再有那种盲人摸象找不到头绪的感觉了。
必须去看这些开源软件官方网站上的文档。
开源社区经过这么多年的发展,它已经形成一个相对比较成熟的文化。每个开源软件,代码如何管理、社区成员如何沟通、如何协作这些都已经形成了一个比较固定的套路。大多数开
源软件,它的官网和技术文档也是有一个相对比较固定的结构的。
以Kafka 的官网为例子,来说下怎么来看它的文档。
如果说你对这个项目完全不了解,没用过这个软件,你首先需要看的文档是Quick Start,按照 Quick Start 中的指导快速把它的环境搭起来,把它运行起来,这样你会对这个项目有个
感性认识,也便于你在后续深入学习的时候“跑”一些例子。
然后你需要找一下它的Introduction,一般里面会有项目的基本介绍。这里面很重要的一点是,你需要找到这个项目用到的一些基本概念或者名词的介绍文档,在 Kafka 的文档中,这
些内容就在 Introduction 里面,比如 Topic、Producer、 Consumer、Partition 这些概念在 Kafka 中代表的含义。
有些开源项目会单独有一个 Basic Concepts 文档来讲这些基础概念。这个文档非常重要,因为这些开源社区的开发者都有个很不好的爱好:发明概念。很多开源项目都会自己创造一
些名词或者概念,了解这些基本概念才有可能看懂它项目的其他文档。
对项目有个基本的了解之后呢,接下来你可以看一下它的使用场景、功能特性以及相关的生态系统的介绍。在 Kafka 中功能相关的内容在Use cases和EcoSystem两篇文章中,有些项
目中会有类似名为 Features 的文档介绍功能和特性。
其中项目的生态系统,也就是 EcoSystem,一般会介绍它这个项目适用的一些典型的使用场景,在某个场景下适合与哪些其他的系统一起来配合使用等。如果说你的系统不是特别特
殊或者说冷门的话,你大概率可以在 EcoSystem 里面找到和你类似的场景,可以少走很多的弯路。
你在读完上面这些文档之后,对这个项目的整体应该会有一个比较全面的了解了,比如说:
- 这个项目是干什么的?
- 能解决哪些问题?
- 适合在哪些场景使用?
- 有哪些功能?
- 如何使用?
对这些问题有一个初步的答案之后,接下来你就可以去深入学习它的实现原理了。这是不是意味着,你可以立即去看它的源码呢?这样做或许可行,但并不是最好的方法。
你知道大部分开源项目都是怎么诞生的吗?一般来说是这样的:某个大学或者大厂的科学家,某天脑海里突然出现了一个改变世界的想法,科学家们会基于这个想法做一些深入的研究,然后写了一篇论文在某个学术期刊或者会议上发表。论文发表后在业内获得很多的赞,这时候就轮到像 Google、Facebook 这样的大厂出手了:这个论文很有价值,不如我们把它实现出来吧?一个开源项目就这样诞生了。
所以,对于这样的开源项目,它背后的这篇论文就是整个项目的灵魂,你如果能把这篇论文看完并且理解透了,这个项目的实现原理也就清楚了。
对于 Kafka 来说,它的灵魂是这篇博文:The Log: What every software engineer should know about real-time data’s unifying abstraction,对应的中文译稿在这里:《日志:每个软件工程师都应该知道的有关实时数据的统一抽象》。
这篇博文被评为程序员史诗般必读文章,无论你是不是想了解 Kafka 的实现原理,我都强烈推荐你好好读一下上面这篇博文。
学习完项目灵魂,就可以开始阅读源码了。
用以点带面的方式来阅读源码
需要注意的是,你在读源码的时候,千万不要上来就找 main 方法这样泛泛地去看,为什么?你可以想一下,一篇文章,它是一个线性结构,你从前往后读就行了。一本书呢?如果我们看目录的话,可以认为是个树状结构,但大多数的书的内容还是按照线性结构来组织的,你可以从前往后读,也可以通过目录跳着读。
那程序的源代码是什么结构?那是一个网状结构,关系错综复杂,所以这种结构是非常不适合人类去阅读的。你如果是泛泛去读源代码,很容易迷失在这个代码织成的网里面。那怎么办?
我推荐大家阅读源码的方式是,带着问题去读源码,最好是带着问题的答案去读源码。你每次读源码之前,确定一个具体的问题,比如:
- RocketMQ 的消息是怎么写到文件里的?
- Kafka 的 Coordinator 是怎么维护消费位置的?
类似这种非常细粒度的问题,粒度细到每个问题的答案就是一两个流程就可以回答,这样就可以了。如果说你就想学习一下源代码,或者说提不出这些问题怎么办呢?答案还是,看文档。
确定问题后,先不要着急看源代码,而是应该先找一下是否有对应的实现文档,一般来说,核心功能都会有专门的文档来说明它的实现原理,比如在 Kafka 的文档中,DESIGN和IMPLEMENTATION两个章节中,介绍了 Kafka 很多功能的实现原理和细节。一些更细节的非核心的功能不一定有专门的文档来说明,但是我们可以去找一找是否有对应的 Improvement Proposal。(Kafka 的所有 Improvement Proposals 在这里。)
这个 Improvement Proposal 是什么呢?你可以认为它是描述一个新功能的文档,一般开源项目需要增加一个新的功能或者特性的时候,都会创建一个 Improvement Proposal,一般标题都是"xIP- 新功能名称",其中 IP 就是 Improvement Proposal 的缩写,x 一般就是这个开源项目的名称的首字母,比如 Kafka 中 Improvement Proposal 的标题就都是以 KIP 来开头。
每个 Improvement Proposal 都是有固定格式的,一般要说明为什么需要增加这个功能,会对系统产生那些影响和改变,还有我们最关心的设计和实现原理的简述。
你读完讲解实现的文档再去看源代码,也就是我刚刚说的,不只是带着问题去读,而是带着答案去读源码。这样你在读源码的时候,不仅仅是更容易理解源代码,还可以把更多的精力放在一些实现细节上,这样阅读源码的效果会更好。
使用这种以问题为阅读单元的方式来读源代码,你每次只要花很短的时间,阅读很少的一部分源码,就能解决一个问题,得到一些收获。这种方式其实是通过一个一个的问题,在网状的源代码中,每次去读几个点组成的那一两条线。随着你通过阅读源码了解的问题越来越多,你对项目源码的理解也会越来越全面和深入。
3. 开源社区的参与
如何参与 Apache 这样开源社区的软件开发,深入了解 开源软件的一些运行机制,同时也可以了解 Apache 开源社区的运作模式。
遇到各种问题,想要解决这些问题,你可以直接到官方的开源社区去求助并寻找答案。在使用过程中,如果这些大数据产品不能满足你的需求,你可以阅读源代码并直接对源代码进行
修改和优化。因为你在实践过程中产生的需求可能其他人也会有,你可以将你修改的源代码提交到开源社区,请求合并到发布版本上,供全世界开发者使用。这也是开源最大的魅力。
Apache 开源社区的组织和参与方式
Apache 是一个以基金会方式运作的非盈利开源软件组织,旗下有超过一百个各类开源软件,其中不乏 Apache、Tomcat、Kafka 等知名的开源软件,当然也包括 Hadoop、Spark 等最
主流的大数据开源软件。
Apache 每个项目的管理团队叫项目管理委员会(PMC),一般由项目发起者、核心开发者、Apache 基金会指定的资深导师组成,主导整个项目的发展。此外,项目的主要开发者叫
作 committer,是指有将代码合并到主干代码权限的开发者,而其他没有代码合并权限的开发者叫作 contributor。
一般说来,参与 Apache 开源产品开发,先从 contributor 做起。一般的流程是,从 GitHub 项目仓库 fork 代码到自己的仓库,在自己仓库修改代码然后创建 pull request,提交到
Spark 仓库后,如果有 committer 认为没问题,就 merge 到 Spark 主干代码里。
一旦你为某个 Apache 项目提交的代码被 merge 到代码主干,你就可以宣称自己是这个项目的 contributor 了,甚至可以写入自己的简历。如果能持续提交高质量的代码,甚至直接负
责某个模块,你就有可能被邀请成为 committer,会拥有一个 apache.org 后缀的邮箱。
当然我希望你提交的是有质量的代码,而不仅仅是对代码注释里某个单词拼写错误进行修改,然后就号称自己是某个著名开源项目的 contributor 了。虽然修改注释也是有价值的,但
是如果你的 pull request 总是修改注释的拼写错误,很难被认为是一个严肃的开发者。
除了 Apache,Linux、以太坊等开源基金会的组织和运作方式也都类似。