面向DNS日志的MapReduce性能优化技术研究
2018-05-23刘鹤煜张棪杨兴华崔华俊谭倩
刘鹤煜 张棪 杨兴华 崔华俊 谭倩
摘 要: DNS日志是互联网中重要的访问日志,数量巨大且承载着大量信息,需要借助大数据技术进行处理和分析。现网DNS日志数据量大,且数据倾斜现象严重,对MapReduce的性能有较为严重的影响。基于上述问题,采用小文件合并方法优化分片,缓解Map端的数据倾斜问题,并实现动态设置分片大小,提高MapReduce作业执行效率。该方法有效均衡了Map任务的负载,从而提高了数据倾斜情况下的MapReduce作业的执行效率和资源利用率。实验表明,使用该方法可以有效缩短MapReduce作业的执行时间。
关键词: DNS日志;数据倾斜;MapReduce;性能优化
Abstract:DNS log is important access log of the Internet which are large in number meanwhile carries a large amount of information. DNS log could be processed and analyzed with big data technologies. In the actual network the amount of DNS log is large and the data is skewed seriously. These characteristics of DNS logs have a serious impact on the performance of MapReduce. Based on the above problems small file merging method is used to optimize slipt process of MapReduce and alleviate the data skew of the Map end. Moreover this method realizes setting split size dynamically and improves the efficiency of MapReduce execution. This method balances the load of Map tasks effectively and improves the execution efficiency of MapReduce job and resource utilization ratio under data skew. Experiments show that this method can effectively decrease the execution time of MapReduce jobs.
Key words: DNS log;data skew;MapReduce;performance optimization
引言
域名系統(Domain Name System,DNS)是一个分布式数据库,主要实现了域名和IP地址之间的映射[1-2]。DNS解析过程中产生大量日志,在某运营商的网络中,每天可以产生几十TB级的DNS日志,需要使用大数据技术对DNS日志进行处理和分析。在此,研究选择Hadoop平台[3]和MapReduce编程模型[4]对DNS日志展开探讨与研发。其中,Hadoop是一个分布式系统基础架构,核心是分布式文件系统(HDFS)[5]和MapReduce编程模型。
现网DNS日志具有数据量大、数据倾斜现象严重的特点。数据倾斜现象会导致MapReduce在进行DNS日志处理的过程中出现相应的数据倾斜问题。MapReduce中的数据倾斜问题分为Map端的数据倾斜和Reduce端的数据倾斜[6-7]。Map端数据倾斜是由输入数据分布不均匀导致的,Reduce端数据倾斜是由键值对分布不均匀导致的。
为了解决Map端的数据倾斜问题,本文针对DNS日志处理过程中输入数据分布不均匀的情况提出了MapReduce作业优化,实现了小文件合并方法,还能够动态设计确定分片大小。通过实验对比发现优化的小文件合并方法比MapReduce默认的方法效果更好,并且能够将DNS日志业务处理时间缩短30%以上。
1 MapReduce背景
MapReduce是一个可用于并行运算的编程模型,分为Map和Reduce两个阶段。在执行过程中,MapReduce首先对输入数据进行分片(split),每个分片由一个Map任务来加工操作。经过Map任务处理的结果会通过分区函数的分区(Partition)运算后,并将不同分区交给相应Reduce任务处理,全部Reduce任务执行过后,将结果存储在HDFS上。用户可以根据需求只设置Map任务,而不设置Reduce任务。
1.1 MapReduce分片规则
(1)确定分片大小。数学公式可表述如下:
其中,minimumSize表示最小分片大小,默认为1字节;maximumSize表示最大分片大小,默认为Java long类型的最大值;blockSize表示HDFS的数据块大小,默认为128 MB。默认情况下,MapReduce作业以bolckSize作为分片大小对输入数据进行分片。
(2)分片规则。文件大小不足splitSize时,将该文件作为一个单独的分片;遇到超过splitSize的文件时,如果可拆分,则按splitSize进行拆分;如果不可拆分,则作为一个单独分片。
1.2 MapReduce分区规则
MapReduce作业会调用分区函数(patitioner)对Map的输出进行划分,默认情况下使用hash分区函数,其规则如下:
其中,k是键;hash(k)是键的hash值;r是Reduce数目。通过这个方法可以将Map的中间结果按照键进行划分,交给指定的Reduce进行处理。
2 DNS日志业务逻辑
在现网业务需求中,需要对DNS日志进行处理和分析。原始的DNS日志中定义有源IP、域名、目的IP、采集时间、DNS解析类型共5个字段,通过对这些字段的统计分析可以对域名表征的互联网资源加以分析和监测,其处理流程包括数据清洗、轻度汇总、主题汇总、业务指标计算。
其中,数据清洗主要是对DNS日志进行数据校验,检查数据完整以及数据合法性。轻度汇总主要是按照业务需求对DNS日志字段进行处理,并对解析次数提供初步汇总统计。业务指标的计算需要利用轻度汇总或者主题汇总的结果,并结合业务的实际意义来获得处理输出。研究中,重点涉及有网内解析占比、热点网站分析等业务指标。
在DNS日志的处理流程中,每个作业的Map阶段拟将实现字段的处理,如合法性检查、截取字符串、根据精细域名获取泛域名等。在Reduce阶段,则旨在完成解析次数汇总统计、2张表的等值连接等。
3.1 DNS日志特性
现网DNS日志具有如下特性:
(1)数据量巨大。在运营商网络中,用户访问互联网产生的DNS日志总量约为每日几十TB,且仍在不断增长。
(2)数据倾斜现象严重。数据倾斜分为数据量分布不均匀和日志内容分布不均匀。在数据量方面,DNS日志文件容量差异很大,存在海量小文件。原始DNS日志中,超过80%的文件小于40 MB;清洗后的DNS日志中有60%~70%的文件小于128 MB,1%的文件大小超过1 GB。在日志内容方面,不同网站、不同域名对应的记录数不同,并且相差很大。某大型网站解析次数在总解析次数中占比超过25%,少数几个大型网站解析次数之和超过40%。
3.2 数据倾斜问题
数据倾斜现象使Map端和Reduce端出现资源利用不充分、作业执行时间长等问题。而且,输入数据分配不均,每个Map处理的数据量相差较大,会导致Map端数据倾斜;输入数据的键值对分布不均,在分区过程中不能匀量分配到每个Reduce任务,从而导致Reduce端数据倾斜。本文将着重讨论Map端数據倾斜问题的解决方案。分析DNS日志特性可知,在数据清洗和轻度汇总阶段,输入数据的文件大小分布不均,每个Map任务处理的数据量相差很大,出现Map端的数据倾斜问题。
数据清洗作业的输入数据是.gz格式。在处理.gz文件时 MapReduce不能对.gz文件来划定分片,只能将完整的.gz文件作为一个分片交给一个Map任务进行统筹操作。该作业的分片结果是大量Map任务处理数据量很小的分片,但其余Map任务需要处理数据量大的分片。
由DNS日志业务逻辑可知,数据清洗作业只有Map阶段,该作业输出结果与输入文件个数和数据量分布均匀与否相关,该结果也将作为轻度汇总作业的输入,得到进一步处理。
轻度汇总作业的输入是数据清洗作业的输出。MapReduce支持对文本文件进行分片,因此轻度汇总作业中,大文件会被拆分为不同分片,小文件则作为独立的分片。由于输入文件数据量分布不均匀,轻度汇总作业也会出现大量Map任务的输入数据量很小的情况。
根据MapReduce的分片规则,研究发现如果输入数据中有海量小文件,使用默认的分片规则会遇到如下问题:
(1)Map任务的任务管理和启动占用较多时间。Hadoop为每个任务启动一个新的JVM耗时约1 s[8],如果Map任务处理的分片数据量很小,执行时间只有几秒甚至更少,那么此时的任务管理和启动的时间开销就不容忽视。
(2)Map任务执行时不能充分利用内存资源。如果一个Map任务处理的小文件体积远小于Map任务申请到的内存资源(默认为1 024 MB),那么这个任务申请的内存将无法得到充分利用,造成资源浪费。
因此在数据清洗和轻度汇总作业中,需要解决Map端数据倾斜问题,使Map任务负载最终能够达到均衡。
4 小文件合并方法
为了解决Map端的数据倾斜问题,考虑在MapReduce作业的分片过程中对海量小文件进行合并,将多个小文件合并为一个较大分片后再提送处理,使Map任务的负载更加均衡。本文采用实现CombineFileInputFormat类的方法对小文件进行合并。
CombineFileInputFormat是一个抽象类,可以在分片时将小文件合并,作为一个分片进行处理。对于大文件,如果文件可拆分,则拆分为多个分频;如果不可拆分,则直接作为一个分片。该类中有3个关键变量,分别是:分片大小最大值(maxSize)、同一节点上分片大小最小值(minSizeNode)、同一机架上分片大小最小值(minSizeRack)。默认情况下,以上变量均为0,用户可以通过配置参数设定上述变量,需要确保minSizeNode≤minSizeRack≤maxSize。
创建分片时,首先遍历节点,对节点上的数据块按照maxSize进行合并,如果该节点剩余数据块之和大于minSizeNode,则合并为一个分片;其次遍历机架,对机架上的数据块按照maxSize进行合并,如果该机架剩余数据块之和大于minSizeRack,则合并为一个分片;对于没有加入任何分片的小文件进行统一处理,按照maxSize求得最终的合并。
为了使MapReduce作业在执行过程中能够更加有效,本文针对可拆分文件和不可拆分文件的处理过程引入了控制优化,改进完善了小文件合并方法,对maxSize、minSizeNode、minSizeRack参数进行调优,并设计给出了动态确定分片大小的方法。
4.1 数据清洗的解决方案
数据清洗作业的输入是不可拆分的.gz文件,且数据量分布不均匀,存在海量小文件,需要利用CombineFileInputFormat类对小文件进行合并。
创建小文件合并类CombineSmallFileInputFormat作为MapReduce作业的输入格式,该类继承Combine FileInputFormat类,并且实现createRecordReader()方法,该方法主要用于部署指导Map任务读取输入文件的方式。
图1展示了优化后的数据清洗作业。经过优化的方案会根据分片大小等参数的设置对小文件进行合并,将.gz格式的大文件作为一个独立的分片进行处理。
4.2 轻度汇总的解决方案
轻度汇总作业的输入是数据清洗作业的输出,为可拆分的文本文件,且数据量分布不均匀,存在海量小文件。研究推得的解决方案步骤可分述如下:
步骤一 与数据清洗的方法一致,实现小文件合并类CombineSmallFileInputFormat作为MapReduce作业的输入格式。
步骤二 采用动态方式设置mapred.max.split.size参数,以输入文件的均值作为分片大小。
步骤三 设置minSizeNode及minSizeRack参数,来优化分片大小。
图2是优化后的轻度汇总作业,主要实现了对小文件的合并,以及对大文件的拆分。同时,还增加了根据输入文件的大小动态确定分片的方法及分片相关参数的优化,使作業执行时间进一步缩短。
5 性能测试
小文件合并方法的对比实验将在Hadoop集群上设计展开仿真测试。该集群共89个节点,包括2个NameNode。其中,NameNode1是备用名节点,NameNode2是主节点,存在87个DataNode,所有节点均为相同配置,为同构集群。仿真测试中,物理环境的主题内容可具体选配如下:操作系统为CentOS 6.4 (Final);实验平台为Hadoop 2.6.0-cdh5.4.2;JDK环境为JDK 1.7.0_80;内存为256 G;CPU为32核Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60 GHz;硬盘为18.8 T。
根据各省份日志的特点,选择5个省份某一天数据清洗后的DNS日志作为测试数据,共21 741个文件,7.2 TB。各省日志的数据统计可见表1。
测试用的MapReduce作业实现计数功能,输入数据的字段为:源IP、域名、目的IP、时间、解析类型,以四元组源IP、域名、目的IP、时间(精确到小时)为键进行计数,输出结果为:源IP、域名、目的IP、时间(精确到小时)、解析次数。
5.1 CombineFileInputFormat和TextInputFormat对比实验
测试中,设计了5组实验用于对比小文件合并方法和默认分片方法的作业执行时间,并且对小文件合并方法又设置不同分片大小进行结果比较。实验配置的指标细节可见表2。实验结果可见表3和图3。
如图3所示,合并小文件方法性能提升与分片大小设置有关。使用文件大小平均值作为输入的分片,效果稳定,而且明显优于其余4个实验。
5.2 minSizeNode、minSizeRack参数的对比
此后,又设计了3组实验均使用小文件合并方法,并以均值为分片大小,但指定使用不同minSizeNode、minSizeRack的值进行对比实验。实验中的参数指标设置可见表4。实验结果可见表5和图4。
如图4所示,使用minSizeNode、minSizeRack默认值时的小文件合并作业效果会更好。究其原因即在于,未能设置这2个参数时,MapReduce会将不足一个分片大小的数据块统一处理,以用户设置的分片大小进行合并,而当每个Map任务处理的数据量均衡时,会比较节省集群资源。
6 结束语
本文针对现网DNS日志的特性,对MapReduce作业中Map端数据倾斜问题提出了改进的方案,并将小文件合并成较大的分片。在此基础上,对可以拆分的大文件进行拆分,不可拆分的大文件则作为独立的分片进行处理,同时还做到了动态确定分片大小,使Map端负载趋于均衡,从而有效解决了Map
端的数据倾斜问题。相比默认的分片规则,该方法可以将DNS日志处理过程中的MapReduce作业执行时间缩短30%。在后续工作中,将对MapReduce作业中的Reduce端数据倾斜问题进行优化,实现Reduce端负载均衡。
参考文献
[1] MOCKAPETRIS P V. Domain names: Concepts and facilities[EB/OL]. [1987-11]. https://www.rfc-editor.org/rfc/rfc1034.txt.
[2] MOCKAPETRIS P V. Domain names: Implementation and specification[EB/OL]. [1987-11]. https://datatracker.ietf.org/doc/rfc1035/.
[3] Apache. Apache Hadoop[EB/OL]. [2017-12-18]. http://hadoop.apache.org/.
[4] DEAN J GHEMAWAT S. MapReduce: Simplified data processing on large clusters[J]. Communications of the ACM 2008 51(1):107-113.
[5] Apache. HDFS Architecture Guide[EB/OL]. [2013-08-04]. http://hadoop.apache.org/docs/r1.2.1/hdfs_design.html.
[6] KWON Y BALAZINSKA M HOWE B et al. A study of skew in MapReduce Applications[C]// 5th Open Cirrus Summit. Moscow,Russia:Russian Academy of Sciences,2011:1-5.
[7] KWON Y C BALAZINSKA M HOWE B et al. SkewTune in action: Mitigating skew in MapReduce applications[J]. Proceedings of the VLDB Endowment 2012 5(12):1934-1937.
[8] TOM W. Hadoop权威指南[M]. 3版. 华东师范大学数据科学与工程学院,译. 北京:清华大学出版社,2015.