本节对“用户搜索行为分析系统”项目中所使用的大数据框架Hadoop、ZooKeeper、Kafka、Flume、HBase、Spark等进行简要介绍,为后续的系统搭建打下理论基础。框架的详细介绍读者可查阅笔者的《Hadoop 3.x大数据开发实战(视频教学版)》一书。
Apache Hadoop是大数据开发所使用的一个核心框架,是一个允许使用简单编程模型跨计算机集群分布式处理大型数据集的系统。使用Hadoop可以方便地管理分布式集群,将海量数据分布式地存储在集群中,并使用分布式并行程序来处理这些数据。它被设计成从单个服务器扩展到数千台计算机,每台计算机都提供本地计算和存储。Hadoop本身的设计目的是不依靠硬件来提供高可用性,而是在应用层检测和处理故障。
随着Hadoop生态系统的成长,出现了越来越多的新项目,这些项目有的需要依赖Hadoop,有的可以独立运行,有的对Hadoop提供了很好的补充。
本书讲解的“用户搜索行为分析系统”项目的架构设计如图1-3所示。
图1-3 “用户搜索行为分析系统”技术架构
用户在Web网站和手机App中浏览相关信息,服务器端会生成大量的日志文件记录用户的浏览行为。日志文件属于半结构化数据,和普通纯文本相比,半结构化数据具有一定的结构性,有基本固定的结构模式,例如日志文件、XML文档、JSON文档、Email等都属于半结构化数据。
使用Flume+Kafka构建数据传输层。
Apache Flume是一个分布式的、可靠和易用的日志收集系统,用于将大量日志数据从许多不同的源进行收集、聚合,最终移动到一个集中的数据中心进行存储。Flume的使用不仅限于日志数据聚合,由于数据源是可定制的,因此Flume可以用于传输大量数据,包括但不限于网络流量数据、社交媒体生成的数据、电子邮件消息和几乎所有可能的数据源。
Kafka是一个基于ZooKeeper的高吞吐量低延迟的分布式的发布与订阅消息系统,它可以实时处理大量消息数据以满足各种需求。即便使用非常普通的硬件,Kafka每秒也可以处理数百万条消息,其延迟最低只有几毫秒。
为了使Flume收集的数据和下游系统之间解耦合,保证数据传输的低延迟,采用Kafka作为消息中间件进行日志的中转。
大数据项目使用HDFS、HBase、Hive和MySQL构成数据存储层。
HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,在大数据开发中通过分布式计算对海量数据进行存储与管理。它基于流数据模式访问和处理超大文件的需求而开发,可以运行在廉价的商用服务器上,为海量数据提供了不惧故障的存储方法,进而为超大数据集的应用处理带来了很多便利。
HBase是一个分布式的、非关系型的列式数据库,数据存储于分布式文件系统HDFS中,并且使用ZooKeeper作为协调服务。HDFS为HBase提供了高可靠性的底层存储支持,ZooKeeper则为HBase提供了稳定的服务和失效恢复机制。
HBase的设计目的是处理非常庞大的表,甚至可以使用普通计算机处理超过10亿行的、由数百万列组成的表的数据。
Hive是一个基于Hadoop的数据仓库架构,使用SQL语句读、写和管理大型分布式数据集。Hive可以将SQL语句转换为MapReduce(或Apache Spark和Apache Tez)任务执行,大大降低了Hadoop的使用门槛,减少了开发MapReduce程序的时间成本。
我们可以将Hive理解为一个客户端工具,它提供了一种类SQL查询语言,称为HiveQL。这使得Hive十分适合数据仓库的统计分析,能够轻松使用HiveQL开启数据仓库任务,如提取/转换/加载(ETL)、分析报告和数据分析。Hive不仅可以分析HDFS文件系统中的数据,也可以分析其他存储系统(例如HBase)中的数据。
MySQL是最好的关系数据库管理系统应用软件。本书使用MySQL存储用户行为数据的计算结果,便于后续通过Web应用等轻量级框架读取结果进行用户端展示。
数据计算层的核心是Spark计算引擎。
Spark是一个快速通用的集群计算系统。它提供了Java、Scala、Python和R的高级API,以及一个支持通用的执行图计算的优化引擎。它还支持一组丰富的高级工具,包括使用SQL进行结构化数据处理的Spark SQL、用于机器学习的MLlib、用于图处理的GraphX,以及用于实时流处理的Spark Streaming。
Spark的核心(Spark Core)是一个对由很多计算任务组成的、运行在多个工作机器或者一个计算机集群上的应用进行调度、分发以及监控的计算引擎。在Spark Core的基础上,Spark提供了一系列面向不同应用需求的组件,例如Spark SQL和Spark Streaming。
Spark SQL和Spark Streaming都属于Spark系统的组件,它们都依赖于底层的Spark Core。Spark SQL可结合HBase进行数据的查询与分析,Spark Streaming可以进行实时流数据的处理。这两种不同的处理方式可以在同一应用中无缝使用,大大降低了开发和维护的人力成本。
使用JavaWeb构建系统顶层服务,方便用户通过浏览器访问系统、查看分析结果等。将数据计算层的分析结果存储于关系数据库MySQL中,JavaWeb程序只需读取MySQL中的结果数据进行展示即可。
服务层使用JavaWeb获取结果数据后,需要使用前端技术展示在浏览器的网页中,便于用户查看。若需要实时展示最新结果数据,则需要使用WebSocket技术。WebSocket是基于TCP的一种新的网络协议,它可以使客户端和服务器之间的数据交换变得更加简单,允许服务器端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以直接创建持久性的连接,并进行双向数据传输,从而实现数据的前端实时展示。
为了让结果数据在浏览器网页中的展示更加直观、易于理解,往往需要使用图表进行展示,例如柱形图、饼形图等。HTML5对图表的支持非常友好,因此可以借助目前比较流行的HTML5图表组件ECharts实现数据图表化。
ECharts是一个使用JavaScript实现的开源可视化库,可以流畅地运行在个人计算机(PC)和移动设备上,兼容当前绝大部分浏览器(IE9/10/11、Chrome、Firefox、Safari等),提供直观、交互丰富、可高度个性化定制的数据可视化图表。