Zilliz 推出 Spark Connector:简化非结构化数据处理流程

随着人工智能(AI)和深度学习(Deep Learning)技术的高速发展,使用神经网络模型将数据转化为 Embedding 向量 已成为处理非结构化数据并实现语义检索的首选方法,广泛应用于搜索、推荐系统等 AI 业务中。

以生产级别的搜索系统为例,该系统通常包含两个部分:离线数据索引和在线查询服务。实现该系统需要使用多种技术栈。例如,在离线处理中,如何将来源于多种渠道的非结构化数据数据高效、方便地处理并推送到向量数据库以实现在线查询,是一个充满挑战的问题。Apache Spark 和 Databricks 是应用广泛的大批量数据处理方案。Zilliz Cloud 推出了 Spark Connector。该工具将 Milvus 和 Zilliz Cloud 向量数据库 API 集成于 Apache Spark 和 Databricks 任务,大大简化数据处理和推送的实现难度。

本文将介绍 Spark Connector 及其应用场景,并手把手教你如何使用它实现数据推送。

Spark Connector 工作原理及使用场景

Apache Spark 和 Databricks 适合处理海量数据,例如以批量的方式进行非结构化数据清洗并调用模型生成 Embedding 向量。而 Milvus 则擅长存储模型生成的 Embedding 向量数据,并构建索引支持在线服务中的高效查询。这两大工具的强强联合可以实现轻松开发生成式 AI、推荐系统、图像和视频搜索等应用。

当用户在搭建 AI 应用时,很多用户都会遇到如何将数据从 Apache Spark 或 Databricks 导入到 Milvus 或 Zilliz Cloud (全托管的 Milvus 服务) 中的问题。使用 Spark Connector,用户能够在 Apache Spark 或 Databricks 任务中直接调用函数,完成数据向 Milvus 的增量插入或者批量导入,不需要再额外实现“胶水”业务逻辑,简化了数据推送流程。

批量导入数据

由于深度学习进展日新月异,专注于深度学习的团队通常需要频繁更新 Embedding 模型。在第一次批量建库,或者每次更新模型后,都需要处理全量数据、生成一套新的向量数据集。这样一来,就需要启动一个新的 Spark 任务来执行这一次处理,并将新的向量数据集重新插入到向量数据库中以供在线服务使用。有了 Databricks Connector,您只需要授予 Spark 任务写入 Milvus S3 bucket (或者授予 Zilliz Cloud 访问临时的数据源 bucket)的权限即可。简化后的数据处理流程允许您仅仅通过一个简单的函数调用将 Spark 任务生成的向量直接加载到 Milvus 或 Zilliz Cloud 实例中。

增量插入数据

// Specify the target Milvus instance and vector data collection
df.write.format("milvus").option(MILVUS_URI, "https://in01-xxxxxxxxx.aws-us-west-2.vectordb.zillizcloud.com:19535").option(MILVUS_TOKEN, dbutils.secrets.get(scope = "zillizcloud", key = "token")).option(MILVUS_COLLECTION_NAME, "text_embedding").option(MILVUS_COLLECTION_VECTOR_FIELD, "embedding").option(MILVUS_COLLECTION_VECTOR_DIM, "128").option(MILVUS_COLLECTION_PRIMARY_KEY, "id").mode(SaveMode.Append).save()

对于数据量相对较小的用户而言,使用 Spark Connector 也能简化开发工作。您的任务中无需再实现建立服务端连接以及插入数据的代码,只需调用 Connector 中提供的函数即可。

如何使用 Spark Connector

下面,我们将介绍如何使用 Spark Connector 简化数据迁移和处理流程。

使用 Dataframe 直接进行增量插入

使用 Spark Connector,您可以直接利用 Apache Spark 中 Dataframe 的 write API 将数据以增量方式插入到 Milvus 中,大幅降低数据插入流程的实现成本。同理,您也可以直接将数据从 Apache Spark 或 Databricks 导入到 Zilliz Cloud(全托管的 Milvus 服务)中。以下为示例代码:

将数据批量导入到 Collection 中

如果您需要将大量数据高效导入 Collection 中,我们推荐使用 MilvusUtils. bulkInsertFromSpark() 函数。

  • 将数据加载到 Milvus Collection 中

这个过程中需要使用 S3 或 MinIO bucket 作为 Milvus 实例的内部存储。Spark 或 Databricks 任务获取 bucket 的写入权限后,就可以使用 Connector 将数据批量写入 bucket 中,最终一次操作批量插入到向量 Collection 中以供查询使用。

// Write the data in batch into the Milvus bucket storage.
val outputPath = "s3a://milvus-bucket/result"
df.write.mode("overwrite").format("parquet").save(outputPath)
// Specify Milvus options.
val targetProperties = Map(MilvusOptions.MILVUS_HOST -> host,MilvusOptions.MILVUS_PORT -> port.toString,MilvusOptions.MILVUS_COLLECTION_NAME -> targetCollectionName,MilvusOptions.MILVUS_BUCKET -> bucketName,MilvusOptions.MILVUS_ROOTPATH -> rootPath,MilvusOptions.MILVUS_FS -> fs,MilvusOptions.MILVUS_STORAGE_ENDPOINT -> minioEndpoint,MilvusOptions.MILVUS_STORAGE_USER -> minioAK,MilvusOptions.MILVUS_STORAGE_PASSWORD -> minioSK,
)
val targetMilvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(targetProperties.asJava))// Bulk insert Spark output files into Milvus
MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
  • 将数据加载到 Zilliz Cloud Collection 中

如果您使用的是全托管 Milvus 服务——Zilliz Cloud,您可以使用 Zilliz Cloud 提供的数据导入 API 。Zilliz Cloud 提供多样的工具和完整的文档,从而帮助您将各种来源(如 Spark)的数据高效导入 Zilliz Cloud 中。您需要设置一个 S3 bucket 作为媒介,然后授权 Zilliz Cloud 读取 bucket 中的数据。这样一来,Zilliz Cloud 数据导入 API 便可无缝将数据从 S3 bucket 加载到向量数据库中。

以 Databricks 为例,开始前,您需要先通过在 Databricks 集群中添加 jar 文件来加载带有Spark Connector 的 Runtime 库。有多种安装库的方法。下图展示了如何从本地上传 jar 至集群。

如需了解更多如何在 Databricks Workspace 中安装库的信息,请参阅 Databrick 官方文档。

批量插入数据时需要将数据存储在一个临时的 bucket 中,随后再批量导入至 Zilliz Cloud 中。您可以先创建一个 S3 bucket,点击此处了解详情。为了保护您的 Zilliz Cloud 鉴权用户名密码安全,您可以跟随指南在 Databricks 上安全管理密码。

以下为批量数据迁移的示例代码。和前文的 Milvus 例子一样,您只需要填写用于鉴权的向量数据库 URI、Token 以及 S3 bucket 的地址、AK、SK。

// Write the data in batch into the Milvus bucket storage.
val outputPath = "s3://my-temp-bucket/result"
df.write.mode("overwrite").format("mjson").save(outputPath)// Specify Milvus options.
val properties = Map(MILVUS_URI -> uri,MILVUS_TOKEN -> token,MILVUS_COLLECTION_NAME -> collectionName,MILVUS_STORAGE_ENDPOINT -> s3Endpoint,MILVUS_STORAGE_USER -> s3ak,MILVUS_STORAGE_PASSWORD -> s3sk,ZILLIZCLOUD_API_KEY -> apiKey,ZILLIZCLOUD_REGION -> region,ZILLIZCLOUD_INSTANCE_ID -> clusterId,
)
val milvusOptions = new MilvusOptions(new CaseInsensitiveStringMap(properties.asJava))// Call util func to bulkinsert data into Zilliz Cloud through Import Data API.
MilvusUtils.bulkInsertFromSpark(spark, milvusOptions, outputDir, "json")

Connector 使用全流程:Notebook 示例

为帮助您快速上手,我们准备了一个 Notebook 示例 完整地介绍了如何使用 Connector 简化数据增量或批式导入至 Milvus 或 Zilliz Cloud 的流程。

总结

Apache Spark 和 Databricks 与 Milvus 和 Zilliz Cloud(全托管的 Milvus 服务)的整合为 AI 应用开发进一步带来了便利。开发人员可以轻松将数据以增量或批量的形式从数据处理端导入 Milvus 和 Zilliz Cloud 中,实现高效的检索。Spark Connector 助力高效开发可扩展的 AI 解决方案,充分释放非结构化数据的潜能。

准备好开启您的 AI 之旅了吗?立刻免费使用 Zilliz Cloud。

本文作者:陈将,Zilliz 生态和 AI 平台负责人。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/876033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构建模-系统架构师(三十二)

1、DNS配置文件是(),它包含了主机的域名搜索顺序和DNS服务器地址。 A /etc/hostname B /dev/host.conf C /etc/resolv.conf D /dev/name.conf 解析: 保存在etc/reolv.conf 2、信息隐蔽式开发整体程序时使用的法则&#xff0c…

C语言 定义结构体变量并计算该日在本年中是第几天

定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题&#xff08;即将闰年情况包含在内&#xff09;。 #include <stdio.h>typedef struct {int year;int month;int day; } Date;int isLeapYear(int year) {if ((year % 4 0 && year %…

力扣202.快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 主要是用到了鸽巢原理&#xff0c;最后他们一定会重合&#xff0c;我们只需要判断类似&#xff0c;链表的成环相遇的时候是不是1就行了 class Solution { public:int bitsum(int n){int sum 0;while (n){int a 0;a n …

用护眼灯还需要开灯吗?护眼灯行业三大套路迷局揭秘

用护眼灯还需要开灯吗&#xff1f;在使用护眼台灯时&#xff0c;同时开启室内的主照明十分必要。如果关闭其他灯具&#xff0c;仅保留护眼台灯&#xff0c;那么只有台灯周围的小片区域能够被照亮&#xff0c;而房间的其他部分则处于相对昏暗的状态。这种明显的光线差异会造成视…

freertos的学习cubemx版

HAL 库的freertos 1 实时 2 任务->线程 3 移植 CMSIS_V2 V1版本 NVIC配置全部是抢占优先级 第四组 抢占级别有 0-15 编码规则&#xff0c; 变量名 &#xff1a;类型前缀&#xff0c; c - char S - int16_t L - int32_t U - unsigned Uc - uint8_t Us - uint…

Java常见的面试二

1、普通类和抽象类有那些区别 普通类中不能有抽象方法&#xff0c;抽象类中可以有抽象方法普通类可以直接实例化&#xff0c;抽象类不能直接实例化 2、抽象类能够使用final修饰吗 不能&#xff0c;抽象类是由子类继承的&#xff0c;但是final修饰的类不能被继承。两者矛盾所以…

《书生大模型实战营第3期》入门岛 学习笔记与作业:Python 基础知识

文章大纲 Python 简介1 安装Python1.1 什么是conda&#xff1f;1.1.1 功能与作用&#xff1a;1.1.2 常用命令&#xff1a;1.1.3 适用性&#xff1a; 1.2 Python安装与学习环境准备1.2.1 下载miniconda1.2.2 安装miniconda1.2.3 创建一个python练习专属的conda虚拟环境 2: Pytho…

【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏

最终效果 【制作100个unity游戏之31】用unity制作一个爬坡2d赛车小游戏 前言 今天用unity制作一个简单的爬坡2d赛车小游戏 素材 https://www.spriters-resource.com/mobile/hillclimbracing/ 拼装车素材 车身添加碰撞体&#xff0c;摩檫力0 轮胎添加碰撞体和刚体&#xff0…

【VSCode实战】Golang无法跳转问题竟是如此简单

上一讲【VSCode实战】Go插件依赖无法安装 – 经云的清净小站 (skycreator.top)&#xff0c;开头说到了在VSCode中Golang无法跳转的问题&#xff0c;但文章的最后也没给出解决方案&#xff0c;只解决了安装Go插件的依赖问题。 解决了插件依赖问题&#xff0c;无法跳转的问题也离…

苍穹外卖 02

1.新增员工 controller&#xff1a; EmployeeServiceImpl&#xff1a; 实现controller里的save方法&#xff0c;要调用到mapper层的insert方法 因为员工登录成功后&#xff0c;会将id封装进jwt令牌,并响应给前端 所以后续请求中前端会携带jwt令牌。通过令牌可解析出被封装的…

C++:平衡搜索二叉树(AVL)

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;平衡搜索二叉树&#xff08;AVL&#xff09;》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 :maple_leaf:AVL树:maple_leaf:…

速盾:分享一些防御 DDoS 攻击的措施

DDoS&#xff08;分布式拒绝服务&#xff09;攻击是指攻击者通过操纵大量的计算机或网络设备&#xff0c;向特定的目标发起大规模的网络流量&#xff0c;以消耗目标网络资源&#xff0c;造成网络服务不可用的攻击行为。为了保护网络免受DDoS攻击的影响&#xff0c;组织和个人可…

大学计算机专业主要课程及概要介绍

大学计算机专业主要课程及概要介绍 大学计算机专业是一门涵盖广泛领域的学科&#xff0c;旨在培养学生在计算机科学与技术方面的理论知识与实践能力。该专业课程设置丰富多样&#xff0c;涵盖了从基础理论到高级应用的多个方面。以下是一些主要的课程及其概要介绍&#xff1a;…

Python爬虫技术 第15节 CSS选择器基础

在使用Python进行网页爬取时&#xff0c;CSS选择器是提取HTML文档中特定元素的常用方法之一。CSS选择器基于HTML元素的结构和属性来定位和选择页面中的元素。结合Python中的BeautifulSoup库或PyQuery库等&#xff0c;可以非常高效地解析和筛选出你想要的数据。 CSS选择器基础 …

我的深度学习命令

安装依赖 pip install -r requirements.txt --index-url https://pypi.tuna.tsinghua.edu.cn/simple conda 环境: conda search pillow 查找可用版本 (或者pip search Pillow)查询当下虚拟环境 …

wodpress设置固定链接的方式和好处【SEO优化】

设置固定链接的好处 提高用户体验&#xff1a;固定链接使得网址更加直观和易于记忆&#xff0c;用户可以更容易地分享和访问文章。 优化SEO&#xff1a;搜索引擎更倾向于索引具有清晰结构的网址&#xff0c;固定链接有助于提高网站的SEO表现。 避免URL重复&#xff1a;固定链…

最常见的前端面试题

在前端面试中,各种面试题都会遇到,因此,今天我们整理了60+比较常见繁杂的面试题,希望这些面试题能够对你有所帮助。 当然,这些面试题的答案都不是标准答案,只是对答案做了一个简介明了的说明,希望可以快速帮助你梳理重点核心内容。 这些答案可以作为参考,但是不能作为…

需要消化的知识点

需要消化 消灭清单 如何自定义一个Interceptor拦截器&#xff1f; 后端开发可以用上的前端技巧 10个堪称神器的 Java 学习网站. 【前端胖头鱼】11 chrome高级调试技巧&#xff0c;学会效率直接提升666% 【前端胖头鱼】10个我经常逛的“小网站” 【前端劝退师lv-6】Chrome D…

【H.264】H.264详解(二)—— H264视频码流解析示例源码

文章目录 一、前言二、示例源码【1】目录结构【2】Makefile源码【3】h264parser.c源码【4】编译运行【5】源码下载地址 声明&#xff1a;此篇示例源码非原创&#xff0c;原作者雷霄骅。雷霄骅&#xff0c;中国传媒大学通信与信息系统专业博士生&#xff0c;在此向雷霄骅雷神致敬…

OpenHarmony 开发

本心、输入输出、结果 文章目录 OpenHarmony 开发前言JonathanOpenHarmony 并不是 AndroidOpenHarmony 应用迁移OpenHarmony 的开发流程OpenHarmony 开发 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 如果觉得本文对你有帮助,欢迎点赞、收藏、评…