大数据离线计算的架构与组件
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是大数据离线计算
1>.大数据离线计算概述
(1)所谓大数据离线计算,就是利用大数据的技术栈(主要是Hadoop),在计算开始前准备好所有输入数据,该输入数据不会产生变化,且在解决一个问题后就要立即得到计算结果的计算模式。
(2)离线(offline)计算也可以理解为批处理(batch)计算,与其相对应的是在线(online)计算或实时(realtime)计算
2>.离线计算的特点
(1)数据量巨大,保存时间长
(2)在大量数据上进行复杂的批量运算
(3)数据在计算之前已经完全到位,不会发生变化
(4)能够方便地查询计算结果
3>.大数据离线计算应用场景
(1)大数据离线计算主要用于数据分析、数据挖掘等领域。我们说这部分的技术栈主要是Hadoop,但在以Hadoop为代表的大数据技术出现之前,数据分析、数据挖掘已经经历了长足的发展。尤其以BI系统为主的数据分析领域,已经有了比较成熟稳定的技术方案和生态系统。
(2)BI(全称为Business Intelligence,即商业智能)系统能够辅助业务经营决策。其需要综合利用数据仓库(基于关系型数据库)、联机分析处理(OLAP)工具(如各种SQL)和数据挖掘等技术。
(3)如Oracle、IBM、Microsoft等数据库厂商都有自己的BI产品,MicroStrategy、SAP等独立BI厂商也有自己的软件产品。
4>.传统BI暴漏的问题
然而传统BI随着时间的推移暴露出一些问题:
(1)BI系统以分析业务系统产生的结构化数据为主,对非结构化和半结构化数据处理困难,如文本、图片、音视频等。
(2)由于数据仓库为结构化存储,在数据从其它系统进入数据仓库前需要一个ETL过程,ETL通常和业务强绑定,需要专门的人员去做这个工作。
(3)当数据量增大的时候,性能会成为瓶颈,传统关系型数据库在TB级别时已经表现得吃力,在PB级别时基本无能为力。
(4)数据库的设计一般会遵循某种范式,其着力于解决数据冗余和一致性问题。但数据仓库设计时为了性能和方便的考虑,通常会使用一些反范式的设计。如何在范式和反范式间权衡没有确定的标准,需要小心设计。
(5)对于包含机器学习应用的BI系统,由于ETL的存在,其获取到的数据为已经按某种假设清洗后的数据,会造成机器学习的效果不理想或完全没有效果。
5>.大数据离线计算的优势
针对这一系列问题,以Hadoop为代表的大数据解决方案表现出其优越性,Hadoop技术栈中的各种组件不断丰富,已经完全能实现传统BI的功能,并解决了其容量和性能的瓶颈。
但大数据技术也带来了一些新问题: 从传统数据仓库升级到大数据的数据仓库,不可能平滑演进,基本等于重新开发。这和软硬件架构的不一致、SQL方言的差异都有关系。 大数据解决方案在功能和性能上有很多取舍,如HDFS不支持修改文件,Hive要支持update和delete的话有非常苛刻的限制且效率也远低于关系型数据库。类似这些都是大数据解决方案的局限性。
大数据离线计算侧重于从以下几个维度解决传统BI面临的瓶颈: 分布式存储:
将大文件按照一定大小拆分成多份,分别存储到独立的机器上,并且每一份可以设置一定的副本数,防止机器故障导致数据丢失,这种存储方式比传统关系型数据库/数据仓库使用的集中式存储,无论是容量、价格、吞吐率、鲁棒性等各方面都有明显优势。 分布式计算:
核心思想是让多个机器并行计算,并通过对数据本地性的利用,尽量处理本机器上的那一部分数据,减少跨网络的数据传输。很多传统的数据库/数据仓库也支持利用多核CPU、集群技术来进行分布式计算,但Hadoop的分布式计算架构更为彻底。 检索和存储的结合:
在早期的大数据组件中,存储和计算相对比较单一,但目前的方向是对存储进一步优化,ᨀ升查询和计算的效率,其方法是除了存储数据的内容外,还存储很多元数据信息,如数据的schema、索引等。类似parquet、kudu等技术都是利用了这种思想。
二.大数据离线计算的架构
三.大数据离线计算涉及组件
1>.HDFS
HDFS
是Hadoop上的分布式文件系统。
HDFS采用主从模式,其架构主要包含NameNode,DataNode,Client三个部分:
NameNode:
用于存储、生成文件系统的元数据。运行一个实例,因此需要解决单点故障问题。
DataNode:
用于存储实际的数据,并将自己管理的数据块信息上报给NameNode,运行多个实例。一个数据默认存储3副本,分布在3个不同的DataNode上以保证可用性。
Client:
支持使用者读写HDFS,从NameNode、DataNode获取元数据或实际数据返回给使用者。可以有多个实例,和业务一起运行。
2>.MapReduce on
MapReduce是Googleᨀ出的一种并行计算框架:
Map:
映射,对一些独立元素组成的列表的每一个元素进行指定的操作。每个元素都是被独立操作的,而原始列表没有被更改。Map操作是可以高度并行的,这对高性能应用以及并行计算领域的需求非常有用。
Reduce:
化简,对一个列表的元素进行适当的合并,虽然它不如Map那么并行,但是因为化简总是有一个简单的答案,大规模的运算相对独立,所以化简函数在高度并行环境下也很有用。
适合:
大规模数据集的离线批处理计算;任务分而治之,子任务相对独立。
不适合:
实时的交互式计算,要求快速响应和低延迟,比如BI;流式计算、实时分析,比如广告点击计算;子任务之间相互依赖的迭代计算。
3>.YARN
Yarn是Hadoop2.0后的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度
Yarn是轻量级弹性计算平台,除了MapReduce框架,还可以支持其他框架,比如Spark、Storm等
多种框架统一管理,共享集群资源:
资源利用率高
运维成本低
数据共享方便
4>.Hive
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并ᨀ供类SQL的查询功能。其基本原理是将HQL语句转换成MapReduce任务。
Impala是一个MPP架构的大数据分析引擎,提供交互式、即时SQL查询能力。其大多数语法和Hive相同或类似,元数据也使用Hive的,因此可以直接操作Hive表。
5>.Hue
Hue(Hadoop User Experience)是一个开源的Apache Hadoop UI系统,由Cloudera Desktop演化而来,它是基于Python Web框架Django实现的。
通过Hue可以:
SQL编辑,支持Hive、Impala、SparkSQL和各种关系型数据库
管理Hadoop和Spark任务
HBase数据的查询和修改
Sqoop任务的开发和调试
管理Oozie的工作流
其他功能,例如浏览HDFS,浏览zookeeper……
6>.Sqoop
Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以在关系型数据库(Mysql,Oracle,Postgre等)和Hadoop(Hive,HBase)等间双向互导
通过MapReduce实现,因此是批量的、非实时的。如果需要实时,可以考虑Flume、StreamSets等解决方案
易用性较差
一些ETL工具也能实现Sqoop的功能,例如Kettle
7>.Oozie
Oozie是一个基于工作流引擎的服务器,可以在上面运行Hadoop的MapReduce、Pig等任务。它运行于web容器中(如tomcat)
Oozie使用关系型数据库存储:工作流定义;当前运行的工作流实例,包括实例的状态和变量
Oozie工作流是放置在控制依赖DAG中的一组动作,其中指定了动作执行的顺序。使用hPDL(一种XML流程定义语言)来᧿述这个图。
8>.其他组件
Flume、StreamSets:这两个组件都是用作数据采集的,在离线计算中当然可以用,例如将数据从外部数据源采集到HDFS。但它们更多的应用场景是在实时计算中,用于数据流的一部分. Kafka:
是一种消息队列,同样地也可以用于离线计算和实时计算中,也是数据流的一部。 HBase:
是一种面向列的数据存储,可以ᨀ供类似OLTP数据库的即席查询能力,也能依靠另一个组件Phoenix来提供SQL形式的查询能力。其在离线计算中也可以作为数据存储使用,但鉴于其设计理念并非用于批量的数据分析场景,我们将其放入实时计算运维/开发的课程中。 Spark:
本质上其既可以用于离线的批量计算,又可以用于在线的实时计算(通过SparkStreamingᨀ供的微批能力),因为其非常重要,涉及的知识点又较多。