This commit is contained in:
louzefeng
2024-07-11 05:50:32 +00:00
parent bf99793fd0
commit d3828a7aee
6071 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
<audio id="audio" title="26 | 互联网产品 + 大数据产品 = 大数据平台" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/99/3a/992dedf22ee6f8dce8e8210b481a253a.mp3"></audio>
从今天开始,我们进入专栏的“大数据平台与系统集成”模块。
前面我讲了各种大数据技术的原理与架构大数据计算通过将可执行的代码分发到大规模的服务器集群上进行分布式计算以处理大规模的数据即所谓的移动计算比移动数据更划算。但是在分布式系统中分发执行代码并启动执行这样的计算方式必然不会很快即使在一个规模不太大的数据集上进行一次简单计算MapReduce也可能需要几分钟Spark快一点也至少需要数秒的时间。
而互联网产品处理用户请求需要毫秒级的响应也就是说要在1秒内完成计算因此大数据计算必然不能实现这样的响应要求。但是互联网应用又需要使用大数据实现统计分析、数据挖掘、关联推荐、用户画像等一系列功能。
那么如何才能弥补这互联网和大数据系统之间的差异呢?解决方案就是将面向用户的互联网产品和后台的大数据系统整合起来,也就是今天我要讲的构建一个大数据平台。
大数据平台,顾名思义就是整合网站应用和大数据系统之间的差异,将应用程序产生的数据导入到大数据系统,经过处理计算后再导出给应用程序使用。
下图是一个典型的互联网大数据平台的架构。
<img src="https://static001.geekbang.org/resource/image/5f/1f/5f0515ad5740575ff79ac8c68990071f.png" alt="">
在这张架构图中,大数据平台里面向用户的在线业务处理组件用褐色标示出来,这部分是属于互联网在线应用的部分,其他蓝色的部分属于大数据相关组件,使用开源大数据产品或者自己开发相关大数据组件。
你可以看到,大数据平台由上到下,可分为三个部分:数据采集、数据处理、数据输出与展示。
**数据采集**
将应用程序产生的数据和日志等同步到大数据系统中由于数据源不同这里的数据同步系统实际上是多个相关系统的组合。数据库同步通常用Sqoop日志同步可以选择Flume打点采集的数据经过格式化转换后通过Kafka等消息队列进行传递。
不同的数据源产生的数据质量可能差别很大,数据库中的数据也许可以直接导入大数据系统就可以使用了,而日志和爬虫产生的数据就需要进行大量的清洗、转化处理才能有效使用。
**数据处理**
这部分是大数据存储与计算的核心数据同步系统导入的数据存储在HDFS。MapReduce、Hive、Spark等计算任务读取HDFS上的数据进行计算再将计算结果写入HDFS。
MapReduce、Hive、Spark等进行的计算处理被称作是离线计算HDFS存储的数据被称为离线数据。在大数据系统上进行的离线计算通常针对某一方面的全体数据比如针对历史上所有订单进行商品的关联性挖掘这时候数据规模非常大需要较长的运行时间这类计算就是离线计算。
除了离线计算还有一些场景数据规模也比较大但是要求处理的时间却比较短。比如淘宝要统计每秒产生的订单数以便进行监控和宣传。这种场景被称为大数据流式计算通常用Storm、Spark Steaming等流式大数据引擎来完成可以在秒级甚至毫秒级时间内完成计算。
**数据输出与展示**
前面我说过大数据计算产生的数据还是写入到HDFS中但应用程序不可能到HDFS中读取数据所以必须要将HDFS中的数据导出到数据库中。数据同步导出相对比较容易计算产生的数据都比较规范稍作处理就可以用Sqoop之类的系统导出到数据库。
这时,应用程序就可以直接访问数据库中的数据,实时展示给用户,比如展示给用户关联推荐的商品。淘宝卖家的量子魔方之类的产品,其数据都来自大数据计算产生。
除了给用户访问提供数据,大数据还需要给运营和决策层提供各种统计报告,这些数据也写入数据库,被相应的后台系统访问。很多运营和管理人员,每天一上班,就是登录后台数据系统,查看前一天的数据报表,看业务是否正常。如果数据正常甚至上升,就可以稍微轻松一点;如果数据下跌,焦躁而忙碌的一天马上就要开始了。
将上面三个部分整合起来的是任务调度管理系统不同的数据何时开始同步各种MapReduce、Spark任务如何合理调度才能使资源利用最合理、等待的时间又不至于太久同时临时的重要任务还能够尽快执行这些都需要任务调度管理系统来完成。
有时候,对分析师和工程师开放的作业提交、进度跟踪、数据查看等功能也集成在这个任务调度管理系统中。
简单的大数据平台任务调度管理系统其实就是一个类似Crontab的定时任务系统按预设时间启动不同的大数据作业脚本。复杂的大数据平台任务调度还要考虑不同作业之间的依赖关系根据依赖关系的DAG图进行作业调度形成一种类似工作流的调度方式。
对于每个公司的大数据团队最核心开发、维护的也就是这个系统大数据平台上的其他系统一般都有成熟的开源软件可以选择但是作业调度管理会涉及很多个性化的需求通常需要团队自己开发。开源的大数据调度系统有Oozie也可以在此基础进行扩展。
上面我讲的这种大数据平台架构也叫Lambda架构是构建大数据平台的一种常规架构原型方案。Lambda架构原型请看下面的图。
<img src="https://static001.geekbang.org/resource/image/a3/f2/a3e7631959591ea2b1787e0c90c90ff2.png" alt="">
1.数据new data同时写入到批处理大数据层batch layer和流处理大数据层speed layer
2.批处理大数据层是数据主要存储与计算的地方,所有的数据最终都会存储到批处理大数据层,并在这里被定期计算处理。
3.批处理大数据层的计算结果输出到服务层serving layer供应用使用者查询访问。
4.由于批处理的计算速度比较慢数据只能被定期处理计算比如每天因此延迟也比较长只能查询到截止前一天的数据即数据输出需要T+1。所以对于实时性要求比较高的查询会交给流处理大数据层speed layer在这里进行即时计算快速得到结果。
5.流处理计算速度快,但是得到的只是最近一段时间的数据计算结果(比如当天的);批处理会有延迟,但是有全部的数据计算结果。所以查询访问会将批处理计算的结果和流处理计算的结果合并起来,作为最终的数据视图呈现。
## 小结
我们看下一个典型的互联网企业的数据流转。用户通过App等互联网产品使用企业提供的服务这些请求实时不停地产生数据由系统进行实时在线计算并把结果数据实时返回用户这个过程被称作在线业务处理涉及的数据主要是用户自己一次请求产生和计算得到的数据。单个用户产生的数据规模非常小通常内存中一个线程上下文就可以处理。但是大量用户并发同时请求系统对系统而言产生的数据量就非常可观了比如天猫“双十一”开始的时候一分钟就有数千万用户同时访问天猫的系统。
在线数据完成和用户的交互后,会以数据库或日志的方式存储在系统的后端存储设备中,大量的用户日积月累产生的数据量非常庞大,同时这些数据中蕴藏着大量有价值的信息需要计算。但是我们没有办法直接在数据库以及磁盘日志中对这些数据进行计算,前面我们也一再讨论过大规模数据计算的挑战,所以需要将这些数据同步到大数据存储和计算系统中进行处理。
但是这些数据并不会立即被数据同步系统导入到大数据系统而是需要隔一段时间再同步通常是隔天比如每天零点后开始同步昨天24小时在线产生的数据到大数据平台。因为数据已经距其产生间隔了一段时间所以这些数据被称作离线数据。
离线数据被存储到HDFS进一步由Spark、Hive这些离线大数据处理系统计算后再写入到HDFS中由数据同步系统同步到在线业务的数据库中这样用户请求就可以实时使用这些由大数据平台计算得到的数据了。
离线计算可以处理的数据规模非常庞大,可以对全量历史数据进行计算,但是对于一些重要的数据,需要实时就能够进行查看和计算,而不是等一天,所以又会用到大数据流式计算,对于当天的数据实时进行计算,这样全量历史数据和实时数据就都被处理了。
我的专栏前面三个模块都是关于大数据产品的,但是在绝大多数情况下,我们都不需要自己开发大数据产品,我们仅仅需要用好这些大数据产品,也就是如何将大数据产品应用到自己的企业中,将大数据产品和企业当前的系统集成起来。
大数据平台听起来高大上,事实上它充当的是一个粘合剂的作用,将互联网线上产生的数据和大数据产品打通,它的主要组成就是数据导入、作业调度、数据导出三个部分,因此开发一个大数据平台的技术难度并不高。前面也有同学提问说,怎样可以转型做大数据相关业务,我觉得转型去做大数据平台开发也许是一个不错的机会。
## 思考题
如果你所在的公司安排你去领导开发公司的大数据平台,你该如何开展工作?建议从资源申请、团队组织、跨部门协调、架构设计、开发进度、推广实施多个维度思考。
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。

View File

@@ -0,0 +1,100 @@
<audio id="audio" title="27 | 大数据从哪里来?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f7/f3/f7ce2d5f4510b09727e2be7efd8716f3.mp3"></audio>
大数据就是存储、计算、应用大数据的技术,如果没有数据,所谓大数据就是无源之水、无本之木,所有技术和应用也都无从谈起。可以说,数据在大数据的整个生态体系里面拥有核心的、最无可代替的地位。很多从事机器学习和人工智能的高校学者选择加入互联网企业,并不是贪图企业给的高薪,而是因为只有互联网企业才有他们做研究需要用到的大量数据。
技术是通用的,算法是公开的,只有数据需要自己去采集。因此数据采集是大数据平台的核心功能之一,也是大数据的来源。数据可能来自企业内部,也可能是来自企业外部,大数据平台的数据来源主要有数据库、日志、前端程序埋点、爬虫系统。
## 从数据库导入
在大数据技术风靡之前关系数据库RDMS是数据分析与处理的主要工具我们已经在关系数据库上积累了大量处理数据的技巧、知识与经验。所以当大数据技术出现的时候人们自然而然就会思考能不能将关系数据库数据处理的技巧和方法转移到大数据技术上于是Hive、Spark SQL、Impala这样的大数据SQL产品就出现了。
虽然Hive这样的大数据产品可以提供和关系数据库一样的SQL操作但是互联网应用产生的数据却还是只能记录在类似MySQL这样的关系数据库上。这是因为互联网应用需要实时响应用户操作基本上都是在毫级完成用户的数据读写操作通过前面的学习我们知道大数据不是为这种毫秒级的访问设计的。
所以要用大数据对关系数据库上的数据进行分析处理必须要将数据从关系数据库导入到大数据平台上。上一期我提到了目前比较常用的数据库导入工具有Sqoop和Canal。
Sqoop是一个数据库批量导入导出工具可以将关系数据库的数据批量导入到Hadoop也可以将Hadoop的数据导出到关系数据库。
Sqoop数据导入命令示例如下。
```
$ sqoop import --connect jdbc:mysql://localhost/db --username foo --password --table TEST
```
你需要指定数据库URL、用户名、密码、表名就可以将数据表的数据导入到Hadoop。
Sqoop适合关系数据库数据的批量导入如果想实时导入关系数据库的数据可以选择Canal。
Canal是阿里巴巴开源的一个MySQL binlog获取工具binlog是MySQL的事务日志可用于MySQL数据库主从复制Canal将自己伪装成MySQL从库从MySQL获取binlog。
<img src="https://static001.geekbang.org/resource/image/f8/6d/f84e49e679c9444812200ba0b079ce6d.png" alt="">
而我们只要开发一个Canal客户端程序就可以解析出来MySQL的写操作数据将这些数据交给大数据流计算处理引擎就可以实现对MySQL数据的实时处理了。
## 从日志文件导入
日志也是大数据处理与分析的重要数据来源之一应用程序日志一方面记录了系统运行期的各种程序执行状况一方面也记录了用户的业务处理轨迹。依据这些日志数据可以分析程序执行状况比如应用程序抛出的异常也可以统计关键业务指标比如每天的PV、UV、浏览数Top N的商品等。
Flume是大数据日志收集常用的工具。Flume最早由Cloudera开发后来捐赠给Apache基金会作为开源项目运营。Flume架构如下。
<img src="https://static001.geekbang.org/resource/image/33/76/33e564d2c4f292584eab32c488f13a76.png" alt="">
从图上看Flume收集日志的核心组件是Flume Agent负责将日志从数据源收集起来并保存到大数据存储设备。
Agent Source负责收集日志数据支持从Kafka、本地日志文件、Socket通信端口、Unix标准输出、Thrift等各种数据源获取日志数据。
Source收集到数据后将数据封装成event事件发送给Channel。Channel是一个队列有内存、磁盘、数据库等几种实现方式主要用来对event事件消息排队然后发送给Sink。
Sink收到数据后将数据输出保存到大数据存储设备比如HDFS、HBase等。Sink的输出可以作为Source的输入这样Agent就可以级联起来依据具体需求组成各种处理结构比如下图的结构。
<img src="https://static001.geekbang.org/resource/image/c9/84/c95302bac6f6cff1653e65382f918b84.png" alt="">
这是一个日志顺序处理的多级Agent结构也可以将多个Agent输出汇聚到一个Agent还可以将一个Agent输出路由分发到多个Agent根据实际需求灵活组合。
<img src="https://static001.geekbang.org/resource/image/05/bf/057e3a89a22cc6a77c9c892b7cdd4ebf.png" alt="">
## 前端埋点采集
前端埋点数据采集也是互联网应用大数据的重要来源之一,用户的某些前端行为并不会产生后端请求,比如用户在一个页面的停留时间、用户拖动页面的速度、用户选中一个复选框然后又取消了。这些信息对于大数据处理,对于分析用户行为,进行智能推荐都很有价值。但是这些数据必须通过前端埋点获得,所谓前端埋点,就是应用前端为了进行数据统计和分析而采集数据。
事实上,互联网应用的数据基本都是由用户通过前端操作产生的,有些互联网公司会将前端埋点数据当作最主要的大数据来源,用户所有前端行为,都会埋点采集,再辅助结合其他的数据源,构建自己的大数据仓库,进而进行数据分析和挖掘。
对于一个互联网应用当我们提到前端的时候可能指的是一个App程序比如一个iOS应用或者Android应用安装在用户的手机或者pad上也可能指的是一个PC Web前端使用PC浏览器打开也可能指一个H5前端由移动设备浏览器打开还可能指的是一个微信小程序在微信内打开。这些不同的前端使用不同的开发语言开发运行在不同的设备上每一类前端都需要解决自己的埋点问题。
埋点的方式主要有手工埋点和自动化埋点。
手工埋点就是前端开发者手动编程将需要采集的前端数据发送到后端的数据采集系统。通常公司会开发一些前端数据上报的SDK前端工程师在需要埋点的地方调用SDK按照接口规范传入相关参数比如ID、名称、页面、控件等通用参数还有业务逻辑数据等SDK将这些数据通过HTTP的方式发送到后端服务器。
自动化埋点则是通过一个前端程序SDK自动收集全部用户操作事件然后全量上传到后端服务器。自动化埋点有时候也被称作无埋点意思是无需埋点实际上是全埋点即全部用户操作都埋点采集。自动化埋点的好处是开发工作量小数据规范统一。缺点是采集的数据量大很多数据采集来也不知道有什么用白白浪费了计算资源特别是对于流量敏感的移动端用户而言因为自动化埋点采集上传花费了大量的流量可能因此成为卸载应用的理由这样就得不偿失了。在实践中有时候只是针对部分用户做自动埋点抽样一部分数据做统计分析。
介于手工埋点和自动化埋点之间的,还有一种方案是可视化埋点。通过可视化的方式配置哪些前端操作需要埋点,根据配置采集数据。可视化埋点实际上是可以人工干预的自动化埋点。
就我所见在很多公司前端埋点都是一笔糊涂账。很多公司对于数据的需求没有整体规划和统一管理数据分析师、商业智能BI工程师、产品经理、运营人员、技术人员都会在数据采集这里插一脚却没有专门的数据产品经理来统一负责数据采集的规划和需求工作。很多需要的数据没有采集更多没用的数据却被源源不断地被采集存储起来。
不同于业务需求,功能和价值大多数时候都是实实在在的。数据埋点需求的价值很多时候不能直观看到,所以在开发排期上往往被当作低优先级的需求。而很多埋点也确实最后没起到任何作用,加剧了大家这种印象。老板觉得数据重要,却又看不到足够的回报,也渐渐心灰意冷。
所以专业的事情需要专业对待,从安排专业的人专门负责开始。
## 爬虫系统
通过网络爬虫获取外部数据也是公司大数据的重要来源之一。有些数据分析需要行业数据支撑,有些管理和决策需要竞争对手的数据做对比,这些数据都可以通过爬虫获取。
对于百度这样的公开搜索引擎如果遇到网页声明是禁止爬虫爬取的通常就会放弃。但是对于企业大数据平台的爬虫常常被禁止爬取的数据才是真正需要的数据比如竞争对手的数据。被禁止爬取的应用通常也会采用一些反爬虫技术比如检查请求的HTTP头信息是不是爬虫以及对参数进行加密等。遇到这种情况需要多花一点技术手段才能爬到想要的数据。
## 小结
各种形式的数据从各种数据源导入到大数据平台,进行数据处理计算后,又将数据导出到数据库,完成数据的价值实现。输入的数据格式繁杂、数据量大、冗余信息多,而输出的数据则结构性更好,用更少的数据包含了更多的信息,这在热力学上,被称作熵减。
熵是表征系统无序状态的一个物理学参量,系统越无序、越混乱,熵越大。我们这个宇宙的熵一刻不停地在增加,当宇宙的熵达到最大值的时候,就是宇宙寂灭之时。虽然宇宙的熵在不停增加,但是在局部,或者某些部分、某些子系统的熵却可以减少。
比如地球,似乎反而变得更加有序,熵正在减少,主要原因在于这些熵在减少的系统在吸收外部能量,地球在吸收太阳的能量,实现自己熵的减少。大数据平台想要实现数据的熵的减少,也必须要吸收外部的能量,这个能量来自于工程师和分析师的算法和计算程序。
如果算法和程序设计不合理,那么熵可能就不会下降多少,甚至可能增加。所以大数据技术人员在审视自己工作的时候,可以从熵的视角看看,是不是输出了更有价值、更结构化的数据,是不是用更少量的数据包含了更多的信息。
人作为一个系统,从青壮到垂老,熵也在不停增加。要想减缓熵增的速度,必须从外部吸收能量。物质上,合理饮食,锻炼身体;精神上,不断学习,参与有价值的工作。那些热爱生活、好好学习、积极工作的人是不是看起来更年轻,而整日浑浑噩噩的人则老得更快。
## 思考题
前面提到,爬虫在采集数据的时候,可能会遇到对方的反爬虫策略,反爬虫策略有哪些?如何应对这些反爬虫策略?
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。

View File

@@ -0,0 +1,77 @@
<audio id="audio" title="28 | 知名大厂如何搭建大数据平台?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/b9/6b/b9193561b7db2e4e77bdb8c19212516b.mp3"></audio>
专栏第26期我介绍了一个常规的大数据平台架构方案这种架构方案是基于大数据平台Lamda架构进行设计的。事实上业界也基本是按照这种架构模型搭建自己的大数据平台。
今天我们来看一下淘宝、美团和滴滴的大数据平台,一方面进一步学习大厂大数据平台的架构,另一方面也学习大厂的工程师如何画架构图。通过大厂的这些架构图,你就会发现,不但这些知名大厂的大数据平台设计方案大同小异,架构图的画法也有套路可以寻觅。
## 淘宝大数据平台
淘宝可能是中国互联网业界较早搭建了自己大数据平台的公司下图是淘宝早期的Hadoop大数据平台比较典型。
<img src="https://static001.geekbang.org/resource/image/cb/66/cb45bdbe16771738adf04e76b91ffc66.png" alt="">
淘宝的大数据平台基本也是分成三个部分上面是数据源与数据同步中间是云梯1也就是淘宝的Hadoop大数据集群下面是大数据的应用使用大数据集群的计算结果。
数据源主要来自Oracle和MySQL的备库以及日志系统和爬虫系统这些数据通过数据同步网关服务器导入到Hadoop集群中。其中DataExchange非实时全量同步数据库数据DBSync实时同步数据库增量数据TimeTunnel实时同步日志和爬虫数据。数据全部写入到HDFS中。
<img src="https://static001.geekbang.org/resource/image/72/81/72e8b66653211df4aa0c33a786340081.png" alt="">
在Hadoop中的计算任务会通过天网调度系统根据集群资源和作业优先级调度作业的提交和执行。计算结果写入到HDFS再经过DataExchange同步到MySQL和Oracle数据库。处于平台下方的数据魔方、推荐系统等从数据库中读取数据就可以实时响应用户的操作请求。
淘宝大数据平台的核心是位于架构图左侧的天网调度系统提交到Hadoop集群上的任务需要按序按优先级调度执行Hadoop集群上已经定义好的任务也需要调度执行何时从数据库、日志、爬虫系统导入数据也需要调度执行何时将Hadoop执行结果导出到应用系统的数据库也需要调度执行。可以说整个大数据平台都是在天网调度系统的统一规划和安排下进行运作的。
DBSync、TimeTunnel、DataExchange这些数据同步组件也是淘宝内部开发的可以针对不同的数据源和同步需求进行数据导入导出。这些组件淘宝大都已经开源我们可以参考使用。
## 美团大数据平台
美团大数据平台的数据源来自MySQL数据库和日志数据库通过Canal获得MySQL的binlog输出给消息队列Kafka日志通过Flume也输出到Kafka。
<img src="https://static001.geekbang.org/resource/image/24/08/249bfac48d6b191a452ecc6634e02a08.png" alt="">
Kafka的数据会被流式计算和批处理计算两个引擎分别消费。流处理使用Storm进行计算结果输出到HBase或者数据库。批处理计算使用Hive进行分析计算结果输出到查询系统和BI商业智能平台。
数据分析师可以通过BI产品平台进行交互式的数据查询访问也可以通过可视化的报表工具查看已经处理好的常用分析指标。公司高管也是通过这个平台上的天机系统查看公司主要业务指标和报表。
美团大数据平台的整个过程管理通过调度平台进行管理。公司内部开发者使用数据开发平台访问大数据平台进行ETL数据提取、转换、装载开发提交任务作业并进行数据管理。
## 滴滴大数据平台
滴滴大数据平台分为实时计算平台(流式计算平台)和离线计算平台(批处理计算平台)两个部分。
实时计算平台架构如下。数据采集以后输出到Kafka消息队列消费通道有两个一个是数据ETL使用Spark Streaming或者Flink将数据进行清洗、转换、处理后记录到HDFS中供后续批处理计算。另一个通道是Druid计算实时监控指标将结果输出到报警系统和实时图表系统DashBoard。
<img src="https://static001.geekbang.org/resource/image/db/ce/db71097f009f6dd53910cc984ed96fce.png" alt="">
离线计算平台架构如下。滴滴的离线大数据平台是基于Hadoo 2HDFS、Yarn、MapReduce和Spark以及Hive构建在此基础上开发了自己的调度系统和开发系统。调度系统和前面其他系统一样调度大数据作业的优先级和执行顺序。开发平台是一个可视化的SQL编辑器可以方便地查询表结构、开发SQL并发布到大数据集群上。
<img src="https://static001.geekbang.org/resource/image/23/4b/239dd0686a1b8edce3cac6fb82027c4b.png" alt="">
此外滴滴还对HBase重度使用并对相关产品HBase、Phoenix做了一些自定义的开发维护着一个和实时、离线两个大数据平台同级别的HBase平台它的架构图如下。
<img src="https://static001.geekbang.org/resource/image/66/77/66bfbc37ac0cb63ae9f3b5a6c098c777.png" alt="">
来自于实时计算平台和离线计算平台的计算结果被保存到HBase中然后应用程序通过Phoenix访问HBase。而Phoenix是一个构建在HBase上的SQL引擎可以通过SQL方式访问HBase上的数据。
## 小结
你可以看到,这些知名大厂的大数据平台真的是大同小异,他们根据各自场景和技术栈的不同,虽然在大数据产品选型和架构细节上略有调整,但整体思路基本上都是一样的。
不过也正是这种大同小异,让我们从各个角度更加了解大数据平台架构,对大数据平台架构有了更加深刻的认知。
我在阿里巴巴工作期间,有一阵子不断参加各种基础技术产品的架构评审会。有一次,另一个和我一样经常参加这类会议的架构师说:“我感觉这些产品的架构怎么都一样”。被他一说,大家都纷纷点头称是,好像确实如此。
同一类问题的解决方案通常也是相似的。一个解决方案可以解决重复出现的同类问题,这种解决方案就叫作模式。模式几乎是无处不在的,一旦一个解决方案被证明是行之有效的,就会被重复尝试解决同类的问题。
所以我们看到很多大数据产品的架构也都是差不多的比如Hadoop 1、Yarn、Spark、Flink、Storm这些产品的部署架构真的是太像了。
对于有志于成为架构师的工程师来说,一方面当然是提高自己的编程水平,另一方面也可以多看看各种架构设计文档,多去参加一些架构师技术大会。在我看来,编程需要天分;而架构设计,真的是孰能生巧。
## 思考题
下图是腾讯的大数据平台架构,请你尝试对这个架构图的主要组件和运行机制进行分析。
<img src="https://static001.geekbang.org/resource/image/cd/88/cd23d9032e00b1e2c2451b30bca36788.png" alt="">
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。

View File

@@ -0,0 +1,93 @@
<audio id="audio" title="29 | 盘点可供中小企业参考的商业大数据平台" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3f/8a/3ff59c6ba0ad341ebb9ffab6ab33ad8a.mp3"></audio>
专栏前面我讲了,稍具规模的互联网企业都会搭建自己的大数据平台。但是有同学会问,对于更多的中小企业和初创公司而言,自己搭建大数据平台的成本是不是有点高。确实,拿一个开源的软件搭建自己的大数据平台,对于中小企业来说,无论是人才储备还是服务器成本,似乎都有点难以承受。所幸,还有商业大数据平台可供选择。
今天我就来和你盘点一下可供中小企业参考的商业大数据平台。
## 大数据解决方案提供商
Hadoop作为一个开源产品关注的是大数据技术实现和产品功能。但是要把Hadoop这样的技术产品在企业真正应用起来还有很多事情要做企业目前的技术体系如何与Hadoop集成起来具体的解决方案如何实现如何去做Hadoop的部署、优化、维护遇到技术问题该怎么办企业需要的功能Hadoop不支持怎么办
Cloudera是最早开展商业大数据服务的公司面向企业提供商业解决方案也就是支持企业解决我上面所说的问题。Cloudera提供技术咨询服务为企业向大数据转型提供技术支持。同时Cloudera也开发了自己的商业产品最主要的就是CDH。
<img src="https://static001.geekbang.org/resource/image/0d/a5/0d39421894307c4b6098a031d8621ea5.png" alt="">
CDH是一个大数据集成平台将主流大数据产品都集成到这个平台中企业可以使用CDH一站式部署整个大数据技术栈。从架构分层角度CDH可以分为4层系统集成大数据存储统一服务过程、分析与计算。
1.系统集成数据库导入导出用Sqoop日志导入导出用Flume其他实时数据导入导出用Kafka。
2.大数据存储文件系统用HDFS结构化数据用KuduNoSQL存储用HBase其他还有对象存储。
3.统一服务资源管理用Yarn安全管理用Sentry和RecordService细粒度地管理不同用户数据的访问权限。
4.过程、分析与计算批处理计算用MapReduce、Spark、Hive、Pig流计算用Spark Streaming快速SQL分析用Impala搜索服务用Solr。
值得一提的是Cloudera也是Apache Hadoop的主要代码贡献者。而开源产品也需要大的商业开发者的支持如果仅仅就是零零散散的个人开发者这样的开源产品的发展将很快失控。而商业公司也需要参与开源产品的开发保证开源产品的发展路径和自己的商业目标保持一致。
除了Cloudera还有一家比较大的大数据商业服务公司叫HortonWorks。近期2018年10月Cloudera和HortonWorks宣布合并这样全球范围内大数据商业服务的格局基本已定。这或许意味着大数据技术领域的创新将进入微创新阶段。
国内本土和Cloudera对标的公司是星环科技商业模式和Cloudera一样主要是为政府和传统企业向大数据转型过程中提供技术支持服务。核心产品是类似CDH的TDH如下图所示。
<img src="https://static001.geekbang.org/resource/image/47/43/47b381b12b966b6276935814936ff443.png" alt="">
面向企业提供解决方案是早期IT服务厂商的主要商业模式通过产品、服务、技术支持等方式向企业收费。IBM、微软、Oracle都是基于这样的商业模式赚得盆满钵满。早期的Cloudera也是基于这样的商业模式并很快崛起。但是技术时代的变革来的实在是太快了幸福的日子很快就过去了。
## 大数据云计算服务商
Oracle、微软这样的传统IT企业主要服务对象是企业和政府营收和利润自然也主要来自企业和政府。所以当互联网开始崛起的时候虽然以Google为代表的互联网公司很快就在技术领域取代了微软们的领先地位但是大家的商业模式不同井水不犯河水倒也相安无事。
后来Google、亚马逊这样的互联网公司发展出云计算这样的商业模式企业无需购买、部署自己的服务器只需要按需购买云服务就可以使用各种各样的计算资源比如虚拟主机、缓存、数据库等。相比以往自建数据中心企业可以以更低的成本、更简单的方式、更灵活的手段使用云计算。随着云计算的快速发展阿里巴巴等互联网企业也快速跟进侵蚀以往IT巨头的企业领域市场让Oracle这样的IT大厂感受到前所未有的压力。
现在所有应用程序都部署在云上,数据也产生在云端,这样自然而然的,大数据也在云上处理即可,主流的云计算厂商都提供了大数据云计算服务。
云计算厂商将大数据平台的各项基本功能以云计算服务的方式向用户提供,例如数据导入导出、数据存储与计算、数据流计算、数据展示等,都有相应的云计算服务。我以阿里云为例,一起来看看云计算厂商的主要大数据服务。
1.数据集成提供大数据同步服务通过提供reader和writer插件可以将不同数据源文本、数据库、网络端口的数据导入、导出。
2.E-MapReduce集成了Hadoop、Spark、Hive等主要大数据产品用户可以直接将自己的MapReduce、Spark程序或者Hive QL提交到E-MapReduce上执行。
3.分析性数据库AnalyticDB提供快速低延迟的数据分析服务类似Cloudera的Impala。
4.实时计算基于Flink构建的流计算系统。
我们看阿里云提供的这些服务从技术栈角度看几乎和Cloudera的CDH一样这是因为人们的需求就是这样只是提供的方式不同。Cloudera通过CDH和相关的技术支持支持企业部署自己的大数据集群和系统。而阿里云则将这些大数据产品都部署好了使用者只要调用相关API就可以使用这些大数据服务。
阿里云将这些大数据基础服务和其他大数据应用服务整合起来,构成一个大数据产品家族,这就是阿里云的数加。数加功能体系如下。
<img src="https://static001.geekbang.org/resource/image/37/8f/37f23cb538a0432fa16df37f1bd2648f.png" alt="">
## 大数据SaaS服务商
大数据存储和计算固然有难度和挑战,也因此有了不少解决方案提供商。但是大数据的采集、分析、展现也有一定的门槛和难度,能不能帮企业把这一部分也实现了呢?这样企业无需关注任何技术细节,甚至不需要做任何技术开发,就可以拥有大数据采集、处理、分析、展示一套完整的大数据平台。
如果说云计算厂商把大数据服务当作基础设施基础设施即服务IaaS和平台平台即服务PaaS提供给企业使用那么还有一些企业直接把大数据服务当作软件提供给企业软件即服务SaaS
对于像友盟、神策、百度统计这样的大数据SaaS服务商来说你只需要在系统中调用它提供的数据采集SDK甚至不需要调用只要将它提供的SDK打包到自己的程序包中就可以自动采集各种数据传输到他们的大数据平台。
然后你登录到他们的大数据平台上,各种数据统计分析报告已经自动生成,甚至和行业同类产品的对比数据也已经生成。此时你只需要查看、分析这些数据就可以了,几乎不需要做任何开发。
当然这类大数据SaaS厂商提供的服务比较简单如果需要精细化、定制化地进一步采集数据、分析数据还是需要自己调用接口进行开发。
但是,即使是不做进一步的开发,对于很多初创互联网产品而言,百度统计这类大数据服务提供的数据分析也是极有价值的。
## 大数据开放平台
除了上面提到的这几类商业大数据平台,还有一类大数据商业服务,就是大数据开放平台。
这类平台并不为用户提供典型的数据处理服务,它自身就有大量的数据。比如各类政府和公共事业机构、各类金融和商业机构,它们自己存储着大量的公共数据,比如中国气象局有海量的历史天气数据、中国人民银行有大量的客户征信数据、阿里巴巴有海量的电子商务数据。
如果这些数据是公共所有的,那么使用者就可以直接提交计算请求到这些大数据开放平台上进行计算。如果这些数据涉及保密和隐私,那么如果在不涉及用户隐私的情况下,也可以计算出有意义的结果,比如使用阿里巴巴的数据可以统计出区域经济繁荣指标和排名。
还有一种风控大数据开放平台,结合用户数据和自身数据进行大数据计算。金融借贷机构将借款人信息输入风控大数据平台,大数据平台根据自己的风控模型和历史数据进行风险分析,给出风险指数。金融借贷机构根据这个风险指数决定用户贷款额度和利率等,而风控大数据平台又多获得了一个用户数据,可以进一步完善风控模型和数据库。
## 小结
大数据已经进入成熟期,大数据技术和应用的各种垂直领域也被逐渐细分,并有越来越多的商业公司进入,继大数据技术生态之后,大数据商业生态也逐渐成型。
对于企业而言,大数据只是实现自己商业目标的工具,如果能借助商业大数据平台,更快实现自己的商业价值,事实上是更划算的事。作为技术人员,能利用自己的大数据知识,做好商业大数据方案的选型,将商业解决方案更好地应用到自己所在的企业,对自己和公司都是非常有价值的。
## 思考题
你了解的商业大数据平台和解决方案还有哪些?这些平台和方案的技术特点和商业价值是什么?
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。

View File

@@ -0,0 +1,91 @@
<audio id="audio" title="30 | 当大数据遇上物联网" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/cc/94/cc8e13f2d4c063bae9ede9769af0dc94.mp3"></audio>
某位互联网大佬说过未来20年最有发展潜力的三项技术分别是区块链、人工智能、物联网。关于区块链现在可能是最有争议也是最迷茫的时候关于人工智能的价值我们已经达成共识并稳步发展而真正完成早期探索、处于突破临界点的可能就是物联网了。
物联网确实也能给我们足够的想象空间:万物互联,所有的一切设备都是智能的,它们通过互相通信,彼此联系;而人们也可以通过云端的应用掌控一切,就像科幻电影描述的那样。
最关键的是,相比人工智能和区块链还在进行技术探索,物联网的技术已经成熟,只待“临门一脚”了。
## 物联网应用场景分析
现在说“万物互联”也许为时尚早,但是很多细分的垂直领域场景已经实现了物联网。
**1. 智能家居**
智能家居可能是和我们最接近,也是目前最普及的物联网。目前市面上销售的各种大家电,很多都有上网和远程控制功能。小米旗下的几乎所有家电都可以通过网络控制,这些设备和智能音箱联通,我们可以通过语音控制台灯、电饭煲、自动窗帘等。
下班回家,说一句“我回来了”,家里的灯立即打开,空调开启、窗帘关闭。要睡觉了,说声“晚安”,大灯关闭、夜灯开启、空气净化器进入夜间模式。是不是很酷?最重要的,这些技术和产品都已经成熟,而且价格低廉。
**2. 车联网**
车联网曾经被人们寄予厚望Intel就在车联网方面投入很多。我在Intel工作期间有段时间每天去公司上班一楼大厅都播放车联网的美好场景
道路上的车辆互相通信连接,前面车辆刹车,立即通知后面车辆,后面车辆也减速;路上发生车祸,警告其他车辆小心驾驶,车辆通过自己的摄像头将车祸现场照片视频自动上传给交警和保险公司;进入停车场,车辆和泊位系统通信,自动引导到空车位。车辆和车辆之间、车辆和其他交通设施之间彼此通信,互相协作,构成一个网络。
除此之外,物联网还应用在农业领域,土壤传感器探测土壤湿度,数据上传云端,云端系统根据农作物特性远程控制农田现场的喷淋装置。在能源利用领域,摄像头和红外传感器捕捉人们的活动,自动控制照明和空调系统,保证舒适和节能的平衡。
## 物联网平台架构
物联网主要是将各种传感器和智能设备连接起来,将数据上传云端,根据规则和机器学习模型进行远程控制,并通过物联网应用程序进行监控管理。一个典型的物联网平台架构如下图所示。
<img src="https://static001.geekbang.org/resource/image/d1/4a/d1ca6ed8631dc6bea0956d27b478da4a.png" alt="">
终端传感器实时采集数据,利用移动数据网络将数据上传给智能网关,智能网关进行初步的数据处理,根据规则和机器学习模型进行计算,再将计算结果通过移动数据网络下发给可控制的终端智能设备。
由于传感器可能部署在很多相距较远的地方,而且数量庞大,所以不可能将传感器数据直接接入云端服务器,而且也不是所有的传感器数据都需要实时上传云端。所以,需要有一个在传感器现场的前置服务器进行现场管理。智能网关就是距离现场传感器最近的一个计算机。
由于智能网关布置在物联网的作业现场,和传感器距离很近,处于整个云计算的边缘,所以在智能网关上的计算也叫**边缘计算**。
我们看到,在科技领域隔一段时间就会造出一个新名词,这可不是技术人员在没事找事瞎歪歪。每一个能公开传播的科技名词背后都有巨大的经济利益之争。科技巨头们为了在争夺市场份额,不断抛出新的科技名词,企图主导科技的话语权,进而获得经济利益。而大众也会审美疲劳,需要市场上不断有新鲜的东西问世。
但是我们作为科技从业人员,需要搞清楚这些新鲜热闹的科技新词背后的技术本质,不要被这些纷纷扰扰的技术新名词搞得迷失了方向。
智能网关进行现场数据处理后,也就是进行边缘计算后,还要把数据上传到云端,即物联网大数据平台,将数据永久存储,进行机器学习。还要将各个异地的传感器数据统一汇总,进行全局性的计算并进行全局性的控制。
此外云端还负责将各种数据推送给应用程序设备,工作人员可以实时监控整个物联网的运行情况,并通过应用程序进行远程控制。
## 大数据技术在物联网中的应用
如果说互联网连接的是人,那么物联网连接的就是物,是各种智能设备和传感器。相对人的数量来说,智能设备的数量要多得多,人不会时刻都在上网,而智能设备则时刻都在联网传输数据,所以物联网更需要大数据技术。
物联网里大数据技术的应用,一方面是大数据的存储和计算,另一方面就是边缘计算管理。我们先看下物联网大数据平台的架构。
<img src="https://static001.geekbang.org/resource/image/46/58/46e43c947cf20aa75d9e081de8b54158.png" alt="">
1.智能网关通过消息队列将数据上传到物联网大数据平台Storm等流式计算引擎从消息队列获取数据对数据的处理分三个方面。
<li>
数据进行清理转换后写入到大数据存储系统。
</li>
<li>
调用规则和机器学习模型,对上传数据进行计算,如果触发了某种执行规则,就将控制信息通过设备管理服务器下发给智能网关,并进一步控制终端智能设备。
</li>
<li>
将实时统计信息和应用程序监听的数据发送给应用程序设备,供使用者查看管理。
</li>
2.Spark等离线计算引擎定时对写入存储系统的数据进行批量计算处理进行全量统计分析和机器学习并更新机器学习模型。
3.应用程序也可以通过设备管理服务器直接发送控制指令给智能网关,控制终端智能设备。
这样就构成一个典型的物联网“端-云-端”架构,其中两个端分别是传感器与智能设备端,以及应用程序设备端,而云则是大数据云计算平台。
此外,边缘计算也要执行大量的逻辑运算,主要是对传感器数据进行处理和计算。运算逻辑代码和处理规则可能会经常变化,特别是规则配置,随时可能更新。
比较好的做法就是参考大数据计算框架的做法,即移动计算,将执行代码和规则配置分发到智能网关服务器。
开发者将代码和配置通过设备管理服务器分发给各个智能网关,智能网关热加载这些代码开始执行。这样人们不但可以远程控制智能设备,还可以控制智能设备的运行逻辑。
现在一些商业化的物联网云计算平台提出函数即服务FaaS在应用程序或者云控制台上编写函数分发到智能网关执行就可以这也是目前比较火的Serverless的一种实现。
## 小结
物联网的很多应用场景都会加上“智能”二字,比如智能家居、智能交通等。万物互联本身不是目的,让万物更智能,让生活更美好才是目的,而这些智能正是靠大数据技术实现的。不管是大规模传感器数据的采集、传输、处理,还是关于这些数据的分析与机器学习,以及最后对现场智能设备控制的边缘计算,背后都用到了大数据技术。
物联网的概念从提出到现在也过去很多年了,最近两年又重新开始火起来,我想应该跟大数据技术的普及有很大关系。
## 思考题
你了解的物联网应用场景还有哪些?大数据在其中的作用是什么?
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。

View File

@@ -0,0 +1,53 @@
<audio id="audio" title="31 | 模块答疑:为什么大数据平台至关重要?" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/f2/1d/f22c9171f3a3982f3032c6ff60e6071d.mp3"></audio>
你好,我是李智慧。今天我来做模块四的答疑,主题是为什么大数据平台至关重要。
我前面说过软件大体可以分为两种一种是为最终用户开发的实现用户需要的业务功能另一种是为软件工程师开发的供软件工程师使用。我在专栏前三个模块讲到的各种大数据产品都属于后一种最终用户不可能自己提交一个Hadoop程序去执行大数据计算这是软件工程师的工作因此大数据产品也是为软件工程师开发的。而如何让软件工程师能够便捷地提交各类大数据计算程序给大数据计算引擎去执行如何将用户实时数据转化为大数据产品的数据源如何利用好大数据的计算结果这些都是大数据平台的职责范围。
大数据平台将互联网应用和大数据产品整合起来,构建成一个完整的系统,将实时数据和离线数据打通,使数据可以实现更大规模的关联计算,挖掘出数据更大的价值,从而实现数据驱动业务,通过数据统计发现业务规律(也就是机器学习模型)。而利用这个规律对未来的数据进行分类和预测,使系统呈现出智能的特性,也为互联网未来发展和人类的生产生活创造了无限可能。
大数据平台将互联网应用和大数据产品整合起来一方面使互联网应用变得更加智能、强大一方面也使得大数据产品实现技术落地。技术不同于科学科学拓展人类的认知边界而技术是人们改造世界的工具科学的成果可以转化为技术而技术真正能够改造世界需要技术落地真正应用到生产过程中。用我们熟知的Hadoop为例即使它的技术再厉害如果没有具体应用没有被广泛使用同样也很难说明它有多大的价值。所以技术落地使技术产品实现真正价值也正是大数据平台使得大数据技术产品可以落地应用实现了自身价值。
所以,大数据平台不但对应用至关重要,对各种大数据技术产品也至关重要。事实上,大数据平台对大数据工程师的技术进阶也非常重要。
这些年来,多次有同学向我咨询如何成为软件架构师。软件架构师,顾名思义,就是从事软件架构设计的那个人。而关于软件架构,其定义是“关于软件各个组成部分及其关系的描述”,所以**软件架构师就是对软件各个组成部分及其关系进行设计和描述的那个人**。软件的各个组成部分包括业务组件模块,比如用户管理模块、订单处理模块,也包括技术组件,比如缓存组件、消息队列组件,当然还有大数据技术组件。
软件架构师要想设计出一个符合业务场景,便于开发维护的软件架构,必须要对业务很熟悉,还要对技术很精通。要将复杂的业务拆分成较小的、低耦合高内聚的、便于开发维护的模块;还要对各种技术组件的功能特性、技术原理、使用和调优方法很熟悉。软件架构师需要选择合适的技术组件应用到自己的软件架构中,并在将来的开发使用过程中指导工程师正确使用这些技术组件,还要能根据业务需要对这些技术组件进行适当的调优甚至改造。
所以,我的观点是,**从按照需求进行业务功能开发的程序员进阶到软件架构师,并不是随着经验积累、工作年限的增加就能自动完成的**。如果你一直按照别人给定的技术架构和业务需求开发代码,你很难从更高的层面去思考软件的架构是如何设计出来的,也缺乏明确的目标去掌握那些真正有难度的、底层的技术。
因此帮助你实现技术进阶,同样也是这个专栏当初设计的一个初衷。专栏前面三个模块希望你能了解、掌握大数据技术产品组件的原理,然后通过模块四,将各种大数据技术产品融会贯通,应用到自己的开发实践中,构建一个大数据平台。而通过专栏系统的学习,一方面可以实现大数据的业务价值,另一方面也可以使自己从业务开发者的角色,逐步进阶成为软件架构设计者的角色。
我的专栏的名字叫《从0开始学大数据》确实不需要你有任何大数据背景就可以跟着专栏开始学习大数据但是我并不希望你学完专栏后还只是打了一个大数据的基础我更希望你能掌握构建大数据系统大厦的能力。这当然会有难度学习过程中也会有挫折感但是我依然希望你能坚持学习即使有些技术不能完全掌握但是至少可以让你的视野达到一个更高的高度去感受架构师如何思考架构设计并可以把收获应用到未来的学习工作中让自己有不断进步的目标和动力。
下面我来回答一下“helloWorld”同学提出的一个问题。
<img src="https://static001.geekbang.org/resource/image/d8/4b/d828bbbb733679dfda40f7ea942c304b.png" alt="">
老实说我没有做过这类产品的开发,也不太了解腾讯的这个流计算平台,仅仅说一下我对这个功能实现的思路。
通过前面的学习我们知道Spark实现分布式计算的最小单位是计算任务Task每个任务针对一个不同数据分片进行计算相同的一组任务组成一个任务集TaskSet通常一个任务集就是一个计算阶段Stage所有的计算阶段组成一个有向无环图DAG
所以这个有向无环图就是Spark分布式计算的核心根据这个有向无环图的依赖关系不断地将任务分发给计算集群去计算每个计算进程领到计算任务后执行任务对应的代码最后完成大数据计算。
既然根据大数据应用程序代码可以生成有向无环图,那么能不能直接把这个有向无环图画出来,然后根据这个有向无环图进行分布式计算呢?当然可以,这就是问题中提到的可视化编程的思路。
我在[专栏第12期](http://time.geekbang.org/column/article/69822)讲Spark编程时提到我们了解到Spark提供了一组针对大数据的计算函数包括转换函数和执行函数两种事实上每个计算任务就是由一个或多个这样的函数构成的。那么可视化编程的时候只需要将这些函数拖动过来根据数据处理逻辑组成有向无环图即可。
我们还知道Spark的这些计算函数的输入参数是另外一个函数也就是真正的运行逻辑比如fliter函数的输入是一个布尔表达式比如 x &gt; 100以判断数据是否进行下一步处理。
所以这样一个可视化编程环境也会预置一些这样函数,以可视化节点的形式提供,开发者拖动这些节点,并在节点上输入一些简单表达式(或者拖动一些表达式符号和字段名称进来),就可以完成大数据可视化编程了。我画了一个简单的示意图。
<img src="https://static001.geekbang.org/resource/image/7a/05/7ab25d5ca4e6335c899048c660d7d905.png" alt="">
开发这样的有向无环图的可视化编辑工具技术非常成熟只要根据这个图形生成一个XML之类的描述文件交给一个执行引擎去执行就可以了。
至于如何根据一个XML文件执行计算逻辑可以参考Hive的实现。在[专栏第11期](http://time.geekbang.org/column/article/69459)我们也学习过Hive QL经过语法分析、语义解析与优化后生成一个执行计划这个执行计划也是一个有向无环图。Hive用XML描述这个有向无环图并提交给Hive的执行引擎执行引擎解析XML并利用Hive内置的Operator算子构建MapReduce作业提交给Hadoop执行。
有兴趣的同学可以在Spark上尝试一下根据XML生成Spark代码再把这个代码编译后提交给Spark引擎执行这个过程应该并不难。
最后我贴出@纯洁的憎恶@方得始终@杰之7@小千@warm_day这几位同学的留言,希望他们的思考对你也有所启发。
<img src="https://static001.geekbang.org/resource/image/25/a2/259283a305e47baded4a49dae4c888a2.png" alt=""><img src="https://static001.geekbang.org/resource/image/c6/1b/c68f0d9e3ace889bdb53ba92291df41b.png" alt=""><img src="https://static001.geekbang.org/resource/image/06/4a/06690dbb97f18526e29380915875774a.png" alt=""><img src="https://static001.geekbang.org/resource/image/3d/cd/3d83ec205f28ce82a74492d81ce870cd.png" alt=""><img src="https://static001.geekbang.org/resource/image/b8/5b/b865e060b7c897d5d74dc99ef253315b.png" alt=""><img src="https://static001.geekbang.org/resource/image/b4/61/b49917feb5b04891668bf914a531ea61.png" alt="">
欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。