Почему спарк-эскиз BloomFilter медленный и имеет высокий уровень ложных срабатываний - PullRequest
1 голос
/ 20 января 2020

Я использую искру (версия 2.3) с фильтром Блума эскиза

val tbl = spark.table(table)
  .where(whereCond)
  .select("request_id").cache()  // request_id is tring type

val numItems = tbl.count
val errRate = 0.01
val bfDF = tbl.stat.bloomFilter("request_id", numItems, errRate)

val bf = spark.sparkContext.broadcast(bfDF) 

myOtherDF.map{ data =>
  ....
  val exists = bf.value.mightContainString(data.req_id)
}

Число строк, которые будут вставлены в BF, составляет ~ 350 000 000

. получение слишком большого количества ложных срабатываний ~ 90% - так что оно на самом деле не работает должным образом. Производительность этого шага очень и очень медленная - ~ 1,5 минуты (только создание BloomFilter)

Известно ли это быть неправым с большими числами, и почему это так медленно?

1 Ответ

1 голос
/ 21 января 2020

Я не знаком с реализацией Spark Bloom Filters, поэтому не могу сказать вам, что вы делаете неправильно, но из того, что вы написали, и из ваших результатов кажется, что вы вставили больше элементов, чем фильтр, для которого был создан.

Это увеличит частоту заполнения, что объясняет ваш высокий уровень ошибок. Высокая скорость заполнения также означает, что для возврата ложного ответа фильтру требуется больше времени. При 50% заполнении фильтр в среднем проверяет 2 местоположения, а затем возвращает FALSE. Очевидно, что в вашем случае (90% errRate) большинство элементов требуют проверки всех 7 битов (errRate = 0.01), что может объяснить медленную работу.

...