蒋焕亮
摘 要: 随着电商平台、门户网站的访问量越来越大,产生的日志信息也越来越多,传统的日志文件处理方法无法满足需求。通过分析Hadoop分布式文件系统(HDFS)、并行计算框架MapReduce和数据仓库Hive技术特点,研究日志仓库的体系结构及关键技术并建立日志数据仓库。与数据库相比,数据处理效率显著提升。
关键词: 日志; 数据仓库; MapReduce; Hive
中图分类号:TP393 文献标志码:A 文章编号:1006-8228(2016)11-21-04
Establishment of Web logs data warehouses based on Hive
Jiang Huanliang
(Shaoxing Vocational&Technical College, Shaoxing, Zhejiang 312000, China)
Abstract: With the amount of access to the web-portal and electronic business platform more and more, the related Web logs is steadily increasing and the traditional Web logs file is unable to meet the requirements. The Web logs data warehouse is finally established by analyzing the technical characteristics of HDFS, MapReduce and Hive, and studying the architecture and key technology of logs data warehouse. Compared with the database, the data processing efficiency is significantly improved.
Key words: Web logs; data warehouses; MapReduce; Hive
0 引言
随着电商平台、门户网站的访问量越来越大,产生的日志信息也越来越多,传统的日志文件存储和日志处理难于满足要求。Web访问日志中包含了大量的用户行为信息,如访问信息、浏览信息、购买信息、偏好、关注点等。通过对日志的处理,并进行用户行为建模,可以得到有价值的信息,如用户的属性信息、用户标签、用户兴趣爱好、购买意向、再对这些用户的信息进行聚类,划分用户集,为Web个性化应用提供服务[1]。因此,日志文件的存储和处理具有非常重要的意义。
1 相关技术
1.1 hadoop技术
Hadoop系统运行于一个由普通服务器组成的计算集群,集群的主控节点控制和管理集群的正常工作、协调管理集群中从节点的数据存储和数据计算,每个节点均具数据存储和数据计算两种功能。Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)负责控制和管理的主控节点是NameNode,而每个具体负责存储的从节点是DataNode。数据存储节点DataNode和计算机节点TaskTracker会设置在同一物理的从节点服务器上。为了能进行并行化计算,Hadoop提供了MapReduce并行计算框架,该框架能有效管理和调度整个集群中的节点来完成并行化程序的执行和数据处理,负责管理和调度整个集群进行计算的主控节点成为JobTracker,而每个负责具体的数据计算的是从节点TaskTracker。JobTracker和NameNode设置在同一物理的主控服务器上,但系统规模较大则可分开设置 [2]。Hadoop分布式存储与并行计算框架如图1所示。
HDFS提供的大规模数据分布式存储管理系统具有可扩展、高可靠、高可用特性,采用多副本的数据冗余存储机制,并提供了有效的数据出错检查和数据恢复机制,大大提高数据冗余存储的可靠性[2]。
MapReduce并行计算框架将负责调度和分配计算资源,划分和输入数据,调度程序执行,监控程序执行状态,并负责程序执行时各计算节点的同步以及中间结果的收集整理,程序执行流程如图2,分Map和Reduce两阶段并行处理。TaskTracker节点从HDFS读取数据,InputFormat负责读取数据输入格式,然后数据划分多个分片(Split),RecoredREader读取每个分片交,转换成Key-Value键值对,然后交由Map处理,Map所输出的数据进行分区(Partitioner)后,发送到合适的Reduce节点,Reduce节点完成计算后经OutPutFormat输出格式处理,最终将输出数据写回到HDFS[3]。
1.2 hive技术
Hive是基于Hadoop的开源数据仓库,分析查询结构化的海量数据,Hive执行与SQL类似的HiveQL语句,具有选择、插入、合并、子查询、分析等功能。Hive与关系数据相似,支持数据库、表和视图等。通过命令行界面和java数据库编程连接数据库。HiveQL可以摆脱复杂的MapReduce程序设计,将中心放在数据分析、业务需求上[4]。Hive架构如图3所示。
2 日志仓库体系结构
2.1 体系结构
从架构上看,基于Hive的日志数据仓库有用户接口层(Client)、数据分析层和数据存储及处理层构成,如图4所示。具体功能如下[5]。
用户接口层:负责接收用户输入指令,并将指令发送到Hive引擎进行处理。用户层接口包括数据库方法编程接口(JDBC)、命令行接口(Command—Line Interface,CLI)。
数据分析层:包含元数据存储层(Metostore)、Hive驱动(Driver)、编译器(compiler)、执行引擎(Execution Engine)组建,主要功能:存储、数据转换、会话处理、查询获取、执行驱动、HiveQL编译、HiveQL语言分析、执行计划、优化、数据查询等执行操作。
数据存储及处理层:存储数据并从数据分析层(Hive引擎)接收指令,通过HDFS、MapReduce实现数据处理。日志数据仓库关键技术如下。
2.2 按时间划分表
按时间划分表是一种模式,即在表中加入时间戳。日志数据会随时间不断增加,按时间创建表(如按天划分表),实现时间顺序存储日志[2]。如:
Hive>create table weblogs_2016_08_28(id int,….);
Hive>select * from weblogs_2016_08_28
>union all
>select * from weblogs_2016_08_29;
当Hive查询分区表时,通过where子句中的表达式来选择查询所需的指定分区,查询执行效率高。
Hive>select * from weblogs where day>=
20160828 and day<=20160830;
2.3 分区与分区裁剪
Hive通过分区表来提高数据库性能,可以从一个数据源产生多个数据聚合,减少遍历时间,对于大的数据输入集,处理数据时间效率显著[6]。数据以字段进行分片存储。当查询的where子句中包含此分区字段时,只查询与where条件匹配的表分区范围内的数据,减少扫描的数据量而提高查询速度[2]。如:
Hive>CREATE TABLE WEBLOGS2016_08_26
(ID INT, ……)
>PARTITION BY(day STRING, ……);
Hive>INSERT OVER TABLE WEBLOGS2016_08_26
>PARTITION (day='20160826', ……);
数据写入时,Hive不分析数据内容,需手工指定存储分区。数据仓库将按日期数据存储在同一目录中。
当需要对目标表的某一区域内的数据进行分析而不要涉及其他区域时,使用分区裁剪,将目标区域以条件形式存放在HiveQL中,如执行SELECT * FROM WEBLOGS WHERE DATE='20160826'查询时,Hive将直接指向所需目录,而不是对表中的所有数据进行遍历。
2.4 分桶表数据
分区提供一个隔离数据和优化数据查询的便利方式,但是并非所有的数据集都可以形成合理的分区,如按天划分分区,每天的日志量并不一定一样,要确定合适划分大小分区是非常困难。
分桶是将数据集处理成更容易管理的技术。为了取样更高效和更好的查询处理效率,Hive可以将表组织桶(Bucket)。桶是通过对指定列进行哈希计算来实现,并使每个桶对应于列名下的一个存储文件。如表的一级分区是日期(day),二级分区是性别,有可能会产生过多的小分区,而Hive的动态分区数量上是有限的。如:对表进行分桶,并使用用户id字段作为分桶字段,则字段值会根据用户指定的值进行哈希分发到桶中。同一用户id的日志会存储在同一个桶内。一个桶可能会包含多个用户记录。
Hive>SET hive.enforce.bucketing = true ;
Hive>CREATE TABLE WEBLOG (user_id INT, ……)
>PARTITION BY (day STRING, ……)
>CLUSTERED BY (user_id ) INTO 20 BUCKETS;
分桶的数量是固定的,没有数量变化,桶对于抽样非常合适。若两个表都以用户id进行分桶,hive可以创建逻辑上正确的抽样,并对map-side JOIN执行效率提升[2]。
3 日志仓库构建
实验采用虚拟环境测试,物理机和虚拟机配置如下:物理机处理器是Intel(R) Core (TM) i7-4500u 1.8GHz,内存4.0GB,操作系统是Windows 8。虚拟机采用VMware Workstation,Master和Slave节点均使用Centos6,Hadoop-2.5.1,JDK1.7.0,Kafka_0.13.1。
启动Hadoop集群,打开Hive客户端创建数据库、外部表和分区表并灌入数据,如下是创建分区数据表。
Hive>CREATE DATABASE weblogs;
Hive>CREATE EXTERNAL TABLE
weblogs_20160826_partition (
uid STRING,
…… )
COMMENT 'This is the weblogs search data by partition'
PARTITIONED BY (
year INT,
month INT,
day INT,
hour IN T,
)
CLUSTERED BY (user_id ) INTO 20 BUCKETS;
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE;
Hive日志仓库与MySQL数据库相比,在数据量较少的情况下,插入和查询时间效率相似,当数据量较大时(5000万行),MySQL的select进程killed,而Hive日志仓库能高效查询。测试结果如表1。
4 结束语
本文根据Hadoop和Hive的特点,利用分时、分区和分桶技术,设计并实现了基于Hive 的日志数据仓库。实验表明,在Hive上构建日志数据仓库是可行且性能良好,特别是当数据量较大时,数据操作性能明显提高。基于hive的数据仓库可用于离线数据的处理,但对于实时数据处理还需进一步研究。
参考文献(Reference):
[1] 江三锋,王元亮.基于Hive的海量Web日志分析系统设计研
究[J].软件,2015.4(36):93-96.
[2] 黄宜华,苗凯翔.深入理解大数据[M].机械工业出版社,2014.
[3] Tansel Dokeroglu, Serkan Ozal, Murat Ali Bayir. Improving
the performance of Hadoop Hive by sharing scan and computation tasks[J]. Journal of Cloud Computing,2014.3:1-12
[4] 王德文,肖凯,肖磊.基于Hive的电力设备状态胸袭数据仓库[J].
电力系统保护与控制,2011.9(41):125-130
[5] 王德文,肖凯,肖磊.基于Hive的电力设备状态胸袭数据仓库[J].
电力系统保护与控制,2011.9(41):125-130
[6] 卡普廖洛,万普勒,卢森格.Hive编程指南[M].人民邮电出版
社,2013.