Spark Bloom Filter 测试

什么是Bloom Filter?

Bloom Filter的原理可参考文章 Bloom Filter原理

由上述文章可知,创建一个Bloom Filter我们只需要定义两个参数:
(1)欲插入Bloom Filter中的元素数目 n
(2)Bloom Filter误判率: P(true)

Bloom Filter的实现

Bloom Filter已经由很多开源库,例如Google guava,Twitter Algebird,ScalaNLP’s Breeze,关于各种Bloom Filter的比较以及改进方法可参考文章 Bloom filter几种实现比较

spark在2.1.0版本也封装了基于DataFrame的Bloom Filter,使用起来相当方便。性能不再受制于第三方框架的吞吐量限制,依赖于spark的并行资源。可以减少架构设计的复杂度,提高可维护性。在流式计算应用中可以将Bloom Filter做成driver级别的全局变量,在batch结束更新。如果考虑容错,可以将Bloom Filter数据定期持久化到磁盘(hdfs/redis)

创建方式

// col为dataframe字段
// nm为放入bloom filter的数据量
// p为bloom filter的误判率
val bf:BloomFilter = df.stat.bloomFilter(col, nm, p)

在用有些场景布隆过滤器还需要合并,官方也提供了相应的API

mergeInPlace(BloomFilter other):BloomFilter

判定数据是否存在,官方一共提供了四个方法:

mightContain(Object obj),mightContainString(String string),mightContainLong(long long),mightContainBinary(byte[] byte)

将Bloom Filter序列化到磁盘或从磁盘加载Bloom Filter

writeTo(OutputStream out)
readFrom(InputStream in)

Bloom Filter的测试

下面将在构建,执行和准确率等方面对spark bloom filter进行测试

1. 完整代码

import org.apache.spark.rdd.RDD
import org.apache.spark.util.sketch._
import org.apache.spark.sql._object BloomFilterTest {def bloom_filter_create(spark:SparkSession):(BloomFilter,DataFrame) = {//构建bloom_filterval time_start = System.currentTimeMillis()val df = spark.sql("select browser_uniq_id from gdm.gdm_m14_glb_wireless_online_log where dt>='2021-05-01' and browser_uniq_id is not null")val nm = df.countprintln(nm)val bf:BloomFilter = df.stat.bloomFilter("browser_uniq_id", nm, 0.01)val time_end = System.currentTimeMillis()println(time_end - time_start)val tuple = (bf,df)tuple}def df_for_test(spark:SparkSession):DataFrame = {//构建测试数据dataframeval df2 = spark.sql("select browser_uniq_id from gdm.gdm_m14_glb_wireless_online_log where dt='2021-04-30'")println(df2.count)df2}def bloom_filter_test(df:DataFrame,bf:BloomFilter): RDD[Row] = {//查询bloom_filterval time_start2=System.currentTimeMillis()val result = df.rdd.map(x=>{if(bf.mightContainString(x.mkString(","))){x}else{Row()}})result.take(1)val time_end2=System.currentTimeMillis()println(time_end2-time_start2)result}def get_error_rate(spark:SparkSession,df1:DataFrame,df2:DataFrame,result:RDD[Row]):Double = {//计算误判率import spark.implicits._val df3 = df1.alias("df1").join(df2.alias("df2"),$"df1.browser_uniq_id"===$"df2.browser_uniq_id","inner")val bf_count = result.filter(x=>x!=Row()).countval df_count = df3.countval error_rate:Double = (bf_count-df_count)*1.0000/df_counterror_rate}def main(args: Array[String]): Unit = {val spark = SparkSession.builder.appName("bbb").master("local[2]").enableHiveSupport().getOrCreate()val bf_tuple = bloom_filter_create(spark)val bf = bf_tuple._1val df1 = bf_tuple._2.distinct()val df2 = df_for_test(spark)val result = bloom_filter_test(df2,bf)println(get_error_rate(spark,df1,df2,result))}
}

2. 测试结果

构建bloom filter数据量:202165350
构建bloom filter耗时:252.356s
测试总数据量:13700749
单条数据判断耗时:190ms
全部数据判断总耗时:6.47s
误判率:1.4222518579818676E-5

3. 结论

在2亿数据量下,构建bloom filter耗时252秒,在初始化bloom filter后可以通过put方法更新,因此在初始化的时候参数nm建议设置的偏大,以便在实际应用过程中追加数据

put(Object item)putString(String item);putLong(long item);putBinary(byte[] item);

通过测试数据可知,spark自带的bloom filter在2亿条基础数据,1千三百万测试数据下,误判率只有1.4222518579818676E-5,个人认为已经非常精准了

实际应用中,在可以接受一定误判的场景下,可以使用bloom filter提高计算效率,例如:

  1. 离线数据历史刷数/增量更新
  2. 实时数据过滤/排重

Spark Bloom Filter 测试相关推荐

  1. PostgreSQL 11 preview - bloom filter 误报率评估测试及如何降低误报 - 暨bloom filter应用于HEAP与INDEX的一致性检测...

    标签 PostgreSQL , bloom filter , 误报率 , amcheck 背景 bloom filter是一个空间压缩,概率数据结构,可以存储超容量的数据集,用于判断某个元素是否存在于 ...

  2. C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

    布隆过滤器是一种判定元素是否存在于集合中的方法.其基本原理是使用哈希方法将数据映射到一个很长的向量上.在维基百科上,它被称为"空间效率和查询时间都远远超过一般的算法"的方法.由于它 ...

  3. Bloom Filter:海量数据的HashSet

    Bloom Filter一般用于数据的去重计算,近似于HashSet的功能:但是不同于Bitmap(用于精确计算),其为一种估算的数据结构,存在误判(false positive)的情况. 1. 基本 ...

  4. Scrapy 爬虫去重效率优化之 Bloom Filter的算法的对接

    From:https://cloud.tencent.com/developer/article/1084962 Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤 ...

  5. 布隆过滤器(Bloom Filter)- 原理、实现和推导

    目录 算法背景 布隆过滤器–概念 布隆过滤器-原理 布隆过滤器-缺点 布隆过滤器-实现 布隆过滤器-应用 布隆过滤器-公式推导 算法背景 问题: 在开发中,经常要判断一个元素是否在一个集合中. 实现方 ...

  6. 【恋上数据结构】布隆过滤器(Bloom Filter)原理及实现

    布隆过滤器(Bloom Filter) 引出布隆过滤器(判断元素是否存在) 布隆过滤器介绍(概率型数据结构) 布隆过滤器的原理(二进制 + 哈希函数) 布隆过滤器的误判率(公式) 布隆过滤器的实现 布 ...

  7. 布隆过滤器速度_高并发系统一定要考虑的 Bloom Filter 布隆过滤器

    开篇思考 你能想到哪些方式判断一个元素是否存在集合中? 布隆过滤器并不存储数据本身,那么是怎么做到过滤的? 布隆过滤器实现?参数配置? 一般我们用来判断一个元素是否存在,会想到用 List,Map,S ...

  8. 利用bloom filter算法处理大规模数据过滤

    Bloom Filter是由Bloom在1970年提出的一种快速查找算法,通过多个hash算法来共同判断某个元素是否在某个集合内.可以用于网络爬虫的url重复过滤.垃圾邮件的过滤等等. 它相比hash ...

  9. 比 Bloom Filter 节省25%空间!Ribbon Filter 在 Lindorm中的应用

    1 前言 Lindorm是一个低成本高吞吐的多模数据库,目前,Lindorm是阿里内部数据体量最大,覆盖业务最广的数据库产品.超高的性能和低RT一直是Lindorm追求的目标,因此Lindorm也在不 ...

最新文章

  1. 使用Subversion进行版本控制 附录A
  2. 计算机中专专业是什么意思,计算机专业的中专与大专有什么不同?
  3. 如何在Windows的PHPstudy中使用redis数据库
  4. Gene Ontology (GO) 简介
  5. PyCharm安装配置Django,启动第一个Django项目Hello World
  6. 框架学习之Spring 前言
  7. 检测目标程序ELF bit是32还是64
  8. 学习libpcap库,写例子代码--tcp_config.txt
  9. 猫狗大战-caffe模型训练实例amp;NSDK识别运行
  10. 卢松松博客专访胡茬:解密程序员互联网创业历程
  11. 【Bash百宝箱】shell内建命令之builtin、command、caller
  12. SQL server如何自定义服务器名称登陆
  13. Thinkcmf QQ邮箱配置
  14. 【技术教程】RTSP视频流媒体智能分析平台EasyNVR中的H264及H265编码视频存储计算方法介绍
  15. IDEA创建的项目,包名重叠在一起,如何分开展示的问题?
  16. C++11 boost::spirit::qi简单的XML解析器示例
  17. 使用iconfont阿里巴巴矢量图标库(最方便的使用方法)
  18. opencv 学习笔记五 二维离散卷积
  19. IIS连接数、并发连接数、最大并发工作线程数、应用程序池的队列长度、应用程序池的最大工作进程数详解
  20. Google Play Store谷歌应用商店游戏数据分析

热门文章

  1. 对Vuejs框架“渐进式”的理解
  2. visualDL(一)scalar标量图
  3. Windows 剪切板的应用——复制浏览器or本地目录图片
  4. 单词迷阵游戏就是从一个10x10的字母矩阵中找出目标单词,查找方向可以从左往右、从右往左、从上往下或者从下往上。例如下面的迷阵中包含quot等单词。
  5. Win10系统Ping端口及利用telnet命令Ping 端口
  6. 实例10 等差数列求和
  7. 5G 网络架构(核心网)总结
  8. centos7 应用笔记: fslint 文件查重
  9. mysql dba工具_Github推荐:MySQL DBA不可错过的五大开源管理工具!
  10. 安装memsql与将数据库从 MySQL 移植到 MemSQL