Milvus поддерживает импорт файлов Apache Parquet для повышения эффективности обработки данных
Milvus, высокомасштабируемая векторная база данных, известная своей способностью обрабатывать огромные массивы данных, делает значительный шаг вперед, представляя поддержку файлов Parquet в версии 2.3.4. Благодаря поддержке Apache Parquet пользователи смогут оптимизировать процессы импорта данных и получить значительную экономию средств на хранение и вычисления.
В нашей последней заметке мы рассказываем о преимуществах Parquet и о том, какие выгоды он дает пользователям Milvus. Мы обсуждаем мотивы интеграции этой функции и предоставляем пошаговое руководство по беспрепятственному импорту файлов Parquet в Milvus, открывая новые возможности для эффективного управления данными и их анализа.
Что такое Apache Parquet?
Apache Parquet - это популярный формат файлов данных с открытым исходным кодом, ориентированный на столбцы и предназначенный для повышения эффективности хранения и обработки больших массивов данных. В отличие от традиционных форматов данных, ориентированных на строки, таких как CSV или JSON, Parquet хранит данные по столбцам, предлагая более эффективные схемы сжатия и кодирования данных. Такой подход позволяет повысить производительность, снизить требования к хранению и увеличить вычислительную мощность, что делает его идеальным для работы со сложными массивами данных.
Как пользователи Milvus получают преимущества от поддержки импорта файлов Parquet
Milvus расширяет поддержку импорта файлов Parquet, предоставляя пользователям оптимизированный опыт и различные преимущества, включая снижение затрат на хранение и вычисления, оптимизацию управления данными и упрощение процесса импорта.
Оптимизация эффективности хранения и оптимизация управления данными
Parquet предоставляет гибкие возможности сжатия и эффективные схемы кодирования для различных типов данных, обеспечивая оптимальную эффективность хранения. Такая гибкость особенно ценна в облачных средах, где каждая унция экономии на хранении напрямую связана с ощутимым снижением затрат. Благодаря этой новой функции в Milvus пользователи могут без труда объединить все свои разнообразные данные в один файл, упростив управление данными и повысив общий уровень удобства работы. Эта функция особенно полезна для пользователей, работающих с типами данных Array переменной длины, которые теперь могут наслаждаться упрощенным процессом импорта данных.
Улучшенная производительность запросов
Столбцовая структура хранения данных Parquet и передовые методы сжатия значительно повышают производительность запросов. При выполнении запросов пользователи могут сосредоточиться исключительно на нужных данных, не сканируя нерелевантные данные. Такое выборочное чтение столбцов минимизирует нагрузку на процессор, что приводит к ускорению выполнения запросов.
Широкая языковая совместимость
Parquet доступен на многих языках, таких как Java, C++ и Python, и совместим с большим количеством инструментов обработки данных. Благодаря поддержке файлов Parquet пользователи Milvus, использующие различные SDK, могут легко генерировать файлы Parquet для разбора в базе данных.
Как импортировать файлы Parquet в Milvus
Если ваши данные уже представлены в формате файлов Parquet, импортировать их очень просто. Загрузите файл Parquet в систему хранения объектов, например MinIO, и вы готовы к импорту.
Приведенный ниже фрагмент кода является примером импорта файлов Parquet в Milvus.
remote_files = []
try:
print("Prepare upload files")
minio_client = Minio(endpoint=MINIO_ADDRESS, access_key=MINIO_ACCESS_KEY, secret_key=MINIO_SECRET_KEY,
secure=False)
found = minio_client.bucket_exists(bucket_name)
if not found:
minio_client.make_bucket(bucket_name)
print("MinIO bucket '{}' doesn't exist".format(bucket_name))
return False, []
# set your remote data path
remote_data_path = "milvus_bulkinsert"
def upload_file(f: str):
file_name = os.path.basename(f)
minio_file_path = os.path.join(remote_data_path, "parquet", file_name)
minio_client.fput_object(bucket_name, minio_file_path, f)
print("Upload file '{}' to '{}'".format(f, minio_file_path))
remote_files.append(minio_file_path)
upload_file(data_file)
except S3Error as e:
print("Failed to connect MinIO server {}, error: {}".format(MINIO_ADDRESS, e))
return False, []
print("Successfully upload files: {}".format(remote_files))
return True, remote_files
Если ваши данные не являются файлами Parquet или имеют динамические поля, вы можете воспользоваться BulkWriter, нашим инструментом преобразования форматов данных, чтобы помочь вам создать файлы Parquet. BulkWriter теперь использует Parquet в качестве формата выходных данных по умолчанию, обеспечивая более интуитивный опыт для разработчиков.
Приведенный ниже фрагмент кода - это пример использования BulkWriter для создания файлов Parquet.
import numpy as np
import json
from pymilvus import (
RemoteBulkWriter,
BulkFileType,
)
remote_writer = RemoteBulkWriter(
schema=your_collection_schema,
remote_path="your_remote_data_path",
connect_param=RemoteBulkWriter.ConnectParam(
endpoint=YOUR_MINIO_ADDRESS,
access_key=YOUR_MINIO_ACCESS_KEY,
secret_key=YOUR_MINIO_SECRET_KEY,
bucket_name="a-bucket",
),
file_type=BulkFileType.PARQUET,
)
# append your data
batch_count = 10000
for i in range(batch_count):
row = {
"id": i,
"bool": True if i % 5 == 0 else False,
"int8": i % 128,
"int16": i % 1000,
"int32": i % 100000,
"int64": i,
"float": i / 3,
"double": i / 7,
"varchar": f"varchar_{i}",
"json": {"dummy": i, "ok": f"name_{i}"},
"vector": gen_binary_vector() if bin_vec else gen_float_vector(),
f"dynamic_{i}": i,
}
remote_writer.append_row(row)
# append rows by numpy type
for i in range(batch_count):
remote_writer.append_row({
"id": np.int64(i + batch_count),
"bool": True if i % 3 == 0 else False,
"int8": np.int8(i % 128),
"int16": np.int16(i % 1000),
"int32": np.int32(i % 100000),
"int64": np.int64(i),
"float": np.float32(i / 3),
"double": np.float64(i / 7),
"varchar": f"varchar_{i}",
"json": json.dumps({"dummy": i, "ok": f"name_{i}"}),
"vector": gen_binary_vector() if bin_vec else gen_float_vector(),
f"dynamic_{i}": i,
})
print(f"{remote_writer.total_row_count} rows appends")
print(f"{remote_writer.buffer_row_count} rows in buffer not flushed")
print("Generate data files...")
remote_writer.commit()
print(f"Data files have been uploaded: {remote_writer.batch_files}")
remote_files = remote_writer.batch_files
Затем вы можете начать импортировать файлы Parquet в Milvus.
remote_files = [remote_file_path]
task_id = utility.do_bulk_insert(collection_name=collection_name,
files=remote_files)
task_ids = [task_id]
states = wait_tasks_to_state(task_ids, BulkInsertState.ImportCompleted)
complete_count = 0
for state in states:
if state.state == BulkInsertState.ImportCompleted:
complete_count = complete_count + 1
Теперь ваши данные легко интегрируются в Milvus.
Что дальше?
Поскольку Milvus продолжает поддерживать постоянно растущие объемы данных, возникает проблема управления импортом больших объемов, особенно когда файлы Parquet превышают 10 ГБ. Чтобы решить эту проблему, мы планируем разделить импортируемые данные на скалярные и векторные колонки, создавая два файла Parquet на один импорт, чтобы снизить нагрузку на ввод-вывод. Для наборов данных, превышающих несколько сотен гигабайт, мы рекомендуем импортировать данные несколько раз.
- Что такое Apache Parquet?
- Как пользователи Milvus получают преимущества от поддержки импорта файлов Parquet
- Как импортировать файлы Parquet в Milvus
- Что дальше?
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word