А. В. Миняйлов
ПАРАЛЛЕЛЬНЫЕ ВЫЧИСЛЕНИЯ В SAP HANA
Алексей Владимирович Миняйлов
Сертифицированный консультант SAP HANA, БДО Юникон Бизнес Солюшнс.
Закончил МГУ имени М.В. Ломоносова по специальности «Прикладная математика и информатика».
Принимал участие в проектах по SAP HANA, SAP Business Objects, SAP BW.
А.В. Миняйлов. Параллельные вычисления в SAP HANA
73
ВВЕДЕНИЕ
За последний десяток лет значительно повысилась производительность процессоров: увеличилась тактовая частота, количество ядер на один процессор. Только на одном современном сервере может быть установлено от 16 до 64 многоядерных процессоров, от 2 до 12 ядер в каждом. Использование многоядерной архитектуры вместе с возможностями параллельных вычислений позволяет решать задачи, недоступные еще десять лет назад.
ПАРАЛЛЕЛЬНАЯ ОБРАБОТКА ДАННЫХ
Платформа SAP HANA позволяет реализовать возможности быстрой обработки данных за счет распараллеливания процессов и хранения данных в соответствии с технологией in-memory.
Традиционно данные в СУБД хранятся в построчном виде, то есть кортежи хранятся в памяти последовательно. Альтернативой такому подходу является хранение данных по столбцам, то есть значения каждого из столбцов в памяти будут идти друг за другом. Наглядно принцип хранения данных по столбцам представлен на рисунке 1.
Как показывают исследования [2], одной из наиболее частых операций с БД в корпоративной среде является чтение множеств данных. Технология in-memory позволяет хранить данные как по строкам, так и по столбцам. Хранение данных по столбцам в SAP HANA дает возможность выполнять подобные операции более эффективно, чем при построчном хранении.
Благодаря хранению данных в ОЗУ и кэше процессора время обращения к данным ускоряется на порядки по сравнению со временем доступа к жестким дискам (HDD) и твердотельным накопителям (SSD).
На рисунке 2 указано время обращения к носителю информации (жесткий диск, флэш-память, ОЗУ, кэш 3-го уровня, кэш 2-го уровня, кэш 1-го уровня) для двухъядерного процессора с тактовой частотой 2 Ghz.
col1 col2 col3
row1 A B C
rOW2 A B C
rOW3 A B C
rOW4 A B C
Таблица A (построчное хранение)
массив памяти
A B C A B C A B C A B C
. .. .. .. .
Строка Строка Строка Строка
Таблица B(хранение по столбцам)
B B B B C C C C
l M • M ■ l
Столбец Столбец Столбец
Рисунок 1. Способы хранения табличных данных
74
SAP HANA
Технологическая платформа для решения современных бизнес-задач
Процессор
ядро 1
кэш L1
кэш L2
ядро 2
кэш L1
кэш L2
кэш L3
Оперативная память Диск (HDD/SSD)
200x
14,3x
6,7x
1x
<—
0,5 нс
7.0 нс
15.0 нс
100 нс
SSD: 150K нс HDD: 10M нс
Рисунок 2. Сравнение скорости доступа
Из рисунка 2 видно, что обращение к ОЗУ быстрее, чем к жесткому диску, в 100 000 раз. При сравнении же оперативной памяти с памятью процессора видно, что наибольший выигрыш в отношении скорости доступа к данным показывает кэш 1-го уровня — он быстрее в 200 раз [4].
SAP HANA использует параллелизм в рамках комплекса блейд-серверов и в части ядер отдельного процессора. Поскольку SAP HANA предусматривает организацию оборудования в виде стойки блейд-серверов, система позволяет разделять данные по серверам в соответствии со схемами секционирования. Вторым аспектом является параллельная обработка данных в рамках одного сервера — многоядерный параллелизм с доступом к общей памяти. Главная цель подхода состоит в оптимизации доступа к общей памяти и максимальной локализации данных в кэше процессора. Большое количество ядер позволяет нагрузить каждое ядро «его собственными» процессами.
Возможность параллельно выполнять вычисления также обеспечивается за счет принципа SIMD (Single Instruction Multiple Data). Традиционно вычисления в процессоре выполняются в скалярном виде: одна инструкция возвращает один результат. Для SIMD-вычислений необходимы специальные инструкции процессора Intel SSE2/SSE3/ SSE4, которые позволяют за одну команду получить набор значений.
Скалярные вычисления
• Используются стандартные инструкции процессора
• Одна операция выдает один результат Векторные вычисления
• Используются инструкции Intel SSE2/SSE3/SSE4
• Одна операция выдает вектор значений
Стоит отметить, что SIMD-вычисления оптимально подходят для БД HANA. При организации данных по столбцам каждую колонку таблицы можно представить в виде массива. В памяти данные массива лежат последовательно, что позволяет SIMD-инструкциям вычислять сразу несколько значений за одну команду.
А.В. Миняйлов. Параллельные вычисления в SAP HANA
75
X 1 А X1 X2 X3 X4
1 1 1 | | 1 1
ОПЕРАНДЫ яШ оператор ОПЕРАНДЫ яШ оператор SSE2/SSE3/SSE4
1 1 \ 1 1
Y Y1 Y2 Y3 Y4
Ж N Ж Ж > S
XopY X1opY1 X2opY2 X3opY3 X4opY4
Рисунок 3. Сравнение методов вычислений в рамках одного процессора
ceCustomCppPop
12 columns processed
Execution Time: 0,633 ms
7* ~A
Рисунок 4. Схема вызова процедуры
76
SAP HANA
Технологическая платформа для решения современных бизнес-задач
Рассмотрим распараллеливание вычислений на примере вызова процедуры. Демонстрационная процедура принимает на вход две таблицы, две другие — возвращает.
На рисунке 4 представлена схема выполнения запроса. Как видно из схемы, при вызове процедуры HANA разделяет выборку данных на два потока, по одному на каждую таблицу. После завершения выборки результаты в отдельных потоках объединяются — с получением двух результирующих таблиц.
SAP HANA применяет параллелизм в алгоритмах, которые используются при выполнении запросов к базам данных. Рассмотрим несколько ключевых алгоритмов: scan, aggregation, join.
Scan. Данная функция проверяет логическое выражение над столбцом значений. Возвращает список позиций значений, которые совпали с логическим выражением. Распараллеливание процесса обеспечивается за счет разделения данных по потокам: каждый поток получает свою часть данных для сканирования. По завершении процесса результаты всех потоков объединяются в единый список.
Aggregation. Агрегирование данных реализуется с помощью хэш-таблиц. Для агрегации данных HANA использует локальные хэш-таблицы с последующим слиянием. Предположим, для выполнения задачи используется процессор с четырьмя потоками (threads). Первые два потока работают со своими локальными хэш-таблицами размером с кэш, куда они записывают промежуточные результаты агрегации. Остальные два потока отвечают за слияние данных из буферизованных хэш-таблиц. Весь процесс проходит в несколько этапов:
1. Поток получает на вход порцию строк исходной таблицы.
2. Происходит агрегация строк с записью в хэш-таблицу.
3. Переход на первый шаг. Как только величина хэш-таблицы достигает определенного порогового значения, например, 80% от максимально возможного размера, то есть размера кэша, данные перемещаются в буфер общей памяти, и поток инициирует наполнение новой хэш-таблицы.
4. В момент, когда заполнение буфера достигает определенного размера, первые два потока временно останавливаются и уведомляют об этом два других потока, отвечающих за слияние буферизованных таблиц. Слияние производится с помощью секционирования по диапазонам (range partitioning). Каждый поток работает только со строками своего диапазона, что обеспечивает параллельное выполнение слияния данных.
5. Процесс повторяется до момента опустошения буфера и обработки всех строк исходной таблицы.
Таким образом, первые два потока в примере отвечают за агрегацию данных, два других — за слияние. Наглядно процесс продемонстрирован на схеме (рисунок 5).
Join. Так же как агрегация, операция объединения таблиц выполняется с помощью хэш-таблиц. Общий алгоритм следующий:
1. Выделяется часть потоков для наполнения локальных хэш-таблиц. Каждый поток одновременно получает порцию данных из исходной таблицы.
2. Как только локальные таблицы наполняются до определенного уровня, их содержимое переносится в буфер.
3. При попадании данных в буфер потоки, отвечающие за наполнение локальных таблиц, временно останавливаются. В этот момент свою работу начинает другая часть
А.В. Миняйлов. Параллельные вычисления в SAP HANA
77
Поток 1
Поток 1
I
локальная таблица 1
локальные хэш-таблицы
Поток 2
локальная таблица 2
Буфер
Поток 3
в
\ ✓
'лЛ-*
....■'■■■"A S1 ы
Поток 4
В
хэш-таблица 1 (секционированная часть)
хэш-таблица 2 (секционированная часть)
Рисунок 5. Параллельная агрегация данных
потоков, которые наполняют целевую таблицу строками, соответствующими исходному запросу.
4. Алгоритм выполняется циклично до опустошения буфера и полной обработки исходной таблицы.
ЗАКЛЮЧЕНИЕ
Таким образом, многоядерная архитектура вместе с технологией in-memory позволяют ускорять работу бизнес-приложений: результат — быстрый поиск и представление необходимой информации, сокращение времени подготовки отчетности. Используя возможности параллелизма, SAP HANA позволяет раскрыть потенциал многоядерной архитектуры.
78
SAP HANA
Технологическая платформа для решения современных бизнес-задач
ЛИТЕРАТУРА
1. Average Historic Price of RAM (2013) [Электронный документ]. http://www.statisticbrain.com/average-historic-price-of-ram/
2. Plattner H. A Common Database Approach for OLTP and OLAP Using an In-Memory Column Database // SIGMOD 2009. 1-2.
3. Plattner H., Zeier A. In-Memory Data Management. Springer, 2009.
4. SAP HANA — Real Time Computing. 2013. [Электронный документ]. http://ee380.stanford.edu/Abstracts/130522-slides.pdf