基于Hadoop_Hive的海量web日志处理系统的设计与实现_刘永增.caj
//p22 hive
对于【结构化数据,比如说,日志文件、关系数据类型】等等,数据可以存放在类似于
表的结构里。这正是能体现出来的优势地方。运行于之上,通过使
用来处理中的数据。从关系数据库中引入了许多的类似的概念
如,表、行、列、模式等,正是由于的这种类特性,使得用户没有必要去
学习复杂的编程,就能够完成自己要完成的任务。此外,只能
处理【“平面化的数据”】。而使用【目录结构】来对数据进行划分,从而提高查询的性
能。为了支持这些特性,除了将数据以表的形式存入以外,还引入了【元存储】
咒的概念用来表示模式信息,元存储一般存储在一个关系数据库中,如
或。需要注意的是,必须安装在集群中的节点上。
//p22 hive的优势
的优势主要体现在如下几方面
除了基本的数据类型外,还支持丰富的其他数据类型如、、。
同时提供用户界面和命令行接口界面来查询数据。这使得用户或者初学
者可以很方便的来测试和调试。
中的服务器支持、等的连接,因此,任何应用程序可
以和交互,并将其当做后端数据库。由于负责语言的转换,所以,任意语言
写成的应用程序都可以和进行通信。
对于复杂的结构化数据,我们甚至可以写我们自己的
程序来解析数据。将表结构存入元数据仓库并且把数据导入到中。
支持类似于中的过滤、连接、、、函数等来进行查询。
使用,我们还可以重定向一个查询的输出到一个表中。除了拥有的特定,
还允许我们附加我们自己的函数和程序作为查询的一部分。
划分和桶
划分是基于输入值的范围,将数据划分成不同的块,从而在执行查询的时候可以跳
过我们不感兴趣的数据。而桶将表中的内容按照列值的某个函数划分成若干个文
件,每个文件中值的数量是随机的。划分数据是基于函数的。划分和桶都是用来
提高查询的性能的。
为了提高的性能,还开发了优化器。按照不同应用
程序的不同需求,我们可以调整少量配置参数来提高和的性能。
//p29
由于我们的系统要处理的是多个站点产生的日志数据。我们会为每个站点产生
的数据创建一个表。由于不支持直接插入一条记录,而只能采用间接地插入,
而且由于每天产生的数据量都很大,如果要用插入记录的方式,则效率会很低。在本系
统中,我们把每天同步过来的日志数据采用的【load方式批量的导入到表中】,具体
的导入方法我们将在节中详细介绍。
在将数据导入的过程中,的作用就是把数据按照已经写好的【HiveQL语句分别
对应于HDFS中】。例如,【将一个“表”、一个“划分”等怎样映射到的HDFS实际目录
或文件中去】。在这一过程中,另一个重要的需求就是中,元存储信息访问的高效
性和其数据的可靠性。正如前文中介绍的,【元存储信息存储了关于的许多重要信
启、表、划分、列】等等。这些信息是用来访问中数据必不可少的。可以说,元数
据在中扮演了【系统目录】的角色。因此,如果不能保证元存储的快速访问和可靠性,
我们整个系统的执行存储和查询的效率将会大大的下降。
//p30
在本系统中,日志接收站点中,将日志数据导入到的语言,我们采用python。
而在结果显示站点中,我们采用的语言接口是php。
//
在关系数据库中,利用加在列上的索引来提高【查询的效率】。中没有【索引】的概念,
相应的概念是我们前面提到过的划分。事实上,【“划分”】在中的保存形式也是按
照一个【目录】的形式来存储的。划分将表中的内容按照某列值的不同划分成不同的部分,
每一部分都会保存在相应的目录下,如果将表的内容按照日期来划分,那么,此
时,表的存储格式就是类似如下的形式
如果用户有一个请求是要求查找某一天中的内容,那么此时,就会【直接到指定
的目录中去查找】相关的内容,而没有必要去其他目录中去查找。即使某些查询的要求是需要查找某几天的相关内容,也【不会扫描整个表】的内容,在表的内容极大
的情况下,这种划分会显著改善的查询效率。从提高查询效率的这个意义上来说,中的【划分和关系数据库中索引】是一致的。
//p35
原
始的、未经处理的日志并适合去处理,对于我们的系统而言,我们只对用户访问了
哪些页面感兴趣,而对用户在访问的时候点击了哪些内容不感兴趣,因此,在我们的系
统中,我们必须将这些【无关的记录清洗掉】。在我们的系统中,我们通过采用在内部查询
串中的where子句中将我们【不感兴趣的行丢弃掉】。最终,我们将查询的结果数据存储
到为它建立的表中。而具体的执行【清理】的工作,我们将其放入一个名为盯
的脚本中完成。
//p35 存储处理模块的设计与实现
每个节点
都负责处理【整个任务其中的一个子任务】。这种架构是【可扩展】的,因为用户可以很容易的
【添加一些节点来提高整个系统的容量和处理能力】。
web日志文件的一个重要的特点就是它的持续不断增长的能力,
因此,我们的系统不仅要能够存储当前所有的日志文件,而且还必须能够【应对不断增长的日志】。其次,系统要处理的【数据量是大规模的】。怎样提高系统的查询、统计、处理的
效率就成为了我们设计系统时必须要考虑到的一个很重要的方面。最后,我们选择的框
架要能够充分利用现有的资源,或者将现有资源稍加改造就能够投入使用,并且这种框
架对资源的要求不能太高。总之,在设计我们系统的这一模块的时候,系统的【低成本性和可扩展性是我们要考虑的重点】。即,我们选择的框架工具应该是基于一思想的。
因为,基于【scale一out】思想的工具的一个优势就在于它的可扩展能力很强,如果现有系统
不能够很好的完成任务的话,我们可以通过在整个系统中【添加节点的方式来扩展整个系统】的性能。而且,这个框架工具能够运行于现有的硬件平台上,也就是说,不需要特殊的硬件就能够完成部署。
基于以上几点的考虑,我们选择这一流行的开源框架来完成我们系统的这
一模块的功能。非常适合于在【大型分布式数据集进行批量处理】。几乎是
一个【可无限扩展的解决方案】,可以用来【收集数据、清理数据、存储数据】等等。
擅长于处理计算量非常大的任务。因此,我们的集群系统以后可以扩展到许多其他方面
的应用,比如说,【图的构建、遍历、自然语言处理、机器学习等这些需要很大计算量的任务】。通过将数据和任务分布到不同的节点来,从而可以并行的处理任务,并
且这种方式可以保证整个系统的可扩展性。允许用户创建复杂的任务,这些任
务可以在十个、百个、甚至上千个节点上运行。
//p37结果输出模块的设计与实现
//p38
我们还必须注意到使用叼
平台的特殊性,由于我们的系统处理的是海量数据,在某些情况下,某些【查询的返回结果数量仍然是非常大的】,此时,我们不能简单的用一个变量来存储查询的结果,而是利用HiveQL提供的语句【将查询结果转存到另一张查询结果表中】,然后,再通过遍历查询结果表来读取数据。
//p43
//