Как правильно оптимизировать Spark и Milvus для работы с большими данными?

У меня есть искровой фрейм данных из двух столбцов: идентификатор и вектор.

Столбец вектора представляет собой список чисел с плавающей запятой длиной 20 000 элементов.

Сам Dataframe имеет длину 2 500 000 строк.

Я использую соединитель Spark-Milvus для вставки данных, поскольку я пробовал различные способы форматирования небольших фрагментов данных и пытался вставить их в коллекцию Milvus, но безрезультатно.

Когда я создаю коллекцию в Milvus и пытаюсь вставить пакет из 200 000 строк из фрейма данных Spark, это занимает более 10 минут и иногда происходит сбой.

Загрузка коллекции Milvus из 200 000 записей занимает более 1 часа и никогда не заканчивается.

После вставки пакета присвоение индексов векторному столбцу занимает около 10 минут.

Интересно, существует ли общая практика работы с большими пакетами, позволяющая оптимизировать время обработки для вставки и индексации.

Какую настройку Spark и Milvus мне следует использовать для достижения максимально возможной производительности?

А как правильно преобразовать данные перед вставкой в ​​коллекцию Milvus? Должны ли данные быть представлены в виде массива numpy или в любом другом формате?

Случайная строка, собранная из моего фрейма данных Spark, будет выглядеть следующим образом: [1005, [0,01, ..., 0,78], где 1005 — это идентификатор, а список чисел с плавающей запятой — это вектор длиной 20 000.

Вот моя установка искры:

spark = SparkSession.builder \
    .master("local[*]") \
    .appName("collab_filter_test_on_local") \
    .config("spark.driver.extraClassPath", '/data/notebook_files/clickhouse-native-jdbc-shaded-2.6.5.jar') \
    .config("spark.jars", "/data/notebook_files/spark-milvus-1.0.0-SNAPSHOT.jar") \
    .config("spark.driver.memory", "16g") \
    .getOrCreate()

Вот моя установка Милвуса:

connections.connect(alias = "default", host = "localhost", port=19530)

fields = [
    FieldSchema(name='id', dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name='vec', dtype=DataType.FLOAT_VECTOR, dim=dim_size)
]

schema = CollectionSchema(fields, 'data')

data = Collection('data', schema)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я разработчик разъема Spark-milvus. Рад слышать, что вы его используете. Пожалуйста, создайте проблему на github, чтобы мы могли ответить вам как можно скорее.

По вашему вопросу:

Вектор 1, 20000 dim довольно велик, очевидно, что на всех этапах потребуется больше ресурсов. Пожалуйста, подумайте, необходимо ли это и можем ли мы уменьшить яркость

2. Вставьте 200 0000 строк за 10 минут ~ около 3 тыс./с. На самом деле это не так уж и плохо. Пожалуйста, загрузите сообщение об ошибке на github в случае сбоя.

3. Загрузка никогда не заканчивается, возможно, из-за исчерпания памяти. Пожалуйста, проверьте использование памяти узлами запросов.

wayblink 29.02.2024 12:37

4. Для вставки больших пакетов данных мы рекомендуем использовать Bulkinsert. Я думаю, вы можете использовать Spark для обработки данных, сохранять их в паркете, а затем использовать Bulkinsert для их вставки. Bulkinsert имеет лучшую производительность, чем вставка для больших данных.

wayblink 29.02.2024 12:39

рад встрече. Большое спасибо за ваше решение и ответ. Обязательно последую вашим советам. Подскажите, пожалуйста, как коннектор spark-milvus понимает, как правильно форматировать данные в фрейме данных Spark перед их вставкой в ​​коллекцию milvus?

Fitzpatrick 01.03.2024 13:17

Соединитель Spark-milvus создаст коллекцию, если она не существует. Схема генерируется в соответствии со схемой кадра данных Spark. Например, IntegerType, LongType в Spark преобразуются в тип int64 в Milvus. Однако не все функции коллекции Milvus могут поддерживаться таким образом. Таким образом, вы можете создать коллекцию с помощью SDK и использовать spark-milvus только для чтения и записи.

wayblink 01.03.2024 15:23

Другие вопросы по теме