前面几讲,我们介绍了很多关于大数据体系架构、数据采集和数据存储相关的方法和工具。很多人可能觉得:
- 大数据体系的东西太多了,我们是小公司用不到这些东西;
- 要构建一套完整的大数据体系需要很大的一个团队,我们付不起这么高的价格;
- 我们只想用其中的一些部分。
如果有这样的问题,我们该怎么办呢?这里就可以使用云服务进行解决。这一讲,我们就来看一下云服务都可以提供什么样的功能。
什么是云服务
在我看来,云服务其实有两层含义:
- 离得远,远在云端的服务;
- 不需要了解细节,藏在云后面的服务。
所以,云服务就是互联网提供的各种服务器,计算、存储、数据库,甚至是大数据、人工智能服务,并且这些服务是弹性可伸缩、按需支付的。你不需要了解服务背后的实现细节,只需要知道它能够满足什么需求,并按需进行购买就可以了。
云服务都能提供什么服务
互联网公司大多数提供的都是线上服务。比如要做一个熟肉电商平台,我们需要有网络服务,有存储设备存放商品信息,需要有交易系统让用户完成支付,甚至还需要数据分析平台来分析什么产品卖得好。
如果说这些东西从一开始就完全由自己来建设,那将是一笔非常大的开销。不仅要购买服务器,还要雇用很多开发人员来开发系统并保障这些服务的正常运转。对于这里面的大部分环节,我们的需求可能跟其他电商平台并没有什么区别,比如说卖衣服、卖鞋的电商平台等。我们完全可以共用同一台服务器,共用同一套支付系统。
或者是在某些特殊的时间,我们对服务器的需求有突然的变化,比如说我们搞了一个 6 月 6 日吃肉节,这一天的客户激增,需要十台服务器和平时十倍的网络流量才能支撑,而在剩下的一年 364 天则没有这种需求。因此在这个时候选择使用一些云服务来建设自己的需求是可以节约成本的,你只需要支付一定的费用,然后专注于核心的环节。
那么我们就来看一下,现在的云服务都可以提供什么服务。
上图是亚马逊的云服务网站截图,亚马逊云服务又称作 AWS(Amazon Web Services),是主流的云服务供应商之一。AWS 在全球多个地理位置部署了若干的云服务区,这些可用服务区通过低延迟、吞吐量高而且高冗余的网络连接在一起。
从上图中可以看到,AWS 提供了大量的基于云和大数据的产品,其中包括计算、存储、数据库、分析、网络、移动产品、开发工具、物联网、安全管理和各种企业级应用等。亚马逊是全球市场占有率第一的云服务公司,像 Airbnb、Netflix 等都在使用 AWS 的服务。
在亚马逊云上还提供了很多免费的服务(如上图),供开发者进行试验和尝试各种功能。可以看到 EC2 就是亚马逊云服务器,而 S3 则是亚马逊云存储,RDS 是云数据库,这些都有免费的额度,如果你感兴趣可以试用一下。
上面这张图来自阿里云。可以看到,与亚马逊云一样,阿里云也提供了非常丰富的线上产品,涉及了存储、计算、数据库、安全、大数据、人工智能等方方面面。阿里云是中国最大的云计算平台,不仅为自家的产品提供服务,同时也有微博、知乎等客户。
对于云服务,我们可以大致分成下面 3 种情况。
(1)SaaS:软件即服务
SaaS(Software-as-a-Service)为用户提供了对供应商云端软件的访问。用户无须购买软件,而是向提供商租用基于 Web 的软件,来管理企业经营活动。常见的比如邮件服务、ERP 系统、办公系统、疫情期间的远程协同工具等,这类服务都可以成为 SaaS 服务。SaaS 服务的定制化程度高,往往都是满足已经确定的需求,用户很难对其做个性化的改变。
(2)PaaS:平台即服务
PaaS(Platform-as-a-Service)为用户提供云环境,用于开发、管理和交付应用。除存储器和其他计算资源以外,用户能够使用预构建工具套件,开发、定制和测试自己的应用。PaaS 可帮助企业用户和开发人员,以本地部署解决方案无法企及的速度创建应用程序。
(3)IaaS:基础设施即服务
IaaS(Infrastructure-as-a-Service)处于更加底层的服务,比如服务器资源、存储资源、网络和计算资源,都属于 IaaS 服务。可想而知,IaaS 的灵活性更高,供应商只负责提供这些硬件资源,同样的,在开发和维护上的工作也就更多。
我们再拿熟肉电商平台的例子来说:
- 使用 IaaS 服务意味着省去了买服务器、搭建网络环境等环节,只需要在供应商提供的虚拟机器上搭建自己的开发环境,然后开始写代码;
- 而 PaaS 服务则不需要搭建开发环境,只需要按照供应商给出的开发指南进行开发;
- 而 SaaS 服务连开发步骤也省去了,只需要在供应商提供的网站的基础上,修改一下名称和图片就可以开始卖熟肉了。
云服务的好处
1.节约成本
使用云服务最大的好处就在于能够帮助你节约成本。像我们在讲的大数据体系,要想独立构建这样一套完整的体系需要很多的服务器资源、网络资源以及人力成本,直接使用云服务省去了自己构建的麻烦,只需要根据需求去进行应用就好了。
2.可扩展性
除了节约成本,可扩展也是云服务的一大好处。就像前面说的例子,在搞活动的时候我们可能需要比平时多十倍的机器和带宽,而在剩下的时间里,不需要那么多资源。而云服务的供应商有着充足的资源,当我们需要的时候,按需求进行扩展,比如说只购买一天的量来应对特殊的情况,而且这种扩展的成本往往都非常低,云服务供应商可以提供很好的无缝衔接。
3.紧跟最新技术
理所应当,如果使用云服务你就不需要关心升级和更新。云服务供应商对于技术方面往往都会做很多种版本的支持,这样你可以根据自己的需要进行选择。它会帮你配置好各种复杂的依赖,即使你想使用最新的版本也基本上可以得到满足,而不需要自己去解决细节问题。当然,在云服务的背后有强大的技术团队来进行支撑。
4.流动性
由于所有的操作都可以云端进行,比如你可以把数据放在云存储上,运算也可以使用云计算,甚至连交易平台也使用云上的服务,所以你只需要一个能够联网的设备,比如说笔记本,或者是一个 iPad,就可以进行办公。云服务使得流动性变得更好,你可以随时随地根据自己的需求进行连接。
5.故障恢复
你的云端设备可以匹配最佳的企业系统,如果服务器发生故障,它将自动将故障转移到另一台服务器,不会损坏你本来服务器的稳定性。在小型组织的 IT 环境中,这项技术是绝对无法实现的,因为实施这种故障转移将耗费巨大资金,并且消耗很多的时间。
大数据与云计算的关系
根据前面的介绍,我们可以了解到,使用云服务可以让我们以更低成本和更快速地构建起自己所需要的资源和服务。所以,通过使用云服务,我们可以把各种云端的软硬件资源和服务都当作软件来进行合理的使用。
而大数据架构的基本的特征,首先就是可以横向扩展,通过增加机器来满足原本单个机器无法处理的存储和计算的问题。譬如说我们所讲的 Hadoop 架构,它的高可用性是通过合理的软件设计和架构设计来实现的,而不是使用高端的硬件设备来实现的。
所以,从技术上看,大数据与云计算的关系就像一枚硬币的正反面一样密不可分。云服务中的虚拟化技术和弹性扩展能力可以支持大数据平台快速地扩展或者缩减存储和计算的资源。云存储为大数据提供了可扩展、高可用性、高持久性、安全的存储资源,保证了大数据平台的高效运行。
未来的趋势是,云平台作为计算资源和存储资源的底层,支撑着上层的大数据平台,而大数据的发展为云服务的落地找到了更多的实际应用。大数据和云的融合是重大的趋势,这两个技术是相辅相成的关系。
大公司为什么要做云服务
我们已经知道,对于个人,或者中小公司,选择云服务主要是为了能够低成本地使用大数据相关的技术,而当你的公司成长到一定的规模,本身就需要非常大规模的集群、存储和算力,需要雇用专业的人员来开发维护,同时对于业务也要有自己的解决方案。这个时候把空闲的机器资源发展成为云服务平台,业务方案也可以抽象成更为通用的方案做成云服务,这些东西一方面可以支持自己的业务发展,同时又可以出售给中小型公司和个人,从而为公司带来丰厚的利润。
就拿亚马逊来说,提到亚马逊,你可能会想到亚马逊电商、亚马逊电子书,然而亚马逊云服务才是其最大的利润来源。上图是 2017 年亚马逊一季度利润。可以看到在大约 10 亿美元的利润中,亚马逊云服务占了 89%。最近几年,阿里、腾讯等公司也纷纷加大了云服务的投入,希望能够通过这块业务带动公司整体业绩的增长。可想而知,在未来,云服务会更加普遍,更加多样化。
总结
和前面的技术和工具的课程比起来,这一讲更像是一节宣导课程。在这节课中我们介绍了什么是云服务,以及它可以提供一些什么样的能力。云服务的发展使得很多个人和中小公司也能够很好地应用大数据技术来发展自己的业务,不需要关心服务器在哪,不需要关心复杂的底层部署和维护,只是像用电一样按需要支付费用,大数据相关的服务就可以送到我们的面前。所以,对于很多业务型的中小公司,甚至是大型公司,都可以考虑使用云服务来构建自己的大数据体系,选择使用其中的部分功能,从而把更多的精力投入业务运营中。
当然,对于学习我们课程的同学,如果你身边没有可以上手的大数据体系,也可以考虑使用云平台去感受一下各种能力,很多云平台上的功能跟大公司中实际使用的也十分类似。在此过程中有任何问题,都欢迎在留言区与我沟通。
下一讲,我们将回到大数据体系的技术和工具上来,具体讲解下 Kafka 与 Flume,到时见。
前面的几节课,我们了解了数据从哪里来,以及数据的存储。但是在这个过程中,有一个非常重要的问题还没有介绍,也就是数据需要借助什么工具从前端进入我们的存储环节?如果说数据就像我们的石油,在石油被开采之后,需要通过管道运输到储油罐中。这一讲,我们就来介绍一下大数据体系下承担着输油管道角色的工具——Kafka 和 Flume。
什么是 Kafka
首先,我们来看一下 Kafka 是什么。在大数据的架构中,数据的采集和传输是一个非常重要的环节,如何保障如此大批量的数据能够不重不漏的传输,当发生故障时如何保障数据的有效性,当网络堵塞时如何进行缓存,这需要相应的基础设施对其提供支持。
我们这一讲说的是消息系统,那么你自然也知道 Kafka 也是一个消息系统。所谓的消息系统其实很简单,就是把数据从一个地方发往另外一个地方的工具。当然,只说是消息系统还不能够体现出 Kafka 的优越性,Kafka 也有其自己的特色,它是一个高吞吐量、分布式的发布 / 订阅消息系统,然而最核心的是“削峰填谷”(后续会具体讲解)。
Kafka 支持多种开发语言,比如 Java、C/C++、Python、Go、Erlang、Node.js 等。现在很多主流的分布式处理系统都支持与 Kafka 的集成,比如 Spark、Flink 等。同时,Kafka 也是基于 ZooKeeper 协调管理的系统,说到这里,你可以再返回《05 | 大数据开发必备工具——Hadoop》中,看一下 Kafka 在大数据架构中所处的位置。
Kafka 的结构与概念
经过了简短的介绍,我们大致可以了解 Kafka 是什么了,在 Kafka 的基本结构中,有两个重要的参与者:
- 消息的生产者(Producer);
- 消息的消费者(Consumer)。
如下图所示,Kafka 集群在消息的生产者和消费者之间建立起了联系的机制,来保障消息的运输。生产者负责生产消息,将消息写入 Kafka 集群,而消费者从 Kafka 集群中拉取消息,也可以称为消费消息。Kafka 所要解决的就是如何来存储这些消息,如何进行集群调度实现负载均衡,如何保障通信等等问题。
Kafka 集群的联系机制
接下来我们介绍几个 Kafka 中重要的概念。
1.生产者与消费者
生产者负责将消息发送给 Kafka,它可以是 App,可以是服务,也可以是各种 SDK。
而消费者则使用拉取的方式从 Kafka 中获取数据。
每一个消费者都属于一个特定的小组(Group),同一个主题(Topic)的一条消息只能被同一个消费组下某一个消费者消费,但不同消费组的消费者可同时消费该消息。依赖这个消费小组的理念,可以对 Kafka 中的消息进行控制,如果需要对消息进行多个消费者重复消费,那么就配置成多个消费组,而如果希望多个消费者共同处理一个消息源,那么就把这些消费者配置在一个消费组就可以了。
2.消息
消息就是 Kafka 中传输的最基本的单位,除去我们需要传输的数据,Kafka 还会给每条消息增加一个头部信息以对每一条消息进行标记,方便在 Kafka 中的处理。
3.主题(Topic)
上面我们说到了主题,在 Kafka 中,一个主题其实就是一组消息。在配置的时候一旦确定主题名称,生产者就可以把消息发送到某个主题中,消费者订阅这个主题,一旦主题中有数据就可以进行消费。
4.分区(Partition)和副本
在 Kafka 中,每个主题会被分成若干个分区。每个分区是一个有序的队列,是在物理上进行存储的一组消息,而一个分区会有若干个副本保障数据的可用性。从理论上来说,分区数越多系统的吞吐量越高,但是这需要根据集群的实际情况进行配置,看服务器是否能够支撑。与此同时,Kafka 对消息的缓存也受到分区和副本数量的限制。在 Kafka 的缓存策略上,一般是按时长进行缓存,比如说存储一个星期的数据,或者按分区的大小进行缓存。
5.偏移量
关于偏移量的概念,我们可以理解成一种消息的索引。因为 Kafka 是一个消息队列的服务,我们不能对数据进行随机读写,而是要按照顺序进行,所以需要给每条消息都分配一个按顺序递增的偏移量。这样消费者在消费数据的时候就可以通过制定偏移量来选择开始读取数据的位置。
在我们平时的数据开发工作中,更多的往往是作为生产者或者消费者来使用 Kafka,而不需要关注 Kafka 系统的部署和维护,感知比较明确的就是上面说到的这些概念,基本都是我们在代码中需要进行配置的。当然,在 Kafka 中还有一些基本组成部分,比如代理、ISR 以及对 ZooKeeper 的使用等,如果你对 Kafka 有更加深入的学习需求,可以进一步查看这些内容。在我们加入了上面这些组成元素之后,我们再来看一下 Kafka 的结构图。
Kafka 的结构图
大致的流程为,生产者生产数据,然后把数据推送到 Kafka 集群中,并确定数据流的主题。Kafka 集群配合 ZooKeeper 集群完成调度、负载均衡、缓存等等功能,等待消费者消费数据。
Kafka 的特点
经过不断发展,Kafka 已经成为主流的消息队列工具,类似的工具还有 RabbitMQ、Redis 消息队列、ZeroMQ、RocketMQ 等等。
我们在前面说过,Kafka 最大的特色就是“削峰填谷”,这是它在应用上的特点,这里的谷和峰指的是数据流量的谷和峰,削峰填谷的含义即在数据生产方 A 和数据消费方 B 对数据流量的处理能力不同的时候,我们就可以使用 Kafka 作为中间传输的管道。那么在具体的设计上,Kafka 有什么特点呢,接下来让我们看一下。
1.消息持久化
Kafka 选择以文件系统来存储数据。很多消息系统为了提升大规模数据处理和快速传输的能力,并不会对数据进行持久化存储,或者只是缓存非常少量的数据,而 Kafka 会把数据存在磁盘上,一方面是磁盘的存储容量大,另外一方面是经过持久化的数据可以支持更多的应用,不管是实时的还是离线的,都可以进行支持。
2.处理速度快
为了获得高吞吐量,Kafka 可是下了不少功夫。我们知道硬盘是使用物理磁头来进行数据读写的,通常磁盘的速度都以转数来描述,比如 5400 转、7200 转。因为随机寻址的话,需要通过转动移动到下一个地址。但是由于 Kafka 是队列的形式,创造性地对磁盘顺序读写,大大增加了磁盘的使用效率,既获得了大存储量,又提高了速度。同时 Kafka 中还加入了很多其他方面的优化,比如通过数据压缩来增加吞吐量、支持每秒数百万级别的消息。
3.扩展性
与大数据体系中的其他组件一样,Kafka 也同样支持使用多台廉价服务器来组建一个大规模的消息系统,通过 ZooKeeper 的关联,Kafka 也非常易于进行水平扩展。
4.多客户端支持
前面我们也提到了,Kafka 支持非常多的开发语言,比如 Java、C/C++、Python、Go、Erlang、Node.js 等。
5. Kafka Streams
Kafka 在 0.10 之后版本中引入 Kafka Streams,能够非常好地进行流处理。
什么是 Flume
简单介绍完了 Kafka,我们再来看一下另外一个工具 Flume。
我们先回忆一下数据采集的过程:作为前端用户使用的客户端,不管是 App、网页还是小程序,在用户使用的时候,会通过 HTTP 链接把用户的使用数据传输到后端服务器上,服务器上运行的服务把这些回传的数据通过日志的形式保存在服务器上,而从日志到我们将数据最终落入 HDFS 或者进入实时计算服务中间还需要一些传输。
当然,这个过程有很多种实现方法,比如说在 Java 开发中,我们可以借助 kafka-log4j-appender 类库把 log4j(日志记录类库)记录的日志同步到 Kafka 消息队列,由 Kafka 传输给下游任务。然而这种方式比较简陋,并不太适合大规模集群的处理,因此,这里就有一个日志采集工具,那就是 Flume。
Flume 是一个高可用、分布式的日志收集和传输的系统。Flume 有源(Source)、通道(Channel)和接收器(Sink)三个主要部分构成。这三个部分组成一个 Agent,每个 Agent都是独立运行的单位,而 Source、Channel、Sink 有各种不同的类型,可以根据需要进行选择:
- Channel 可以把数据缓存在内存中,也可以写入磁盘;
- Sink 可以把数据写入 HBase;
- HDFS 也可以传输给 Kafka 甚至是另外一个 Agent 的 Source。
Flume 中的概念
1.源(Source)
Source 是负责接收输入数据的部分,Source 有两种工作模式:
- 主动去拉取数据;
- 等待数据传输过来。
在获取到数据之后,Source 把数据传输给 Channel。
2.通道(Channel)
Channel 是一个中间环节,是临时存储数据的部分,Channel 也可以使用不同的配置,比如使用内存、文件甚至是数据库来作为 Channel。
3.接收器(Sink)
Sink 则是封装好的输出部分,选择不同类型的 Sink,将会从 Channel 中获取数据并输出到不同的地方,比如向 HDFS 输出时就使用 HDFS Sink。
4.事件(Event)
Flume 中传递的一个数据单元即称为事件。
5.代理(Agent)
正如我们前面介绍的,一个代理就是一个独立的运行单元,由 Source、Channel 和 Sink 组成,一个 Agent 中可能有多个组件。
Kafka 与 Flume 的比较
可以看到,在数据传输方面,Flume 和 Kafka 的实现原理比较相似,但是这两个工具有着各自的侧重点。
- Kafka 更侧重于数据的存储以及流数据的实时处理,是一个追求高吞吐量、高负载的消息队列。
- 而 Flume 则是侧重于数据的采集和传输,提供了很多种接口支持多种数据源的采集,但是 Flume 并不直接提供数据的持久化。
就吞吐量和稳定性来说,Flume 不如 Kafka。所以在使用场景上,如果你需要在两个数据生产和消费速度不同的系统之间传输数据,比如实时产生的数据生产速度会经常发生变化,时段不同会有不同的峰值,如果直接写入 HDFS 可能会发生拥堵,在这种过程中加入 Kafka,就可以先把数据写入 Kafka,再用 Kafka 传输给下游。而对于Flume 则是提供了更多封装好的组件,也更加轻量级,最常用于日志的采集,省去了很多自己编写代码的工作。
由于 Kafka 和 Flume 各自的特点,在实际的工作中有很多是把Kafka 和 Flume 搭配进行使用,比如线上数据落到日志之后,使用 Flume 进行采集,然后传输给 Kafka,再由 Kafka 传输给计算框架 MapReduce、Spark、Flink 等,或者持久化存储到 HDFS 文件系统中。
总结
在工作中,我对 Flume 和 Kafka 最基本的感受是二者都可以用来传输数据,但是实际上各自有各自的功能和特点,在具体使用场景上有比较大的区别。所以在使用的时候,要根据具体的需求来选择使用 Kafka 还是使用 Flume,或者是把两者结合起来使用。Cloudera 甚至开发了一个新的工具——Flafka,融合了两者的特点。
当然,在这一讲中我们只是对这两个工具进行了最基本的介绍,如果你想要深入理解两者的异同,还需要了解更多的细节,甚至自己动手去搭建一个 Kafka 或者 Flume 项目。在学习和实践过程中,有任何问题都可以在留言区与我交流。
完成了数据传输,我们下节课就要进入数据的计算环节,来了解一下 Hadoop 体系两大核心的另外一部分:MapReduce,到时见。