Как мы храним большой социальный граф
План доклада
Графы везде
Графовое хранилище
Решаемые задачи
Аналитические задачи
Neo4J
Особенности Neo4J
BatchInserter
Индексирование
Memory mapped cache
Размеры объектов на диске
Настройки memory mapped cache
Object cache
Типы Object cache
Sparksee (в прошлом DEX)
Особенности Sparksee
Настройки Sparksee
Sparksee cache
Тестовый стенд
ПО и настройки Neo4J
ПО и настройки Sparksee
Время импорта данных (ч)
Время обработки графа (с)
Время обработки графа (с)
Выводы
Спасибо за внимание!

Как мы храним большой социальный граф

1. Как мы храним большой социальный граф

Бартенев Максим
Норси-Транс

2. План доклада

• Что мы решали с помощью графовых
БД
• Графовые БД Neo4J и Sparksee
• Настройка и оптимизация Neo4J и
Sparksee
• Каких результатов удалось достичь

3. Графы везде

Применяются во многих сферах:
• веб-ссылки;
• маршруты;
• социальные сети;
• и т.д.
Имеют очень большой объем.
Сложность в анализе графа, а не в хранении.

4. Графовое хранилище

5. Решаемые задачи

• Загрузка графа
• Выполнение аналитической операции
• Догрузка новых данных, в случае их
появления

6. Аналитические задачи

• Получить всех соседей вершины (Neighbors)
• Выполнить обход графа (BFS)
• Найти кратчайший путь (Shortest path)

7. Neo4J

Наиболее распространенная
Развитое сообщество
Высокая функциональность
Может быть как серверным
приложением, так и встраиваемым
• Есть бесплатная версия

8. Особенности Neo4J

• Все операции только внутри
транзакции – правильно и надежно,
но медленно и ест много оперативной
памяти.
• Объекты – вершины, ребра и
атрибуты. Доступ к ним только по
внутреннему идентификатору.

9. BatchInserter

• Быстрый импорт
• НЕ отказоустойчивый
• НЕ потокобезопасный

10. Индексирование

• Новый метод schema.indexFor() – только
по атрибутам на вершинах
• Устаревший метод graphDb.index() – и
по вершинам и по ребрам
• Индексация в режиме Batch inserter
BatchInserterIndexProvider.nodeIndex()

11. Memory mapped cache

• Служит для ускорения I/O
• Проецирует файлы хранилища в
память
• Каждому файлу свой кэш

12. Размеры объектов на диске

Вершина
Ребро
Атрибут
15 B
34 B
41 B
Строка
128 B
Массив
128 B
Cache size = размер объекта * количество
объектов

13. Настройки memory mapped cache

• use_memory_mapped_buffers
• mapped_memory




nodestore.db.mapped_memory
relationshipstore.db.mapped_memory
propertystore.db.mapped_memory
и т.д.

14. Object cache

• Хранит в себе объекты для быстрого
доступа при обходах графа
• Вытеснение объектов осуществляет
GC
• Реально производительный кэш есть
только в Enterprice версии

15. Типы Object cache

none
soft
weak
кэш отсутствует
стандартное значение в бесплатной версии
больше данных при меньшем времени их
жизни
strong хранит в себе все объекты графа
hpc
специальный высокопроизводительный кэш

16. Sparksee (в прошлом DEX)

• Заявлена высокая
производительность
• Только встраиваемая
• Не столь распространенная
• Сообщество очень маленькое
• Полностью закрытая

17. Особенности Sparksee

• Обязательно задается схема данных
• Доступ к объекту только по
внутреннему идентификатору

18. Настройки Sparksee

• Настройки ребер:
– Ориентированные
– Индексированные
• Типы атрибутов:
– Обычный
– Индексированный
– Уникальный

19. Sparksee cache

• Настройки кэширования
минимальны
• Все новые объекты попадают в кэш
• SetCacheMaxSize(int megabytes)
– Если megabytes == 0, то используется
вся свободная память минус 512mb.

20. Тестовый стенд

• Intel Xeon E7540 2.0 GHz
• 64GB DDR3
• 2x2TB hard drive

21. ПО и настройки Neo4J


Neo4J 2.1.5 Community Edition
Ubuntu 14.04 LTS
JVM: -d64 –Xmx40G -XX:+UseParallelGC
Batch insertion mode
Use_memory_mapped_buffers
Cache vertices 2GB, relationships 18GB

22. ПО и настройки Sparksee


Sparksee 5.1.0 Unlimited licence
Windows Server 2008 x64
.NET API
Cache size 60GB

23. Время импорта данных (ч)

30,00
Больше суток.
Слишком долго!
25,00
20,00
14,10
15,00
Sparksee
10,00
5,00
Neo4J
6,40
0,50 1,30
0,00
100 млн
500 млн
1 млрд

24. Время обработки графа (с)

250
210
200
150
130
Neo4J
100
Sparksee
51
50
33
0,8
0
BFS
Shortest path
2
Neighbors
~10 миллионов вершин и ~100 миллионов ребер

25. Время обработки графа (с)

4000
3500
3000
2500
2000
1500
1000
500
0
3650
Neo4J
Sparksee
720
BFS
570
240
Shortest path
12
3
Neighbors
~50 миллионов вершин и ~500 миллионов ребер

26. Выводы

• Sparksee производительнее Neo4J
• Высокая производительность
графовых БД ограничивается
размером памяти
• Графы размером больше 1 млрд
вершин не получится обработать

27. Спасибо за внимание!

English     Русский Правила