具体实施方式:
下面结合附图与实施例对本公开作进一步说明。
应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。
需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
在本公开中,术语如“上”、“下”、“左”、“右”、“前”、“后”、“竖直”、“水平”、“侧”、“底”等指示的方位或位置关系为基于附图所示的方位或位置关系,只是为了便于叙述本公开各部件或元件结构关系而确定的关系词,并非特指本公开中任一部件或元件,不能理解为对本公开的限制。
本公开中,术语如“固接”、“相连”、“连接”等应做广义理解,表示可以是固定连接,也可以是一体地连接或可拆卸连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的相关科研或技术人员,可以根据具体情况确定上述术语在本公开中的具体含义,不能理解为对本公开的限制。
图1给出了数据驱动的网络敏感信息挖掘及自进化预警平台***架构。为满足业务应用和处理能力的线性扩展要求,我们建立了层次化、模块化的***架构。***分为四个主要层次,即用户层、业务应用层、数据存储层和数据采集层。其中,用户层注重展现,为方便不同类型用户的使用,提供多种人机交互和信息发布方式。
业务应用层负责网络大数据的分析,在应用层内部实现公有组件与个性业务应用组件剥离,这样可以实现业务应用的线性扩展,而不影响其他软件和***的运行。
数据存储层完成数据的汇聚、存储和原始处理,并提供不同类型的功能调用服务。存储层由分布式的存储与批处理平台、数据交换平台和数据访问与业务服务中间件组成。基于zookeeper分布调度机制的这些平台实现了处理能力和处理方法的线性扩展。
数据采集层对多类数据源进行抓取和清洗,完成原始数据的采集,并通过接入服务实现数据向存储层的汇聚传输。
基于上述架构,本平台具体包括以下几个部分,如图2所示,(1)通过构建分布式实时采集***完成多来源多通道的大数据采集与抓取,数据来源为互联网社交网络、在线论坛、微博客、内容分享社区等主流网络平台;通过可定制、可扩展数据采集模板和包装器,实现对多数据区域非连续性及嵌套属性数据的准确抽取;构建基于Markov逻辑网的数据抽取模型,对数据节点属性进行推理和语义标注,实现对缺失数据的精炼和有效补充;通过基于BloomFilter的大规模链接查重等机制实现对链接的非重复性下载。(2)在数据采集的基础上,设计基于Kafka和Memcached缓存的分布式消息中间件,构建数据源和数据分析处理平台之间的桥梁,实现GB级数据的秒级传送。(3)数据分析处理平台主要负责通过大数据技术和数据挖掘技术实现对数据的深度精准分析和处理,结合不同大数据处理平台-分布式批处理架构Hadoop、基于内容计算的高实时性架构Spark、高容错流处理架构Storm,通过自然语言处理、人工智能、数据挖掘技术构建相应统计模型、分析模型和挖掘模型实现基于数据驱动的敏感信息挖掘与自进化预警功能,主要有相同话题内容的事件识别和相关性检测、基于立场的事件建模、观点相悖度计算、用户同一性检测、预警***的自进化等功能,通过该一系列功能达到敏感事件、危险性人物和组织的识别和预警功能。(4)为方便用户访问网络数据挖掘与分析平台,本功能模块提供多种方式的接口和访问方式,如以API的方式直接为用户程序提供接口,以Web Service的方式或消息队列的形式方便用户程序获取格式化的结果数据,以B/S或C/S的方式为初级用户提供简单易用的界面等。
具体过程包括:
第一部分,多来源多通道适配的大数据分布式实时传输与分发:
(1)基于Bloom filter算法的URL去重,分布式爬虫中URL去重算法一直是重要的技术点,算法的优劣对分布式爬虫的运行效率有很大影响。判断地址是否重复实际上就是判断当前URL是否已经被爬取过,如果当前URL已经爬取过,在其对应的网页还没有更新的时候就不需要重新爬取,这样,不仅避免了不必要的资源消耗,同时也避免了爬虫陷入链接组成的环状死循环。
一个直接而又有效的方式就是通过一个哈希表来保存所有已经访问过的URL。但是随着访问过的地址越来越多,这个哈希表的尺寸随之增大,最终超过内存可以容纳的规模。并且目前外存的访问速度低于内存若干数量级,加之每个URL都需要进行判重的操作,必然会造成大量不必要的开支。所以我们希望能够把需要的数据结构都保存在内存中。基于这些考虑,我们选择了布隆过滤器(Bloom Filter)进行地址判重。
如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路.但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit Array)中的一个点。这样一来,我们只要看看这个点是不是1就知道可以集合中有没有它了。这就是Bloom filter的基本思想。
Hash面临的问题就是冲突。假设Hash函数是良好的,如果我们的位阵列长度为m个点,那么如果我们想将冲突率降低到例如1%,这个散列表就只能容纳m/100个元素。显然这就不叫空间有效了(Space-efficient)。解决方法也简单,就是使用多个Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,不过直觉上判断这种事情的概率是比较低的。
相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和***/查询时间都是常数。另外,Hash函数相互之间没有关系,方便由硬件并行实现。Bloom filter不用存储数据项,只用存储少量的集合结构位数组。除了空间优势以外,Bloom filter在添加元素和查找元素的时间效率都是固定常数,不会随着元素数量的增加而改变。正是拥有了这些优势,使得Bloom filter算法适合处理海量数据。
(2)基于Markov的数据抽取,Markov网也称Markov随机场(Markovrandomfield,简称MRF),是一个变量集合X=(X1,X2,…,Xn)∈χ的联合分布模型.它由一个无向图G和定义于G上的一组势函数
组成.其中,无向图的每个节点都代表一个随机变量,而G中的每一个“团(clique)”都对应着一个势函数(为非负实函数),表示团的一个状态.Markov网所代表的变量集的联合分布表示为
其中,X{k}表示Markov网中第k团的状态,即对应于第k个团中所有变量的取值状态。Z是归一化因子,且
通常,公式(1)表示为对数线性模型,以便于对Markov网中蕴含的实体特征进行具体化,并使得推理和学习等过程更加方便.若把Markov网中每个团的势函数表示为指数函数,指数项为对应团的加权特征量,则可得:
P(X=x)=1/Zexp{∑jωjfj(x)} (2)
其中,ωj表示权重,fj(x)表示特征函数.理论上,这里的特征函数可以是任意的实值函数,然而为方便讨论,本文涉及的特征函数均为二元函数.从用势函数表达的公式(1)来看,可直观地认为每个特征量对应于一个团的某一状态,即团中变量集的一个取值,且该特征量的权重等于logφk(x{k})。
(2)Markov逻辑网
一阶逻辑知识库可看作是在一个可能世界的集合上建立一系列硬性规则,即如果一个世界违反了其中的某一条规则,那么这个世界的存在概率即为零。Markov逻辑网的基本思想是让那些硬性规则有所松弛,即当一个世界违反了其中的一条规则,那么这个世界存在的可能性将降低,但并非不可能。一个世界违反的规则越少,那么这个世界存在的可能性就越大。为此,给每个规则都加上了一个特定的权重,它反映了对满足该规则的可能世界的约束力。若一个规则的权重越大,则对于满足和不满足该规则的两个世界而言,它们之间的差异将越大。Markov逻辑网的定义如下:
Markov逻辑网L是一组二元项(Fi,wi),其中,Fi表示一阶逻辑规则,wi是一个实数。这组二元项(Fi,wi)与一组有限常量集C={c1,c2,…cn}一起定义了一个Markov网:
(1)L中的任意闭原子(groundatom)都对应了中的一个二值节点。若此闭原子为真,则对应的二值节点取值为1;若为假,则取值为0。
(2)L中的任意闭规则(groundformula)都对应着一个特征值,若此闭规则为真,则对应的特征值为1;若为假,则特征值为0。并且这个特征值Fi的权重为二元项中该规则对应的权重wi。
规则可由一组特殊应用的谓词来定义,这些谓词可分为query谓词与evidence谓词,规则进而反映了谓词间的相互关系。谓词用于标注Vision树的属性节点如(IsName(n))、(IsPrice(n))等;evidence谓词一般指观察到的内容或节点自身具有的属性如FirstLetterCapital(n)、ContainCurrencySymbol(n)等。
结合Markov逻辑网方法,本文通过以下三个步骤实现对结果页面的实体属性抽取。首先将页面进行预处理,利用视觉的页面分割算法VISP构建相应的Vision树,并根据视觉规则进行噪音节点的剪枝,方便后续块的标注工作;然后根据Site-Level与Page-Level知识对多层页面进行分类,根据不同特性确定不同类型页面下的谓词,最后通过规则推断出数据记录块节点与数据属性节点。第一步的目标在利用视觉分割算法VISP将结果页面进行区域分割并构建对应的Vision树。利用视觉规则过滤掉所有非数据记录节点的节点,可识别非连续型数据记录,解决了传统DOM树仅识别单一数据区域的问题,且可适用于多种页面编码语言(HTML、XML等)。
步骤二负责对页面特征的抽取。大多数结果页面可以分为Ⅰ内部页面,包含同一页面内各元素及其关系;Ⅱ详细页面,如图区域包含了具体实体的详细信息,通过内部页面的超链接访问;Ⅲ同类页面为同一站点下由相同模板生成,其包含实体具有一定的结构、位置、外观相似性。
步骤三利用了Markov逻辑网对上述关系进行建模以实现特征的有效合并。通过对三类特征的集成,可计算出所有最大谓词,完成对实体属性的推理抽取。推理的最终结果以表格形式进行存储,可有效反映结果页面对应的数据库的基本结构,此外,逻辑网可直接进行规则定义,从而简化了传统数据抽取中的属性语义标注的环节。
(2)基于Kafka的中间件,消息中间件借鉴了观察者(Observer)模式又名发布-订阅消息(Publish/Subscribe)模式的思想,消息管理器可以管理多种消息,每种消息都有一个“主题”来进行区分,消费者都是通过主题在消息管理器中进行订阅,不需要生产者的任何信息,同时生产者也不需要知道消费者的任何信息,只需要按“主题”发布消息就可以了,而选择kafka作为中间件,有以下优点:
解耦:kafka消息***在处理过程中间***了一个隐含的、基于数据的接口层,客户端通过实现kafka接口完成与消息***的通信操作。这种设计降低了***模块间的耦合性,可以根据用户需求对相关功能模块进行替换修改。
扩展性:kafka消息***采用了分布式架构,所以当输入数据量增大时,kafka可以依据流量扩展broker节点,而不用修改代码和配置文件。
缓冲能力:在访问量剧增的情况下,应用仍然需要继续发挥作用,虽然这种突发性变化并不常见,但是面向流数据处理的应用,应该具有应对这种情况的能力。kafka消息队列能够缓冲***的流量压力,使***免于在大数据的压力下失效。
健壮性:作为分布式消息***,kafka在某一部分功能失效时,不影响整体***的工作。
异步:kafka分布式消息***采用异步通信机制,消息进入***缓存后***无需立刻应答或处理,可以根据用户需求和配置情况选择。
Kafka这个分布式消息***以较低的延时可以收集和分发大量日志数据文件。***设计了数据收集***和消息队列,所以同时可以适应在线和离线处理两种方式。在吞吐量和可伸缩性方面,kafka在***中做了一些设计事其在这两个方面有更好的表现,例如,分布式架构,分区存储,顺序硬盘读写等方式。Linkedin公司在使用kafka一段时间后,每天可以达到百G级别的处理量。
(3)Memcached缓存,Memcached是一个高性能的分布式的内存对象缓存***,主要用于避免对数据库的过多访问,减轻数据库压力。它的基本原理是通过在内存里维护一张统一的巨大的hash表,用来存储各种格式的数据,包括图像、视频、文件、文字以及数据库检索的结果等。通过将有用的数据缓存起来,下次用户再请求相同的数据时,再直接访问缓存,避免了对数据库的重复访问和存取操作,减少了冗余数据在网络上的传输,从而大大提高读取速度。
Memcached是***的主程序文件,以守护进程方式运行于一个或多个服务器中,随时会接收客户端的连接和操作,使用共享内存存取数据。
Memcached缓存技术特征有如下几点:
(1)协议简单,协议是基于文本行的,可以直接通过远程登录到Memcached服务器上,进行数据的存取操作。
(2)基于libevent事件处理,Libevent是使用C语言开发的程序库,将Linux***的kqueue等事件处理功能封装成一个接口,相比传统的select语句,性能要更高一些。
(3)内置的内存管理方式,存取数据很快。缓存替换件策略是LRU算法,即最近最少使用算法。LRU算法的基本原理是,当分配的内存可用空间不足时,它利用缓存替换算法,首先淘汰最近最少使用的数据,将这些数据替换出内存,释放存储空间来存储其它有用的数据。
(4)分布式,各个Memcached服务器之间采用分布式的方式,相互之间不影响,独立完成各自的工作。分布式功能由Memcached客户端部署,Memcached服务器本身并不具有分布式功能。
Memcached的工作原理如下:与很多cache工具相似,它采用的是C/S模式,在server端启动服务进程时可以设置监听的ip、自己的端口号、使用的内存大小等几个关键参数。服务进程启动后,服务就是一直可用的。Memcached的目前版本是通过C语言实现的,支持各种语言编写的客户端。server与客户端建立连接后,就可以从缓存服务器中存取数据了,数据在缓存服务器中都是以键值对的形式保存,数据对象的获取就是通过这个唯一的键值进行的,键值(key,value)对是Memcached能够处理的最小单位。简单一点来说,Memcached的工作就是维护一张巨大的hash表,这张hash表存放在专门的机器内存中,通过这张hash表存储频繁读写的热点数据文件,避免直接操作数据库,可以减轻数据库负载压力,进而提高网站整体性能和效率。
第二部分,多源、异构流态大数据分布式在线实时处理:
以实时采集数据为基础的数据流处理是大数据平台应用构造的关键。面对持续到达的数据流,数据流处理***必须在用户可接受时间内快速对其进行响应并即时输出结果。采用可预处理、数据分拣和复用中间结果方法避免数据流到达时的历史数据重复处理开销,使数据流处理本地化,减少节点间的数据传输开销。
(1)HDFS文件***优化存储策略的海量数据高效存储架构
HDFS***中,如图3所示,只有控制节点和数据节点,控制节点负责***控制和策略实施,数据节点负责存储数据。当客户端向HDFS文件***中存储数据时,首先客户端和控制节点通信,控制节点根据副本系数去选择数据节点,然后返回给客户端选择的数据节点,最后客户端和这些数据节点直接通信传输数据。这一过程涉及到数据节点和控制节点的心跳通信、数据节点的数据结构、数据节点的状态信息、以及控制节点的存储策略。数据节点通过心跳协议定期向控制节点汇报其状态信息。控制节点根据状态信息作为存储策略来选择数据节点是否合适的依据,存储策略会根据闭值与数据节点的状态信息来确定是否选择这个节点。同时选择哪些位置的数据节点也要根据***的策略来确定。
状态信息是数据节点本身状态的描述,是对数据节点操作和分析的基本;也是其数据结构的重要组成部分,同时也涉及到心跳协议对这些信息的传递。通过对其状态信息的分析,深入理解如何获取、传递和处理其状态信息,是优化状态信息的基础,同时也是实现DIFT存储策略依据的基础。
目前其状态信息包括DatanodeInfo类的成员变量,capacityBytes(存储容量),remainingBytes(剩余容量),lastUpdate(最后更新时间)等信息,这些信息需要数据节点定期向控制节点汇报,控制节点利用这些信息作为数据存储策略的选择依据。这些信息可以通过Linux***命令获得,在HDFS中通过Shell类来运行Linux的***命令。
(2)心跳协议
心跳协议在Hadoop分布式的架构中有着无可替代的重要作用。通过心跳协议保持着控制节点和数据节点之间、数据节点与数据节点之间的联系,让控制节点了解数据节点的状态,让数据节点从控制节点处获取最新命令,以及让数据节点了解其他数据节点的状态。
数据节点通过定期的向控制节点发送心跳,汇报当前数据节点的状态信息,同时告诉控制节点自己还活着,而控制节点通过对数据节点的心跳答复发送一些命令信息,例如,哪些块可以删除了,哪些块损坏了,哪些块需要增加副本等。
Hadoop中通过dfs.heartbeat.interval参数来控制数据节点向控制节点发送心跳的频率,默认值是3秒,即每3秒发送一次,过高的频率可能会对集群的性能有影响,过低的频率可能会导致控制节点不能获得数据节点的最新状态信息。
控制节点在接收到数据节点的心跳后的算法处理过程如下:
(1)首先对控制节点的身份进行检查包括版本信息,注册信息等;
(2)控制节点更新该数据节点的状态信息,例如磁盘空间,磁盘使用空间,磁盘空闲空间等;
(3)控制节点查询该数据节点的块状态,然后生成对数据节点的命令列表。例如删除损坏数据块,增加副本个数不足的数据块等;
(4)控制节点检查当前的分布式***更新状态;
(5)控制节点将生成的命令信息发送给相应的数据节点;
(6)心跳处理完毕。
数据节点的状态信息会通过心跳协议由数据节点向控制节点发送,数据节点的存储策略就需要使用这些状态信息。
(3)数据存储策略
数据存储策略是HDFS存储数据过程中使用的策略,包括位置选择、节点选择、节点排序。HDFS集群通过使用此策略实现了数据的高效存储,使得集群具有稳定性和可靠性,通过深入分析这些策略的原理,可以进一步理解策略的实现方法和其中不足的地方。其中默认的位置策略是本地选择一个节点,本地机架选择一个节点,其他机架选择一个节点。下面详细介绍其实现原理。
HDFS采用一种称为机架感知的策略来确定数据节点的位置,控制节点采用NetworkTopology数据结构来实现这种策略。如此可以改进数据的可靠性、可用性和网络带宽的利用率。通过一个机架感知的过程,控制节点可以确定数据节点所属的机架id。默认的存储策略就是将副本存放在不同的机架上,就可以防止整个机架发送故障数时造成数据丢失,并且读数据的时候就可以充分利用机架的带宽。这种策略设置将副本数据均匀的分布在集群之中,有利于当节点或者机架故障的情况下的负载均衡,但是增加了读取和写入操作时机架之间传输的代价。
NetworkTopology类将整个集群中的数据节点存储成了一个树状网络拓扑图。默认情况下,副本系数是3,HDFS的存放策略是在本地机架节点上存储一个,同一个机架的另一个节点上存储一个副本存,其他机架的节点上存储最后一本。这种策略使得机架间的数据传输减少了很多,提高了数据写入的效率。机架的故障比节点的故障少很多,所以这种策略对数据的可靠性和可用性检响。与此同时,因为数据块存放在两个不同的机架上,所以在这种策略下读取数据时的网络传输需要的带宽。在这种策略下,副本并是非均匀的存借同的机架上的;一个节点上存储三分之一的副本,一个机架上存储三分之二本,剩下的机架中存储其它副本,并且均匀分布,这种策略改进了写的性能同时对数据可靠性和读取性能没有影响。
集群中的一个路由器节点可以包含多个路由器节点,也可以包含多个机架节一个机架节点可以包含多个数据节点,这是控制节点使用NetworkTopology来存储HDFS集群中所有节点的方式。控制节点通过这种树状网络拓扑结构来表示集群中数据节点在物理位置上的映射,可以方便的计算任何两个数据节点之间距离,同时也为控制节点检测集群的负载情况提供计算依据,例如,属于同一个机架的数据节点之间在物理距离上是非常近的,可能在一个局域网内。同时控制节点也可以计算局域网目前网络带宽的负载情况,这对控制节点为一个文件的块副本选取存储节点以提高存集群的储性能是非常重要的。
基于以上的数据节点的网络存储模型,控制节点就可以利用存储策略中的位置策略来选择数据节点。存储策略中的位置策略的算法流程如图4所示:
以上过程是最基本的位置选择方法,默认副本系数为3,基于以上的网络模型,可以方便的在本地机架选一个数据节点,在远程选择一个数据节点,在本地机架选择第三个数据节点。算法说明如下:
1、存储策略选择数据节点前需要判断集群中数据节点的状态和备份系数,然后计算每个机架上的最大选择节点数。
2、节点位置策略首先会在本地选择一个数据节点,并且使用节点选择策略判断节点是不是合适。其次会在远程选择一个数据节点,同样使用节点选择策略判断节点是不是合适。最后会在本地再选择一个数据节点,还需要使用节点选择策略判断节点是不是合适。
3、如果副本系数大于3,则剩余的数据节点会在集群中随机选择,同样需要使用节点选择策略判断节点是不是合适。
4、存储策略在返回选择的数据节点之前,需要调用节点排序策略对节点排序,之后才返回给控制节点,选择本地机架节点和远程机架节点都有一个节点为参考,实现方式是:如果参考节点为空,则从整个集群中随机选择一个合适的数据节点作为本地机架节点;否则就从参考节点所在的机架中随机选择一个合适的数据节点作为的本地机架节点,若这个集群中没有合适的数据节点,则从已选择的数据节点中选出一个作为新的参考点,如果找到了一个新的参考点,则从这个新的参考点在的机架中随机选择一个合适的数据节点作为此时的本地机架节点;否则从整个集群中随机选择一个合适的数据节点作为此时的本地机架节点。如果新的参考点所在的机架中仍然没有合适的数据节点,则只能从整个集群中随机选择一个合适的数据节点作为此时的本地机架节点。
在选择节点时候需要判断数据节点是否是合适节点,这需要根据数据节点的状态信息来判断选择节点,如何设置判断的那些信息、每个状态的i}值和算法流程,这就是存储策略中的节点选择策略,也是优化存储策略需要考虑的问题。最终选择出的数据节点会以管道的方式返回给控制节点,管道里面保存的是根据相应的策略排队的数据节点的数组。管道返回数据节点数组的时候,如何根据数据节点的信息来重新排队,这就是节点排序策略。在集群中网络带宽是很重要的资源,所以管道的数据节点数组的排队设计应该对网络位置和客户端距离比较近的节点设置以较高的比较权重,整体考虑集群的性能,其他状态信息需要根据需求设置不同的比较权重来满足实际应用的需求。这些设计都在DIFT存储策略里面实现,同时比较的阈值都是可配置的。
第三部分,基于分布式内存技术(Spark)的高实时性计算
内存计算(In-Memory Computing),实质上就是CPU直接从内存而非硬盘上读取数据,并对数据进行计算、分析。针对海量数据以及实时数据分析的需求。传统的大数据处理是先对数据进行分块,然后对磁盘中的数据进行并行读取处理。因此,磁盘和网络的数据I/O会成为***可扩展性的瓶颈。例如,SATA磁盘的随机访问延时在10ms左右,固态硬盘的随机访问延时在0.1-0.2ms,而内存DRAM的随机访问延时是100ns左右。因此内存和外存之间会形成存储墙。针对这一情况内存技术就孕育而生,CPU直接读取存放在内存中的数据而不是从硬盘中读取数据,使得数据的来源不是磁盘,解除磁盘I/O引起的***可扩展性瓶颈。
MapReduce模型适合于大规模数据的批处理计算,并且Map和Reduce是以同步的方式来运行,而且对产生的大量中间结果排序后写回磁盘,致使***I/O开销极大,致使MapReduce模型不适合于对海量的、快速的流数据进行实时处理的主要限制。大数据实时计算平台以MapReduce处理框架为基础,提出一种可扩展、分布式的流数据实时处理方法。
(1)基于Hash技术的中间结果优化
Map的输出即中间结果,将会继续写入到缓冲区,在把缓冲区的数据写到磁盘前,会进行一个二次排序,首先根据数据所属的partition排序,然后每个partition中再按Key排序,排序过程需要较大的CPU计算开销;同时,由于数据存储在磁盘,对中间数据的频繁读写,会造成极大的I/O开销。为了消除对中间结果排序造成的CPU消耗,以及减小存储结构导致的中间结果频繁读写带来的I/O开销,提出一种基于Hash技术的中间结果优化机制,如图5所示,以对大规模的流数据进行快速处理。
Hash函数h1根据预定的Reduce任务配置方案,将Map的输出划分成一系列子集。具体地说,h1将Map的输出数据分割成n个桶(bucket),其中第一个桶,称为D1,完全存储在内存,其他桶当写入缓冲区写满时,数据存储到磁盘。通过这种方式,可以完全在内存中用Reduce函数处理中间结果数据。随后其他桶依次从磁盘读取数据,一次一个。如果一个桶Di可以装入内存,可以完全在内存中执行Reduce任务,否则,用Hash函数h2再对它递归的进行分割,直至可以装入内存。相较于传统MapReduce模型:首先,在Map端,它避免了在排序合并阶段的用于排序的CPU消耗;其次,如果应用程序指定一个范围的重要key值,可以设计Hash函数h1,使D1包含这些重要的key值,以进行快速的处理。
(2)基于Hash技术的动态增量内存处理
传统MapReduce模型,Reduce任务节点远程读取中间结果,读取到中间结果后,对相同key值的(key,value)进行多遍合并(multi-pass merge)处理,结果输出给Reduce函数,产生最终分析结果。多遍合并是一个阻塞操作,Reduce函数直到其完成才执行,致使CPU利用率降低,同时,因为没有足够的内存来存储中间结果。多遍合并(multi-pass merge)操作会频繁读写磁盘,I/O开销较大,这些都致使传统MapReduce模型不适合处理流数据。为此,提出一种基于动态增量Hash技术的Reduce快速内存处理方法,用于替代多遍合并(multi-pass merge)操作,以适应大规模流数据的快速处理,如图6所示。
基于动态增量Hash技术的快速内存处理方法,用于支撑Reduce任务的增量和单遍分析能力,包括简单的聚集以及复杂的流数据处理算法。
当Map端处理完后,首先初始化函数init(),将(key,value)对规约为(key,state)对;然后基于频繁Key识别算法,动态决定哪些(key,state)对驻留在内存中并通过Hash函数h2散列到B+树,在内存中执行Reduce函数进行实时处理,哪些Key的State被Hash函数h3散列到缓冲区的桶,进而写入到磁盘上,内存有空闲后,立即被载入到内存,通过Hash函数h2散列到B+树,并执行Reduce函数,迭代,直至所有桶被处理完成。
设K是不同的Key的总数,M是(key,state)的总数。假设内存包含B个分页,每个分页可以驻留np个(key,state)以及它们相关的辅助信息。当接收新的(key,state)元组时,每个Reducer将内存中的B个分页划分为两部分:H个分页被用作写缓冲区,并将文件写到磁盘上,而B-H个分页用于频繁key-state对。因此,s=(B-H)np个(key,state)可以在内存中实时处理。在算法维护内存中的s个Key K[1],...,K[s],states[1],...,s[s],以及对应于Key的s个计数器c[1],...,c[s]初始化c[i]=0,i∈[s]。当一个新的元组(key,state)到达时,如果该Key当前正在Hash B树中,c[i]递增,s[i]进行更新。如果Key不在HashB+树中,并且存在i使得c[i]=0,那么(1,K,V)赋予(c[i],k[i],s[i]),若key不在HashB+树中,且所有c[i]>0,i∈[s],则该元组需要被写入到磁盘,所有c[i]减1。每当算法决定从内存删除一个或写出一个(key,state)元组,它总是先分配数据项到一个Hash桶,然后将其写入到该桶的写缓冲区。
为扩大中间数据存储容量,基于外部构造SSTable文件结构进行存储,利用读写开销估算和内外存替换方法,优化缓存数据的高并发读写性能。为了扩大中间结果的本地存储容量,在外存构造SSTable文件存储中间结果。SSTable文件结构包括一个索引块和多个64KB的数据块,以块为单位为Hash表项分配外存空间。在数据流处理过程中,如果所需的中间结果Hash表项不在内存而在外存并且内存已无空间,将发生内外存替换。现有基于SSTable结构的文件读写策略是写优化的,如BigTable在将内存缓存数据写(dump)到磁盘时采用直接写入一个新文件的追加写(minor compaction)方式,而在读时需要将缓存数据和若干个小文件进行合并(merge compaction),开销较大。对于中间结果本地存储文件来说,读写操作都比较频繁并且比例均衡,不能盲目地只优化写操作.为提高并发读写性能,可以根据开销选择读写方式。出现内外存替换时,对于要替换的Hash表项,应该首先利用Map和Reduce阶段间的缓冲区查看该表项是否即将被访问。若此表项不会很快被访问,采用写开销较小的追加写方式;若此表项很快被访问,根据不同的时间开销选择合并写和随机读方式,或者追加写和合并读方式。
第四部分,基于分布式内存计算技术的高实时性计算引擎
针对知识信息大数据分布式存储且文本和图片粘合的特征,基于分布式内存计算的MapReduce框架,以消除中间数据写回磁盘的I/O开销,同时设计弹性分布式数据集(RDD)结构,并结合数据本地性和传输优化、调度优化策略,最终实现大数据的高实时性、高响应性分析。
RDD是分布式内存的一个抽象概念,允许开发人员在大规模集群上执行基于内存的计算。RDD可将数据存储在内存中,减少磁盘的访问次数,因此极大地提高了处理数据的性能。它是只读的分区记录的集合,只能通过读取HDFS(或与Hadoop兼容的其他持久化存储***)生成或由其他的RDD经转换操作生成,这些限制方便实现高容错性。
RDD对象本质上来说是一个元数据结构,一个RDD存储着块和机器节点的信息及其他元数据的信息。一个RDD可以包含多个分区,在数据物理存储上,RDD的一个分区对应一个块,这些块可以分布地存储在不同的机器节点中,块可以存储在内存中,当内存空间不足时,也可以部分缓存于内存中,其余数据存储在磁盘中。RDD的数据管理模型如图7所示。RDD1包含有五个分区b11、b12、b13、b14、b15,分别存储在四个机器节点node1、node2、node3、node4上,其中分区b11和分区b12都在机器node1上。RDD2有三个分区b21、b22、b23,分别存储在node2、node3和node4上。
在线数据处理平台的分布式内存计算架构采用主从模式,控制节点主要保存集群中计算节点信息,并建立任务调度机制、数据分片调度和追踪机制,以及并行计算状态追踪机制;计算节点则通过与控制节点通信,开辟内存空间,创建任务线程池,运行控制节点分派的任务。
运行于分布式内存集群的流程大致可分为5个阶段:
(1)初始化集群管理程序。检测集群可用CPU和内存等状态信息。集群管理程序是控制枢纽,可为后续计算任务分配资源。同时初始化任务调度器和任务追踪器,其功能为分发任务以及收集任务反馈。
(2)初始化应用运算实例。依据用户提交的程序描述创建分布式的数据集对象,计算数据集的分片,创建数据分片信息列表、数据分片之间依赖关系列表。依据数据的本地性原则,分配相应数据分片存储于指定的计算节点之上。
(3)构建运算的有向无环图。将运算过程中涉及到的map、sort、merge、shuffle等计算过程以序列的方式增量累加成DAG图,而后依据DAG图将整个运算过程分解成多个任务集合。
(4)任务调度器按照任务执行自顶向下的顺序,将任务集合中的子任务通过集群管理器分发到指定的计算节点之上,每个任务对应着一个数据分片。如果任务失败则重新发布。
(5)计算节点接收到任务后,为任务分配计算资源,创建进程池开始执行计算,并向控制节点反馈进程分配情况。
集群运行计算过程中需要保证任务的最优调度,即将任务分配到相应计算节点之上,该节点缓存了任务计算所需的数据分片,确保数据的本地性。同时当某个任务运行速度低于一定阈值时则在其他节点之上重新开启任务。
第五部分,基于分布式处理平台的数据挖掘与深度分析
以黄、赌、毒、恐等涉及的各类网络犯罪作为监控预警平台监测的主要对象,采集具有代表性的讨论观点建立社会立场,识别出与网络犯罪话题相关的观点持有者,计算其各类观点与确定的社会立场之间的相悖度,从而确定对社会安全造成威胁的观点持有者并进行监控和预警。
事件识别是将输入的报道内容归入不同的事件类别,并在需要的时候建立新的事件。但是当某类话题在已有话题集中并不存在时,这项工作就等同于无监督的文本聚类。事件识别算法本质上来说是属于数据挖掘中的文本聚类算法。本文中将采用k-means文本聚类算法。
K-means是一种典型的基于划分的方法,它的目的是将数据分组,各自聚集成若干个类簇(Cluster)。使得在同一个类中的对象之间具有较高的相似度,不同类之间的对象差别尽可能大。算法首先选择K个随机的中心点,每个点被初始化后将代表一个类的中心平均值,对剩下的每个文档,根据它到类中心的距离,距离计算方法如下文中的文本相似性检测所述,以迭代的方式被逐个划分到距离最近的类,然后重新计算每个类的平均值,调整类中心。不断重复这个过程,直到所有的对象都已经被划分都某个类为止。
K-means的算法复杂度为O(nkt),其中t为迭代次数,n为文档个数,k为类别个数。通常k、t<<n,所以k-means算法具有很高的效率。K-means聚类算法的优点主要有:算法的思路明确、实现简单、算法效率高、对于凸型的待划分数据能够得到很好的聚类结果。
具体的,输入:数据集,初始聚类中心。
输出:最终聚类中心。
(1)Map函数
1)将初始聚类中心通过DistributedCache分发给每个Map节点。
2)for each样本i in数据集m:
使用如下公式计算每个i与聚类中心的差异,使用具有最小差异的聚类中心的标号标注i。
3)使用如下公式计算目标函数并累加。
4)for each属性a in样本i:
统计每个属性的众数。并将其写入众数矩阵。
5)将众数矩阵、目标函数的值输出。
(2)Reduce函数
1)从Mapper处读取所有的临时结果。
2)将各个临时众数矩阵相同位置的值相加,合并成一个众数矩阵,汇总目标函数的值。
3)根据众数矩阵,得出新的聚类中心并将其更新。
4)把目标函数的值传递给主函数。
(3)主函数
1)若当前目标函数的值与上一轮计算不同,则循环运行程序,否则停止程序。
聚类过程为迭代型任务,当任务具有收敛特性时,能取得较好的效果。
Apriori算法的主要思想是通过层次搜索逐层遍历,先找到频繁1项集,然后通过频繁1项集找到频繁2项集。依此类推最后找到频繁N项集。
在发现候选频繁项集过程中,有两个非常重要的步骤。
第一步:就是根据已经发现的N-1阶频繁项集找到所有可能的N项集,这一步骤的名称叫做连接步。就是将符合条件的两个低阶项集合并得到高阶项集。其中的条件就是这两个被选中的N-1阶频繁项集必须有N-2项是一样的,合并后产生的N项集会含有两个N-1阶频繁项集的所有项。然后找到所有这种组合进行合并,就能找到完整的N项集。
第二步:这一步的名称叫做剪枝步。首先有一个事实。一个项集,如果它有任何一个子集不频繁,那么其本身也不频繁。比如{n1,n2}不是频繁项集,那么{n1,n2,n3}必然也不是频繁项集。因为{n1,n2}出现的频率达不到用户设置的最小支持度,那么{n1,n2,n3}的出现频率必然也是达不到的。依据这个事实,可以将哪些由不是频繁项集连接而来的项集直接舍去,提高了算法效率。
具体的,1.扫描数据集,得到候选一项集。
2.在第一步的基础上,由N-1项集求得N项集。这一步需要做多次循环,直到没有新的结果产生。这一步主要的两个操作就是连接步和剪枝步。
3.循环一直执行,直到没有新的结果产生为止。
基于Hadoop和RDD的并行化处理,具体执行步骤如下:
a)将原序列数据库平均划分为n个不相交的子序列数据库。为了在每次对候选序列模式计数时不用扫描原序列数据库,减少I/O开销,应使每个子序列数据库都能放入内存RDD。
b)由Master节点将n个子序列数据库分派给不同的Map工作节点,每个节点执行序列模式挖掘算法,按照设定的最小支持度,扫描存放在Map工作节点内存中的子序列数据库,计算出局部序列模式。
c)将Map过程得到的局部序列模式传递给Reduce工作节点,归并处理得到全局候选序列模式。再一次扫描原序列数据库,找出满足不小于***设定的最小支持度的序列模式。
序列模式挖掘算法,具体为定义1非空集合I={ik,k=1,2,…,n}称为项集,其中ik称为项。
定义2序列是项集的有序排列,序列S可以表示成S=〈I
1,I
2,…,In〉,
序列包含项的个数称为序列的长度。长度为L的序列记为L-序列。
定义3序列数据库由〈Sid,S〉组成,其中Sid表示序列号,S表示序列。
定义4设序列α=〈a
1,a
2,…,a
n〉,序列β=〈b
1,b
2,…,b
m〉,
如果存在整数1≤j
1<j
2<…<j
n≤m,使得
则称序列α为序列β的子序列,又称序列β包含序列α。
定义5序列S在序列数据库的支持度计数为序列数据库中包含S的序列个数。序列S在序列数据库的支持度为包含S的序列在序列数据库中所占的百分比,记为Support(S)。给定最小支持度ξ,如果序列S在序列数据库中的支持度不低于ξ,则称序列S为序列模式。
编辑距离LD(Levenshtein Distance)算法通常被用于输入字符串的快速模糊匹配、英文辅助写作等领域,是一种经典而广为使用的方法。
编辑距离就是指在两个字符串之间,将一个字符串转换成另外一个字符串所使用的***、删除、替换操作的最少次数,编辑距离也是一种字符串之间相似程度的度量标准。用ed来表示编辑距离。
实际上,编辑距离就是将字符串S变化到字符T所需最少编辑操作次数。两字符串之间的编辑距离定义是所有操作序列代价中的最小值。实质上,求两个字符串之间的编辑距离就是求最优化解的一个过程。
基于编辑距离匹配算法来作为识别新数据源的方法,具体步骤如下:
(1)初始化数据源,本平台的多来源多通道适配的大数据分布式数据采集模块中智能地采集数据,并从原始数据中抽取出新的网址部分,作为判断新数据源的候选网址。
(2)采用编辑距离匹配算法计算候选网址和数据源的字符串相识度。编辑距离越小,相似度越大。基于编辑距离计算2个数据源字符串相似度的公式有:
其中,ld表示2个字符串之间的编辑距离;m和n分别为2个字符串的长度;Sim值越大,表示2个字符串相似度越高。
基于storm的数据源进化模块包括三部分,数据接入部分、数据处理、数据落地部分。
(1)数据接入部分:流数据有着不确定性和高并发的可能,为了确保能承载高速的流数据,本文采用Kafka作为消息中间件,接收基于Hadoop分布式平台的数据分布式采集模块中抽取出的各个网址数据作为数据流,然后将其发送给Storm。
(2)数据处理部分:spout负责从Kafka接收数据,并生成第一个tuple,这时的tuple包含两个字段(field),值为原网址和抽取出的一个网址;第一个Bolt接收tuple作为输入,采用基于编辑距离的字符串相似度求解算法得到两个字符串的相识度,根据设定的阈值判定是否是新的数据源,如果是,则输入第二个tuple,字段的值为新的数据源,传入第二个Bolt;
(3)数据落地:将产生的第二个tuple通过第二个Bolt进行写操作,序列化后转成字节流写入Memcached,减少存储压力。
基于立场的社会安全事件监控,基于多层级模式的事件论元角色的识别,论元角色的识别是判断事件句中的实体、时间和数值是否为论元并分配相应的角色,通过构建触发词与论元角色之间的上下文模式来反映二者的关系,进而通过模式匹配来判断是否为论元角色。基于包含语法和语义约束的层级模式进行事件角色的识别,对处理的数据源自动获取四种层次的模式,考虑浅层语义和依存句法信息,在第一、二模式进行硬模式匹配,确保模式约束部分所有的槽都必须匹配才可得到相应的Role结论。在第三、四模式引入软模式的可信度计算方法增强模式的覆盖能力和实现模式的模糊匹配。事件论元角色识别流程如图8所示,首先,以各类网络犯罪为对象,定义上下文图谱(context graph),采用面向主题的定向采集方法按照抓取数据与上下文图谱主题相关度划分层级结构,聚焦具有代表性的观点建立社会立场;其次,在社会媒体数据话题聚类的基础上,基于命名实体识别观点持有者并在特征抽取的基础上提取观点,通过潜在语义方法(LSA)分析文本相似性,建立持有者观点与社会立场间的主题相关性;再次,在同一主题下,向量化观点及社会立场,利用小波变换伸缩平移运算聚焦持有者观点及社会立场中的低频突变观点词汇的变化规律;最后通过计算评价观点相悖度,在预设阈值的基础上进行预警,在社会媒体数据话题聚类的基础上,抽取关键词、标题词、指示词等特征识别话题主题,利用LSA方法将话题主题映射为以各类网络犯罪为分类基准的元主题描述用户兴趣;其次,在观点持有者识别的基础上,抽取主观词、倾向词等特征提取用户观点,利用Apriori算法挖掘用户表述规则表征用户观点;再次,基于组织关系挖掘并构建用户社交网,描述用户社交特征;最后,为异见持有者构建包含兴趣、观点、社交等特征的user profile,通过user profile相似性计算检测用户的同一性,用户同一性检测流程如图9所示。
针对半格式化文本,首先,分离含有种子词语的语句并为其构建语法树,使用POS方法标注种子词语及其上下文词性;其次,将句子表示成<词语,词性>二元组序列,同时将种子词语替换为标识符;再次,基于序列数据MFS-HT算法挖掘高置信度规则发现候选词汇。针对无格式文本,首先,使用词法分析标识种子词语的修饰词,其次,将种子词与修饰词加入轮询起点,采用DP方法发现新词汇;再次,通过与种子词汇互信息计算过滤新发现候选词汇;最后,依据用户主动行为模式分析,评价候选词汇实现词汇进化。
以社交媒体中解析出的种子URL为切入点,对页面进行解析发现表单;其次,抽取表单中的标签L、元素E及其对应关系,通过域元素E有限性分析,排除不可搜索表单;再次,利用LVS方法匹配元素值获取表单提交结果;最后,计算社会立场下新源数据的主题相关性,完成数据源的进化。
在社会媒体数据话题聚类以及观点持有者识别的基础上,引入文献计量学的共现分析、共被引分析等方法,在同主题多话题下基于小波变换计算持有者观点相似度计算,分析同倾向观点持有者统计性规律,以种子嫌疑人为基础发现候选嫌疑人,完成网络敏感的收集、判断以及预警工作。
以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
上述虽然结合附图对本公开的具体实施方式进行了描述,但并非对本公开保护范围的限制,所属领域技术人员应该明白,在本公开的技术方案的基础上,本领域技术人员不需要付出创造性劳动即可做出的各种修改或变形仍在本公开的保护范围以内。