У меня есть искровой фрейм данных из двух столбцов: идентификатор и вектор.
Столбец вектора представляет собой список чисел с плавающей запятой длиной 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)
Я разработчик разъема Spark-milvus. Рад слышать, что вы его используете. Пожалуйста, создайте проблему на github, чтобы мы могли ответить вам как можно скорее.
По вашему вопросу:
Вектор 1, 20000 dim довольно велик, очевидно, что на всех этапах потребуется больше ресурсов. Пожалуйста, подумайте, необходимо ли это и можем ли мы уменьшить яркость
2. Вставьте 200 0000 строк за 10 минут ~ около 3 тыс./с. На самом деле это не так уж и плохо. Пожалуйста, загрузите сообщение об ошибке на github в случае сбоя.
4. Для вставки больших пакетов данных мы рекомендуем использовать Bulkinsert. Я думаю, вы можете использовать Spark для обработки данных, сохранять их в паркете, а затем использовать Bulkinsert для их вставки. Bulkinsert имеет лучшую производительность, чем вставка для больших данных.
рад встрече. Большое спасибо за ваше решение и ответ. Обязательно последую вашим советам. Подскажите, пожалуйста, как коннектор spark-milvus понимает, как правильно форматировать данные в фрейме данных Spark перед их вставкой в коллекцию milvus?
Соединитель Spark-milvus создаст коллекцию, если она не существует. Схема генерируется в соответствии со схемой кадра данных Spark. Например, IntegerType, LongType в Spark преобразуются в тип int64 в Milvus. Однако не все функции коллекции Milvus могут поддерживаться таким образом. Таким образом, вы можете создать коллекцию с помощью SDK и использовать spark-milvus только для чтения и записи.
3. Загрузка никогда не заканчивается, возможно, из-за исчерпания памяти. Пожалуйста, проверьте использование памяти узлами запросов.