利用Hbase的coprocessor实现增量式Apriori算法

Apriori在数据挖掘中是经典的频繁项集挖掘算法,其主要思想就是如果某个项集不频繁,则任何包含此项集的项集一定不频繁。而今天要实现的增量式的Apriori算法,有点像分布式的Apriori,因为我们可以把已挖掘的事务集和新增的事务集看作两个互相独立的数据集,挖掘新增的事务集,获取所有新增频繁集,然后与已有的频繁集做并集,对于两边都同时频繁的项集肯定全局频繁,而只有一边频繁的项集则需要统计其在两边的频繁计数,这样完成后就能获得所有的全局频繁集,并不需要重新挖掘已有的事务集,效率必然提高。

至于Hbase的Coprocessor,相信大家也很了解了吧,这是根据Google的BigTable中实现的Percolator的开源实现,目的是提供增量操作以及建立二级索引。Hbase提供两种类型的Coprocessor,Endpoint和Observer,Endpoint提供的类似于数据库的存储过程,需要事先部署一份程序到各个regionserver,然后由客户端调用,并汇总各个regionserver处理后返回的数据。Observer就像数据库中的触发器,只需部署到regionserver,其提供PreGet、PostGet、PrePut、PostPut、PreDelete、PostDelete等操作,所以当每个regionserver发生了以上的操作时,就会触发Observer。

今天我们只用到了Endpoint型的Coprocessor,由各个regionserver统计其事务集中所有频繁项集,然后客户端汇总各个region的频繁项集,做个并集,对于计数已达到最低支持度要求的项集就认定为全局频繁,剩下的项集就继续统计其在所有region中的频繁计数,最终获得所有全局频繁项集。第二步,就是增量地插入事务集,用timestamp做好标记,然后按照一开始说的方法,再次得到所有全局频繁的项集。 有必要提一下的是,Hbase从0.98版本开始,Coprocessor的远程通信采用了protobuf标准,protobuf需要实现定义通信格式,下面就是该算法需要的protopackage apriori;option java_package = “dave.apriori.protos”;option java_outer_classname = “AprioriProtos”;option java_generic_services = true;option java_generate_equals_and_hash = true;option optimize_for = SPEED;message AprioriRequest { required int32 length = 1; required float support = 2;}message AprioriResponse { message FrequentSet {required bytes fset = 3;required int32 support = 4; } required int32 count = 5; repeated FrequentSet fsets = 6;}message SpecialRequest {repeated bytes fsets = 7;}message SpecialResponse {repeated int32 supportCount = 8;}message HelloRequest{required bytes hellostr = 9;}message HelloResponse{required bytes helloresp = 10;}service Apriori { rpc getFrequentSet(AprioriRequest)returns (AprioriResponse); rpc getSepecialSupport(SpecialRequest)returns (SpecialResponse); rpc sayHello(HelloRequest)returns (HelloResponse);}

定义了三个service,一个是获得该region所有的频繁项集,另一个是获取某个项集在该region的计数,最后是测试用的sayHello。 定义好了之后,,用protoc –java_out=. Apriori.proto命令就可以在当前目录下生成相应的java文件,再导入到项目中就可以编写服务器和客户端了。 部署过程和源代码已上传,有需要的朋友可在下载

要做一个积极勇敢乐观的追梦人,永远不说消极的话,

利用Hbase的coprocessor实现增量式Apriori算法

相关文章:

你感兴趣的文章:

标签云: