Advertisement

More Related Content

Slideshows for you(20)

Advertisement

Recently uploaded(20)

Advertisement

Bloomfilter

  1. 아주 심플한 블룸필터의 원리 강대명 (CHARSYAM@NAVER.COM)
  2. 블룸필터가 뭔가요? 있다고 하면 없을 수 있지만(False Positive), 없다고 하면 정말 없는 자료구조(No False Negative)
  3. 실화입니까? 있다고 해도 실제로 없을 수 있다면, 매번 있는지 확인해 야 할 것 같은데, 이런 걸 어디에 써야 하나요? HashMap 등은 contains에 있으면 반드시 있으니, 믿 고 쓸 수 있는데 말입니다.
  4. 블룸필터를 쓰고 있는 것들? Cassandra Hbase Oracle(Bloom pruning of partitions for queries) Quora, FaceBook
  5. 실화입니까?(2) 이런 제품들이나 회사들이 블룸필터를 쓰는 이유는 무엇 일까요?
  6. DISK와 메모리의 속도비교  L1 cache reference 0.5 ns  Branch mispredict 5 ns  L2 cache reference 7 ns 14x L1 cache  Mutex lock/unlock 25 ns  Main memory reference 100 ns 20x L2 cache, 200x L1 cache  Compress 1K bytes with Zippy 3,000 ns 3 us  Send 1K bytes over 1 Gbps network 10,000 ns 10 us  Read 4K randomly from SSD* 150,000 ns 150 us ~1GB/sec SSD  Read 1 MB sequentially from memory 250,000 ns 250 us  Round trip within same datacenter 500,000 ns 500 us  Read 1 MB sequentially from SSD* 1,000,000 ns 1,000 us 1 ms ~1GB/sec SSD, 4X memory  Disk seek 10,000,000 ns 10,000 us 10 ms 20x datacenter roundtrip  Read 1 MB sequentially from disk 20,000,000 ns 20,000 us 20 ms 80x memory, 20X SSD  Send packet CA->Netherlands->CA 150,000,000 ns 150,000 us 150 ms
  7. 메인메모리와 디스크 디스크 접근은 메모리보다 겨우 10,000배 느립니다. MEM 속도 = 디스크 * 10,000 SSD는 1,500 배 느림. MEM 속도 = SSD * 1,500 결론 디스크 접근을 줄이자.
  8. 블룸필터의 필요성 실제 데이터가 있는지 정확히 알려면? 메모리가 데이터 사이즈 만큼 필요함. 데이터량이 굉장히 많다면? 블룸필터를 이용하면 메모리 사용량을 줄이면서 비슷한 효과 를 낼 수 있음.
  9. 블룸필터의 필요성 블 룸 필 터 SSD/HDD Query Query Query Query exist exist exist not exist Query Query not exist not exist exist exist not exist 실제 3번의 쿼리를 할 필요가 없음.
  10. How 블룸필터 works? 블룸필터는 bitarray 입니다. n개의 hash를 선택합니다.(crc, murmur, md5등) 보통 3개 hash(key, 0) 은 crc hash를 의미 hash(key, 1) 은 murmur hash를 의미 hash(key, 2) 은 md5 hash를 의미
  11. 블룸필터 #1  bitarray의 크기는 16  hash(“charsyam”, 0) % 16 = 3  hash(“charsyam”, 1) % 16 = 5  hash(“charsyam”, 2) % 16 = 11 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 add(“charsyam”)
  12. 블룸필터 #2  bitarray의 크기는 16  hash(“bloomfilter”, 0) % 16 = 0  hash(“bloomfilter”, 1) % 16 = 1  hash(“bloomfilter”, 2) % 16 = 15 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 1 add(“bloomfilter”)
  13. 블룸필터 #3  bitarray의 크기는 16  hash(“clark”, 0) % 16 = 1  hash(“clark”, 1) % 16 = 2  hash(“clark”, 2) % 16 = 14 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 add(“clark”)
  14. 블룸필터 #4  exists 동작, 3개의 비트가 1로 채워져 있으면 존재한다고 알림.  hash(“charsyam”, 0) % 16 = 3  hash(“charsyam”, 1) % 16 = 5  hash(“charsyam”, 2) % 16 = 11 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 exists(“charsyam”)
  15. 블룸필터 #5  exists, False Positive, fake는 추가하지 않았지만 모든 bit가 1임  hash(“fake”, 0) % 16 = 0  hash(“fake”, 1) % 16 = 3  hash(“fake”, 2) % 16 = 15 1 1 1 1 0 1 0 0 0 0 0 1 0 0 1 1 exists(“fake”)
  16. 블룸필터의 한계 #1 데이터의 삭제가 불가능하다. Hbase, Cassandra 지워지는 케이스는 없고 Compaction시에 재생성
  17. 블룸필터의 한계 #2 false positive 가 발생하는 비율을 적절히 조절해야 한다.
  18. False Positive #1 False Positive는 당연히 발생하게 됨. k: 해시 함수 개수 m: bitarray의 크기 n: 전체 원소의 개수 당연히 m이 크고 n이 적을 수록 False Positive가 적음 그럼 k는?
  19. False Positive #2 가장 적은 False Positive를 가지는 경우
  20. False Positive #3 한번의 hash 연산으로 나온 Bit를 1로 설정 한번의 hash 연산으로 BitArray V의 어떤 값이 설정될 확률 = 1/m 반대로 어떤 값이 설정 안될 확률은 (1 – 1/m)
  21. False Positive #4 k 개의 해시 함수를 이용할 경우에 설정되지 않을 확률은 n 개의 원소가 들어가게 되면 다시 이 확률은
  22. False Positive #5 이제 다시 n개의 원소가 있을 때 특정 Bit가 1로 셋팅되어 있을 확률은 1 에서 해당 값을 빼면 됨.
  23. False Positive #6 k 개의 해시 함수가 실행되는 것과 위의 1로 설정될 확률이 독립 사건이므로…(이 부분이 이해가 안가요!!! ㅋㅋㅋ) 각각의 해시 함수가 실행될 때 마다 이 확률이라서…
  24. False Positive #7  다시 m 이 무한으로 수렴한다고 하면 그 값이 아래와 같이 되므 로…
  25. False Positive #8 즉 False Postivie가 발생할 확률은 아래의 식이 도출됨 (뭐지 이건 또 T.T)
  26. False Positive #9 다시, 가장 적은 False Positive를 가지는 경우
  27. False Positive #10 다시, 가장 적은 False Positive를 가지는 경우 k를 유지할 경우에 m, n의 변화에 따른 False Postivie 확률 p의 변화
  28. Scalable BloomFilter #1 블룸필터를 확장 가능하게 만들 수 있을까?  즉, 처음에 원소가 적을 때는 m을 작게 잡고, 윈소가 늘어나면 m을 크게 만들면 좋지 않을까? 0 0 0 1 최초 1 1 1 1 0 1 0 0 확장
  29. Scalable BloomFilter #2 기존 블룸필터의 확장은 불가능  배열의 크기가 커지면 해시에 대한 modular도 달라지면서 기 존 값들의 의미가 전부 사라짐. 그러면 새로 만들어야 함.
  30. Scalable BloomFilter #3  새로운 블룸필터를 만들어서, 함께 유지한다. 0 0 0 1 0 0 0 1 1 1 1 1 0 10 0 0 0 1 1 1 1 1 0 1 0 0 0 1 1 1 1 1 0 1 0 0 0 1 2
  31. Scalable BloomFilter #4  Add 동작 입력 key가 기존 블룸필터들에 존재하는 지 확인 있으면, 리턴! 없으면, 여유 공간이 있는지 보고, 새로운 블룸필터 체인을 만들 어야 하는지 확인 맨 마지막 블룸필터에 삽입한다.
  32. Scalable BloomFilter #5  check 동작 모든 블룸필터 체인에서 검색을 해서 없어야만 없다고 알려준다.
  33. Scalable BloomFilter #6  확장시에 새 블룸필터의 사이즈는 더 늘어날 수 있다. 이에 따라 에러율도 바뀌어야 한다. ERROR_TIGHTENING_RATIO 라는 개념이 적용되는데, 이건 패스…
  34. Reference  꼭 참고하세요.  https://en.wikipedia.org/wiki/Bloom_filter  http://d2.naver.com/helloworld/749531  http://gsd.di.uminho.pt/members/cbm/ps/dbloom.pdf  https://github.com/RedisLabsModules/rebloom  https://github.com/jaybaird/python-bloomfilter/
  35. Thank you.
Advertisement