3.1.1 数据离线技术及数据存储技术
智能运维中要处理的数据具有大数据的4V特性,即多样化(Variety)、海量化(Volume)、高速化(Velocity)、低价值化(Value),具体介绍如下。
1)多样化:智能运维中包含的数据类型繁多,如用户信息数据、流量日志数据、设备监控状态数据等。
2)海量化:智能运维中数据在连续的生产场景中不间断生成,每天都会积累大量待处理数据。
3)高速化:智能运维要求数据的处理时间较快,实时调度、实时扩缩容等场景需要在几秒内反馈至生产系统,分析报表类实时性要求不高的场景一般时间滞后期也要在一天以内。
4)低价值化:海量数据的价值密度普遍偏低,即很多数据没有参考价值,少量数据会发挥巨大价值。如网络智能运维监控无线资源控制层连接成功率一般均在95%以上,大多无实际意义,少数情况出现低成功率就会很好地起到预警的作用。
由于智能运维的上述数据特性,单台计算机已经无法满足存储及计算性能的要求,需要搭建多节点的分布式计算及存储集群进行计算和存储。如上文所述,对于智能运维中计算规模较大、时效性要求较低的应用,采用离线计算技术较为合适。接下来将对企业中常用的数据离线计算组件及数据存储系统进行简要介绍。
1.分布式文件系统
在物理结构上,分布式文件系统(Distributed File System,DFS)由计算机集群中多个节点组成,分布式文件系统结构图如图3-2所示。其中节点分为两种类型,一类称为NameNode(管理节点),主要起到管理和维护文件系统的作用;另一类称为DataNode(数据节点),主要用来存放数据资源。
Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)是Hadoop自带的文件系统,具有存储量大、成本低、数据一致性强、容错率高等优势,是最为常见的一种分布式文件系统,在智能运维中得到广泛应用。Hadoop集群搭建配置完成后,HDFS和MapReduce即可使用。本节将简单介绍HDFS的一些操作命令,如上传文件、读取文件、建立目录和复制文件等,具体如下。
图3-2 分布式文件系统结构图
● 查看HDFS文件目录信息。
hadoop fs-ls <args>
● 上传文件到HDFS。
hadoop fs-put <localsrc>...<dst>
● 从HDFS下载文件到本地。
hadoop fs-get[-ignorecrc][-crc]<src> <localdst>
● 删除文件。
hadoop fs-rm URI[URI …]
● 查看文件信息。
hadoop fs-cat URI[URI …]
● 创建目录。
hadoop fs-mkdir <paths>
● 复制文件。
hadoop fs-cp URI[URI …]<dest>
2.分布式协调服务
在承载智能运维应用的分布式集群中,下属的节点经常由于网络环境、软硬件故障等原因,出现上下线的情况。集群中的其他节点需要感知到上述变化,并对其做出调整。以上文的分布式文件系统为例,当主管理节点NameNode出现故障时,就需要启动备用Standby Namenode,而其中的状态监控及主备切换就是基于Zookeeper实现的。此外,在智能运维应用升级和迭代时,一般要更新多台服务器部署的代码和配置,手动修改不仅费时费力,而且一致性和可靠性也难以保证。Zookeeper提供了一种集中管理配置的服务,只要集中在一个地方修改配置,所有与此配置关联的都会进行变更。同时,为了保证数据一致性和读写速度,其还引入了全新的Leader、Follwer和Observer 3种角色概念。其中Leader主要用来发起投票和决议,更新状态信息;Follwer用于处理客户端发起的请求并返回结果,参与主节点选举的投票;Observer不参与投票,只同步状态信息,提高客户端的读取速度。
在Zookeeper安装完成后,利用“zkServer.sh start”命令即可启动Zookeeper服务。然后利用Shell脚本建立客户端连接,基于Zookeeper/bin目录下的zkCli.sh命令,通过“zkCli.sh-server IP:port”创建客户端连接。建立Zookeeper客户端主要是对其节点进行操作,其数据结构如图3-3所示,主要操作包括创建节点、获取节点数据、更新节点内容和删除节点等。
图3-3 ZooKeeper数据结构
3.分布式离线计算组件
Hadoop两个最重要的组件,其中一个为上文介绍过用来存储数据的HDFS,另外一个就是用来计算数据的MapReduce。MapReduce和Spark非常适合离线批处理场景(Spark不仅能实现离线计算,其Spark Streming组件还能实现实时计算)。所谓“离线批处理”可以理解为处理大批量数据,规模可达TB甚至PB级别,但计算完成时间往往比数据生成时间会延迟几分钟或几个小时。虽然离线计算具有一定的时延,但其还具有高容错、可扩展、易开发和大数据的特点,在搜索引擎的索引建立、网站流量分析等场景扮演重要角色。
结合基础的单词计数来详细分析MapReduce的执行流程。图3-4所示为单词计数Map Reduce执行流程分为split、map、shuffle和reduce 4个环节。split环节是将大文件进行分解并行处理,本例是假设分为3份进行计算;map环节的个数与split的个数是对应的,本例中map操作用来分割单词,并标记个数为1;shuffle环节又称“洗牌”,起到承接map和reduce的作用,map处理完成后的数据以键值对形式存储在缓冲区,在缓冲区即将溢出时会进行分区(partition)和排序(sort)操作存入磁盘,分区方法开发者可以自定义(本例是基于key的hash值),基于分区之后的数据会发送到对应的reduce上;reduce对分区后的数据进行合并完成计数功能。
MapReduce能很好地完成大规模数据计算,但由于其执行多步计算时,迭代结果都会存入磁盘,这样会非常影响处理速度。Spark在工作数据集存储方向做了重大改进,将任务之间的结果集缓存在集群内存中,大大降低了任务的整体运行时间。Spark不仅能完成离线批处理,其还包括Spark Streaming实时计算框架,能够完成实时计算。为满足将过程结果缓存在内存中的需求,Spark提出弹性分布式数据集(Resilient Distributed Dataset,RDD)的概念。每个RDD可以包含多个分区,且可以存储在集群不同节点上,但其数据内容不可修改。相比MapReduce的单词计算流程,单词计数Spark执行流程如图3-5所示。Spark通过多个RDD算子完成计算,其首先读取文本文件,然后基于flatMap算子根据空格将句子分割为单词,然后基于map算子对每个单词赋值为1,最后利用reduceBykey算子实现单词计算统计。
图3-4 单词计数的MapReduce执行流程
图3-5 单词计数Spark执行流程
4.资源管理系统
上文介绍了计算框架,不论是MapReduce还是Spark都会将大任务拆分成若干子任务来完成。任务的调度和管理就需要规范化的组件来引导,而YARN在大数据运算中就承担了该项角色。YARN的核心思路是将功能分离,通过两部分来实现。通过ResourceManager来实现集群资源管理功能,通过ApplicationMaster来执行应用程序相关事务,如容错、状态监控和任务调度等。
由于YARN集群具有良好的容错性,在日常智能运维开发中,一般只需指定提交任务处理方式为YARN集群即可,因此本节对YARN的底层机制也不再赘述。