За последние несколько десятилетий базы данных и анализ данных претерпели кардинальные изменения.

Предприятия предъявляют все более сложные требования к анализу и использованию данных, а также все более высокие стандарты производительности запросов.

Память стала недорогой, позволяя заменить набор стратегий производительности, поддерживаемых анализом in-memory.

Повысилась производительность CPU и GPU, но также и оптимизация обработки данных параллельно.

Появились новые виды баз данных для различных случаев использования, каждая из которых имеет свой способ хранения и индексирования данных. Например, из-за того, что реальные объекты легче представить в виде иерархических и вложенных структур данных, популярностью стали JSON и документальные базы данных.

Появились новые дисциплины, в том числе инжиниринг данных и наука о данных, с десятками новейших инструментов для реализации конкретных аналитических задач.

Представление столбчатых данных стало основным направлением в аналитической работе, поскольку оно дает значительные преимущества с точки зрения скорости и эффективности.

Учитывая эти тенденции, появилась прозрачная возможность для типичного представления данных в памяти, которую может использовать каждый движок; современная, использующая преимущества всех новых стратегий производительности, которые доступны в настоящее время; и создающая возможность обмена знаниями между платформами бесшовно и эффективно. часто это и есть цель Apache Arrow. Узнайте больше об истоках и истории Apache Arrow.

Чтобы использовать аналогию, подумайте о поездке в Европу в отпуск перед ЕС. чтобы поехать в 5 стран за 7 дней, вы подсчитаете сам факт, что вам просто приходилось проводить пару часов на границе для паспортного контроля, и вы теряли часть своих денег на обмене валюты. часто так работает работа с данными в памяти без Arrow: существует огромная неэффективность при сериализации и десериализации структур данных, а в процессе формируется копия, растрачивающая ресурсы памяти и процессора. Напротив, Arrow – это как поездка в Европу после ЕС и, следовательно, евро: вы не ждёте на границе, и везде используется одна валюта.

Стрелка сочетает в себе преимущества столбчатых структур данных с вычислениями в памяти. Она обеспечивает преимущества в производительности этих современных технологий, а также податливость сложных данных и динамических схем. И все это делается с открытым исходным кодом и стандартизированным способом.

Технологии ядра стрелок Apache

Apache Arrow сама по себе не является ядром хранения или исполнения. она предназначена для функционирования общей основы для последующих типов систем:

движки выполнения SQL (такие как Drill и Impala).

Системы анализа данных (такие как Pandas и Spark)

Потоковые и очередные системы (такие как Кафка и Шторм)

Системы хранения (например, паркет, куду, кассандра и HBase).

Стрелка состоит из различных подключенных технологий, предназначенных для интеграции в системы хранения и исполнения. Ключевые компоненты Arrow включают в себя:

Определенные наборы типов данных, включающие в себя как SQL, так и JSON типы, такие как Int, BigInt, Decimal, VarChar, Map, Struct и Array.

Канонические представления: Представление знаний в столбцах в памяти для поддержки произвольно сложной структуры записи, построенной поверх определенных типов данных.

Общие структуры данных: Сопутствующие структуры данных со стрелками, включая списки пикировок, хэш-таблицы и очереди.

Межпроцессное взаимодействие в пределах общей памяти, TCP/IP и RDMA.

Библиотеки данных для чтения и записи столбчатых данных на нескольких языках, включая Java, C++, Python, Ruby, Rust, Go и JavaScript.

Алгоритмы Pipeline и SIMD для различных операций, включая выбор растровой карты, хэширование, фильтрацию, ведро, сортировку и сопоставление.

Сжатие столбцов в памяти, включая набор методов для повышения эффективности работы с памятью.

Средства поддержания непрерывности памяти для кратковременной работы с энергонезависимой памятью, твердотельным или жестким диском.

Как таковые, Arrow не конкурирует ни с одним из этих проектов. Ее основная цель – в каждом из них обеспечить повышенную производительность и функциональную совместимость. На самом деле, Arrow создается ведущими разработчиками многих из этих проектов.

Производительность

Чем быстрее пользователь сможет добраться до решения, тем быстрее он будет задавать другие вопросы. Высокая производительность приводит к большему количеству анализов, большему количеству случаев использования и дальнейшим инновациям. По мере того, как процессоры становятся быстрее и сложнее, одной из ключевых проблем является обеспечение эффективного использования процессоров в технологии обработки данных.

Стрелка разработана специально для максимизации:

Местоположение кэша: Буферы памяти представляют собой компактное представление знаний, разработанных для современных ЦПУ. Структуры определяются линейно, в соответствии с типичными шаблонами чтения. Это означает, что данные сопоставимого типа размещаются в памяти. Это упрощает предварительную выборку кэша, минимизируя простои процессора, связанные с пропуском кэша и доступом к основной памяти. Эти эффективно работающие с ЦПУ структуры данных и модели доступа достигают как традиционных плоских реляционных структур, так и современных сложных структур данных.

Трубопровод: Модели исполнения разработаны с учетом преимуществ суперскалярной и конвейерной природы современных процессоров. Часто это достигается за счет минимизации количества инструкций в цикле и сложности цикла. Эти узкие петли приводят к повышению производительности и меньшему количеству сбоев в предсказании ветвей.

Инструкции SIMD: Инструкции Single Instruction Multiple Data (SIMD) позволяют алгоритмам исполнения работать более эффективно, выполняя несколько операций в течение одного тактового цикла. Стрелка организует данные для подсоединения к операциям SIMD.

Локализация кэша, конвейерные и суперскалярные операции часто обеспечивают в 10-100 раз более высокую скорость выполнения. Поскольку многие аналитические задачи привязаны к центральному процессору, эти преимущества позволяют конечным пользователям значительно повысить производительность. Приведем несколько примеров:

PySpark: IBM измерила 53-кратное ускорение обработки данных Python и Spark после добавления поддержки Arrow в PySpark.

Паркет и С++: Считывание данных в паркет с С++ со скоростью до 4 Гб/с.

Панды: Чтение в панды до 10 ГБ/с.

Стрелка также способствует обмену данными с нулевой копией. Поскольку Arrow принимается потому, что представление в каждой системе, одна система может передавать данные для потребления противоположной системе. И когда эти системы расположены на эквивалентном узле, описанной выше копии также можно избежать за счет использования общей памяти. Это говорит о том, что во многих случаях перемещение данных между двумя системами не приведет к каким-либо накладным расходам.

Эффективность использования памяти

Производительность памяти велика, но памяти часто не хватает. Стрелка предназначена для фигуры, хотя информация не помещается полностью в память. Ядро аранжировки включает в себя векторы знаний и коллекции этих векторов (также называемые пластинчатыми партиями). Партии записей обычно составляют 64KB-1MB, в расчете на нагрузку, и обычно ограничиваются 2^16 записями. Это не только улучшает локализацию кэша, но и делает вычисления в памяти возможными даже в ситуациях с низкой памятью.

При наличии большого количества кластеров Больших Данных, начиная от 100 до 1000 серверов, системы должны быть готовы к обналичиванию смешанной памяти кластера. Стрелка предназначена для ослабления значения перемещения данных по сети. Она использует рассеяние/сбор чтения и записи и имеет конструкцию нулевой сериализации/десериализации, позволяющую дешево перемещать данные между узлами. Стрелка также работает непосредственно с RDMA-совместимыми соединениями для обеспечения одной сетки памяти для больших рабочих нагрузок внутри памяти.

Поддержка языка программирования

Еще одним важным преимуществом использования Apache Arrow, помимо более высокой производительности и функциональной совместимости, может стать равномерная работа между различными языками программирования. Традиционный обмен данными основан на интеграции на уровне IPC и API. Хотя это часто бывает просто, это снижает производительность, когда язык пользователя отличается от языка базовой системы. Рассчитывая на язык и, следовательно, на реализованный набор алгоритмов, преобразование языка вызывает большую часть временного интервала.