对大数据处理框架的认识和实践

    金琦

    

    

    

    编者按:八年前,联合国在发布的《大数据促发展:挑战与机遇》白皮书中指出:“大数据时代已经到来,大数据的出现将会对社会各个领域产生深刻影响。”随着云计算、物联网、移动互联、人工智能等信息技术的高速发展,2020年全球数据总量已经超过40ZB,大数据技术的确已经渗透到我们生活的各个方面,大数据正在实现人类工作、生活与思维的大变革,其“威力”也强烈地冲击着教育系统,正在成为推动教育系统创新与变革的颠覆性力量。接下来的两期我们就针对大数据这一话题从理论和实际操作两个方面展开研讨。

    大数据具有大容量(Volume)、多形式(Variety)、高速率(Velocity)、低价值密度(Value)的4V特征。大容量指数据的体量非常巨大,传统处理数据的集中存储、集中计算的方式已经很难处理这么大的数据量。多形式是指数据呈现的方式多种多样,包括常见的文本形式以及图片、视频等。高速率是指数据以非常高的速率产生,如各种传感器、实时直播、监控及大量的物联网应用的数据。低价值密度是指单条数据并不具有太多价值,但是通过处理一条条数据就能从大量低价值数据中获取高价值的信息。显然,具有以上特征的数据流都需要复杂的数据处理系统来处理,为此谷歌在2003—2006年陆续发表了主题为GFS(Google File System)、MapReduce、BigTable的三篇技术论文,正是这三篇论文奠定了当下大数据算法的基石,成为大数据发展最重要的推动因素。

    ● Hadoop架构概述

    如果你在百度查询“大数据”,会发现“大数据”和“Hadoop”會成对出现,乃至很多人认为大数据就是Hadoop,这里特别要指出,大数据代表的是一种理念、一种问题解决思路、一系列处理方式的集合。大数据也并不特指Hadoop,Hadoop由Apache公司开发,是应用Google的上述论文的核心技术,采用Java语言进行的开源实现。它以分布式文件系统HDFS(Hadoop Distributed FileSystem)和MapReduce计算框架为核心,支持海量结构化、半结构化、非结构化数据的存储处理,以及一些支持Hadoop的其他子项目的通用工具组成的分布式计算生态系统。下页图1描述了目前使用最广的Hadoop 2.0生态系统的构成,其中包含Hadoop的核心组件和常用工具。

    初学者一看到图中这么多名词,可能就云里雾里了,我们先拨开这些名词上的浮云,结合谷歌三篇论文主题,详细叙述与之相关的三个主要组件:HDFS、MapReduce、HBase。

    ● Hadoop主要组件

    1.HDFS分布式文件系统

    我们知道大数据文件是不断产生的,所以存储空间占用非常大,因此,我们就需要将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,不但提高了系统的可靠性、可用性和存取效率,还易于扩展。谷歌论文Google File System(GFS)对“大数据文件怎么存放的问题”进行了详细阐述,而Apache Hadoop的HDFS就是对这篇论文的开源实现。DFS是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础,是基于流式数据访问和存储管理超大文件的需求而开发的分布式文件系统。其中“流式数据访问”是指读取数据文件就像打开水阀门一样,可以不停地去读取,因为HDFS上存储的数据集通常是由数据源生成或者从数据源收集而来,并会长时间在此数据集上进行各种分析,所以HDFS相对数据的访问时间更重视数据的吞吐量。“存储管理超大文件”更是HDFS的职责所在,现在很多学校的服务器网络日志、物联网传感器群日志都是不间断记录,随着未来技术水平的发展,其数据文件大小可以达到TB、PB级别。HDFS可以部署在廉价的服务器集群上,满足海量数据集的应用程序。HDFS具有很好的扩展性,能够根据学校实际应用需要随时添加廉价服务器设备节点。HDFS是典型的主从架构,具有很好的容错性,由一个主节点(NameNode)、多个从节点(Datanode)组成。主节点用于管理系统命名空间(NameSpace)、调度客户端(client)文件操作及存储任务管理,多个从节点提供真实文件数据的物理支持。客户端通过主节点Namenode从多个Datanode数据节点中获取数据块(Block),Datanode数据节点则自发提交获取到的文件的Namenode信息,用于存储文件的基本信息。Namenode对Datanode的write、read等操作一律通过元数据信息实现查找。为防止Namenode数据缺失、无效,HDFS提供了Namenode的备份节点即SecondaryNameNode,类似于Namenode的克隆,以备不时之需。数据以数据块的形式进行存储,每个数据块可以在多个Datanode上存储多个副本,当单个节点出现问题时,相对应的副本数据能替换问题节点数据,以提高数据安全性。HDFS能保证各个节点的数据存储,并在各节点之间实现高速传输,HDFS客户端与NameNode和Datanode通信过程如下页图2所示,我们可以从中体验到HDFS的高效性和安全性。

    2.MapReduce分布式计算框架

    讲完用HDFS分布式存储数据,接下来我们就来描述如何用分布式来计算这些数据,谷歌论文MapReduce:Simplifified Data Processing on Large Clusters对“大数据怎么计算”进行了详细阐述,而Hadoop的MapReduce就是对这篇论文的开源实现。MapReduce是一种编程模型,应用在海量数据的并行计算中。MapReduce采用分化治理的方法,其中有一个主节点用于任务的管理,各个分节点根据主节点的任务分配进行节点运算,各个分节点再把运算的结果汇总给主节点,因此,MapReduce可认为是任务的分解与汇总,也就是分为Map(映射)和Reduce(化简)两步。经过Map和Reduce的处理,最后输出汇总结果。MapReduce是一种编程模型,主要包括Mapper和Reducer两个抽象类,是一个基于开源的并行计算框架。Mapper用于将切分为块的原始数据进行处理;Reducer用于汇总归约Mapper处理结果,并输出终值。MapReduce计算框架中Mapper可以处理格式的数据流,形成一系列的形式的输出,这些输出经过相应处理,形成形式的中间结果;再将中间结果作为Reducer的输入,Reducer将key值相等的数据做进一步处理,最终形成形式的结果数据,将结果数据写入HDFS中。我们用Hadoop环境中运行自带的WordCount程序来验证Hadoop处理步骤。WordCount程序接收一个文本文件作为输入,并计算该文件中每个单词的出现次数。图3展示了WordCount程序使用map和reduce任务处理数据并排序(Shuffle and Sort),最后将输出结果存入HDFS的全流程(文末有完整的实验过程)。

    3.HBase分布式存储系统

    谷歌论文Bigtable对“大数据文件怎样适应快速查询”进行了详细阐述。而HBase正是对Bigtable的开源实现,它非常适合存储大数据环境下不断产生的非结构化的数据(不方便用数据库二维逻辑表来表示的数据,如图片、视频)和半结构化的数据(结构和内容合在一起的数据,如学校上网日志、一卡通数据),是面向列的分布式数据库,这一点完全不同于其他基于行的关系数据库。它依赖于HDFS和ZooKeeper(一个用来进行分布式协调的服务,这些服务包括配置服务、维护元信息和命名空间服务)。HBase将所有数据以文件的形式进行存储,文件采用二进制编码非常适合快速检索,同时支持MapReduce的批量式计算和点查询(随机读取),具有高性能、高可靠性、高可伸缩性和实时读写的特点。

    HBase提供了Java API的访问接口,基于这些API接口,可以开发实现上网日志和一卡通数据的高速查询和读写模块。用数据读写查询模块,将这些非结构化数据存入HBase数据库中,通过该模块还可以实现快速查询功能。

    非结构化存储系统需要通过ZooKeeper来实现HBase中数据读写与HbaseMaster之间的协调服务。在HBase数据库的底层是分布式文件系统HDFS,通过ZooKeeper来保证各个DataNode节点之间的协同工作,以确保结果的正确无误。当一个数据表传入后都要通过行键按照一定的范围分割成多个子表,并为每个子表的列族创建一个Store实例。这些非结构化数据首先写入Store的MemStore中,当MemStore存满后会Flush成一个StoreFile,一个Store中可以包含0到多个StoreFile,每个StoreFile中都有一个HFile负责存放实际文件。当StoreFile的大小达到一定阈值后,会自动触发合并操作,多个StoreFile会合并成为一个StoreFile,同时发生版本合并和数据删除。StoreFile达到一定大小后触发Split操作,当前的Region(分布式存储的最小单元)会Split成为两个Region,之前的Region下线,HMaster会把新生成的两个Region分配到相应的HRegionServer中去。每个HRegionServer中都会有一个HLog对象,HLog通过WAL(Write Ahead Log,预写式日志)机制对写入MemStore中的数据进行镜像备份,每次用户操作写入Memstore的同时,也会写一份数据到HLog文件,HLog文件定期会滚动出新,并删除旧的文件。当HRegionServer意外终止后,HMaster就会利用HLog中的镜像文件在其他HRegionServer节点上进行数据恢复,保证整个HBase集群的正常工作,提高系统的可靠性。非结构化数据存储系统简要架构示意如图4所示。

    ● 体验一个Hadoop作业处理过程

    前面讲了Hadoop系统的主要概念,对于初学的读者可能还是很难把握内在联系是什么,毕竟安装一个大数据实验环境是一个耗时费力的过程,中间会遇到各种莫名其妙的错误,为此读者可到ftp://bigdata.ourschool.cn(账户:bigdata.密码:hadoop)下载一个已经搭建好Hadoop(版本号2.7.1)集群所有测试环境的虚拟机模板文件(bigdata.ovf),直接导入虚拟机软件就可以体验了,这样在单台模拟Hadoop集群环境进行演练后,再到多台虚拟机或者真实的物理机环境运维系统和处理数据,效率就会提高很多,具体操作和测试过程如下:

    ①安装虚拟机软件,常見的VMWare、VirtualBox虚拟机软件都可以支持,以VMWare为例,打开VMWare,打开文件,选择第一步下载的ovf模板,然后导入安装即可(如上页图5)。

    ②我们在Linux客户端启动Hadoop,进入Hadoop安装目录,运行start-all.sh脚本,这样启动了一组Namenode、Datanode多个节点的Hadoop集群环境,我们就可以开始体验了(如图6)。

    ③Linux客户端创建用echo命令创建一个测试数据文件example.txt,如图7所示(当然你也可以去网上下载或者爬取一些大型数据用来测试)。

    ④然后通过Hadoop HDFS Shell操作命令Hadoop dfs-put 把example.txt文件传送到HDFS上并创建一个input文件。可用Hadoop dfs -ls/命令查看hdfs系统上新创建的input文件。

    ⑤测试Hadoop基本功能,我们用Hadoop自带的Hadoop-mapreduce-examples-2.7.1.jar(不同版本Hadoop自带范例jar版本号也不同)中的wordcount程序测试统计单词的个数,先来体验一下Hadoop到底是怎么运行的,运行程序执行如下命令:“hadoop jar/usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.jar? wordcount/input/output.”用Hadoop自带的一个jar包中的wordcount程序,统计HDFS上的input数据文件的各个单词出现的次数,并将结果输出output目录。运行上述指令后,还可以看到mapreduce的计算进度,map和reduce的进度为100%表示运行处理结束(如图8)。

    ⑥程序运行完以后,执行hdfs dfs-cat/output/*,看一下一个大数据计算范例(单词统计)的结果,如图9所示。

    通过对以上Hadoop作业处理过程的操作,我们对大数据处理框架的基本工作原理有了一定的体验,虽然目前绝大多数Hadoop集群上仍旧运行MapReduce和Pig/Hive模型相关代码,但是MapReduce也有其局限性,并不是处理海量数据的普适方法。接下来还会被其他处理框架取代(如基于内存的开源计算框架Spark),各种框架都在不断改进,优化框架的性能是数据处理框架改进的一个重点方向,未来的大数据世界将会是多种技术和平台共存的世界。相关内容我们下期再探讨,敬请期待!