Как мы храним 
большой социальный 
граф 
Бартенев Максим 
Норси-Транс
План доклада 
• Что мы решали с помощью графовых 
БД 
• Графовые БД Neo4J и Sparksee 
• Настройка и оптимизация Neo4J и 
Sparksee 
• Каких результатов удалось достичь
Графы везде 
Применяются во многих сферах: 
• веб-ссылки; 
• маршруты; 
• социальные сети; 
• и т.д. 
Имеют очень большой объем. 
Сложность в анализе графа, а не в хранении.
Графовое хранилище
Решаемые задачи 
• Загрузка графа 
• Выполнение аналитической операции 
• Догрузка новых данных, в случае их 
появления
Аналитические задачи 
• Получить всех соседей вершины (Neighbors) 
• Выполнить обход графа (BFS) 
• Найти кратчайший путь (Shortest path)
Neo4J 
• Наиболее распространенная 
• Развитое сообщество 
• Высокая функциональность 
• Может быть как серверным 
приложением, так и встраиваемым 
• Есть бесплатная версия
Особенности Neo4J 
• Все операции только внутри 
транзакции – правильно и надежно, 
но медленно и ест много 
оперативной памяти. 
• Объекты – вершины, ребра и 
атрибуты. Доступ к ним только по 
внутреннему идентификатору.
BatchInserter 
• Быстрый импорт 
• НЕ отказоустойчивый 
• НЕ потокобезопасный
Индексирование 
• Новый метод schema.indexFor() – 
только по атрибутам на вершинах 
• Устаревший метод graphDb.index() – и 
по вершинам и по ребрам 
• Индексация в режиме Batch inserter 
BatchInserterIndexProvider.nodeIndex()
Memory mapped cache 
• Служит для ускорения I/O 
• Проецирует файлы хранилища в 
память 
• Каждому файлу свой кэш
Размеры объектов на диске 
Вершина 15 B 
Ребро 34 B 
Атрибут 41 B 
Строка 128 B 
Массив 128 B 
Cache size = размер объекта * количество 
объектов
Настройки memory mapped 
cache 
• use_memory_mapped_buffers 
• mapped_memory 
– nodestore.db.mapped_memory 
– relationshipstore.db.mapped_memory 
– propertystore.db.mapped_memory 
– и т.д.
Object cache 
• Хранит в себе объекты для быстрого 
доступа при обходах графа 
• Вытеснение объектов осуществляет 
GC 
• Реально производительный кэш есть 
только в Enterprice версии
Типы Object cache 
none кэш отсутствует 
soft стандартное значение в бесплатной версии 
weak больше данных при меньшем времени их 
жизни 
strong хранит в себе все объекты графа 
hpc специальный высокопроизводительный кэш
Sparksee (в прошлом DEX) 
• Заявлена высокая 
производительность 
• Только встраиваемая 
• Не столь распространенная 
• Сообщество очень маленькое 
• Полностью закрытая 
• Бесплатна для исследований
Особенности Sparksee 
• Обязательно задается схема данных 
• Доступ к объекту только по 
внутреннему идентификатору
Настройки Sparksee 
• Настройки ребер: 
– Ориентированные 
– Индексированные 
• Типы атрибутов: 
– Обычный 
– Индексированный 
– Уникальный
Sparksee cache 
• Настройки кэширования минимальны 
• Все новые объекты попадают в кэш 
• SetCacheMaxSize(int megabytes) 
– Если megabytes == 0, то используется 
вся свободная память минус 512mb.
Тестовый стенд 
• Intel Xeon E7540 2.0 GHz 
• 64GB DDR3 
• 2x2TB hard drive
ПО и настройки 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
ПО и настройки Sparksee 
• Sparksee 5.1.0 Unlimited licence 
• Windows Server 2008 x64 
• .NET API 
• Cache size 60GB
Время импорта данных (ч) 
0.50 
14.10 
1.30 
6.40 
30.00 
25.00 
20.00 
15.00 
10.00 
5.00 
0.00 
100 млн 500 млн 1 млрд 
Neo4J 
Sparksee 
Больше суток. 
Слишком долго!
Время обработки графа (с) 
210 
51 
0,8 
130 
33 
2 
250 
200 
150 
100 
50 
0 
BFS Shortest path Neighbors 
Neo4J 
Sparksee 
~10 миллионов вершин и ~100 миллионов ребер
Время обработки графа (с) 
3650 
570 
12 
720 
240 
3 
4000 
3500 
3000 
2500 
2000 
1500 
1000 
500 
0 
BFS Shortest path Neighbors 
Neo4J 
Sparksee 
~50 миллионов вершин и ~500 миллионов ребер
Выводы 
• Sparksee производительнее Neo4J 
• Высокая производительность 
графовых БД ограничивается 
размером памяти 
• Графы размером больше 1 млрд 
вершин не получится обработать
Спасибо 
за 
внимание!

Как мы храним и анализируем большой социальный граф, Максим Бартенев (Норси-транс)

  • 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.
    Время импорта данных(ч) 0.50 14.10 1.30 6.40 30.00 25.00 20.00 15.00 10.00 5.00 0.00 100 млн 500 млн 1 млрд Neo4J Sparksee Больше суток. Слишком долго!
  • 24.
    Время обработки графа(с) 210 51 0,8 130 33 2 250 200 150 100 50 0 BFS Shortest path Neighbors Neo4J Sparksee ~10 миллионов вершин и ~100 миллионов ребер
  • 25.
    Время обработки графа(с) 3650 570 12 720 240 3 4000 3500 3000 2500 2000 1500 1000 500 0 BFS Shortest path Neighbors Neo4J Sparksee ~50 миллионов вершин и ~500 миллионов ребер
  • 26.
    Выводы • Sparkseeпроизводительнее Neo4J • Высокая производительность графовых БД ограничивается размером памяти • Графы размером больше 1 млрд вершин не получится обработать
  • 27.