标签:hbase coprocessor apriori protobuf 数据挖掘
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。
package 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文件,再导入到项目中就可以编写服务器和客户端了。
部署过程和源代码已上传,有需要的朋友可在http://download.csdn.net/detail/xanxus46/8801857下载
利用Hbase的coprocessor实现增量式Apriori算法
标签:hbase coprocessor apriori protobuf 数据挖掘
原文地址:http://blog.csdn.net/xanxus46/article/details/46481265