Databricks Connector 소개: 비정형 데이터 마이그레이션 및 변환을 간소화하는 명확한 솔루션
AI 및 머신 러닝(AI/ML) 기술의 빠른 발전과 함께, 벡터 임베딩은 비정형 데이터를 인덱싱하고 의미 검색을 수행하기 위한 선택 방법이 되었습니다.
AI 기반 검색은 일반적으로 오프라인 데이터 인덱싱과 온라인 쿼리 서빙이라는 두 가지 별개의 단계로 구성되며, 서로 다른 기술 스택의 활용이 필요합니다. 그러나 오프라인 처리 스택에서 온라인 서빙 스택으로 데이터를 효율적으로 원활하게 전환하려고 시도하는 것은 어려울 수 있습니다. Zilliz Cloud의 최신 릴리스는 Apache Spark/Databricks와 Milvus/Zilliz Cloud를 통합하여 이 과정을 간소화하는 명확한 솔루션인 Databricks Connector,를 소개합니다.
이 게시물에서는 이 통합을 소개하고, 실제 시나리오에서의 실용적인 사용법을 살펴보며, 이를 사용하는 방법을 단계별로 안내하겠습니다.
Databricks Connector의 작동 방식과 사용 사례
Spark는 대규모 데이터를 처리하는 능력과 머신 러닝에서의 뛰어난 역량으로 잘 알려져 있습니다. 반면, Milvus는 머신 러닝 모델이 생성한 벡터 임베딩을 효율적으로 처리하고 검색하는 데 탁월합니다. 이 두 강력한 기술을 결합하면 생성형 AI, 추천 시스템, 이미지 및 비디오 검색과 같은 분야에서 최첨단 애플리케이션 개발을 촉진할 수 있습니다.
Spark에서 Milvus로 데이터를 전송하는 것은 AI 기반 검색을 구축할 때 흔한 작업이지만, 검색 시스템의 백엔드에서 복잡한 글루 코드가 필요한 경우가 많습니다. Spark-Milvus connector는 이 프로세스를 단순화하여 Spark 프로그램 내 단일 함수 호출로 압축합니다.
이 connector는 다양한 시나리오에서 유용합니다.
배치 데이터 가져오기
머신 러닝 전문성을 갖춘 팀은 최신 연구 결과를 반영하기 위해 임베딩 모델을 자주 업데이트합니다. 임베딩 모델을 업그레이드할 때마다 전체 데이터 코퍼스를 Spark 작업으로 재처리하고 새로운 벡터 세트를 생성해야 하므로, 팀은 이러한 새 벡터를 서빙 스택에 통합하기 위해 맞춤형 '글루 코드', 전용 서비스 또는 또 다른 Spark 작업이 필요한 경우가 많습니다. 그러나 Databricks Connector를 사용하면 이 작업은 Milvus의 S3 버킷(또는 Zilliz Cloud 사용 시 임시 버킷)에 쓰기 권한을 작업에 부여하는 것만큼 간단해집니다. 이 간소화된 프로세스를 통해 벡터를 생성하는 Spark 작업은 간단한 유틸리티 함수 호출을 통해 Milvus 인스턴스에 데이터를 직접 로드할 수 있습니다.
반복 삽입
대규모로 운영하지 않는 사용자도 Spark-Milvus connector를 사용하여 Spark DataFrame 레코드를 Milvus에 직접 삽입함으로써 이점을 얻을 수 있습니다. 이 접근 방식은 연결 설정 코드와 API 호출을 작성하는 수고를 줄여 통합 프로세스를 더 원활하게 만듭니다.
Databricks Connector 사용 방법
이 섹션에서는 Databricks Connector를 사용하여 데이터 마이그레이션과 변환을 간소화하는 방법을 보여줍니다.
Spark Dataframe 반복 삽입
Spark-Milvus 연결을 사용하면 Spark에서 Milvus로 데이터를 스트리밍하는 것이 그 어느 때보다 쉬워졌습니다. 이제 Spark의 네이티브 Dataframe API를 사용하여 Spark에서 Milvus로 데이터를 직접 푸시할 수 있습니다. 동일한 코드는 Databricks와 Zilliz(완전 관리형 Milvus)에서도 작동합니다. 다음은 이 접근 방식을 보여주는 코드 스니펫입니다:
// 대상 Milvus 인스턴스와 벡터 데이터 컬렉션 지정
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()
컬렉션 일괄 로드
대량의 데이터를 효율적으로 전송해야 하는 상황에서는 `MilvusUtils. bulkInsertFromSpark ()` 함수를 사용하는 것을 권장합니다. 이 접근 방식은 방대한 데이터셋을 처리하는 데 매우 효율적입니다.
Milvus를 위한 접근 방식
이 통합에는 자체 호스팅 Milvus 인스턴스의 내부 스토리지로 S3 또는 MinIO 버킷이 포함됩니다. Spark 또는 Databricks에 액세스 권한을 부여하면 Spark 작업이 Milvus 커넥터를 사용하여 데이터를 버킷에 일괄로 쓰고, 그런 다음 서비스 제공을 위해 전체 컬렉션을 대량 삽입할 수 있습니다.
// 데이터를 일괄로 Milvus 버킷 스토리지에 씁니다.
val outputPath = "s3a://milvus-bucket/result"
df.write
.mode("overwrite")
.format("parquet")
.save(outputPath)
// Milvus 옵션을 지정합니다.
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))
// Spark 출력 파일을 Milvus에 대량 삽입
MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "parquet")
Zilliz Cloud를 위한 접근 방식
Zilliz Cloud(관리형 Milvus)를 사용하고 있다면 편리한 Data Import API를 활용할 수 있습니다. Zilliz Cloud는 Spark를 포함한 다양한 데이터 소스에서 데이터를 효율적으로 이동할 수 있도록 포괄적인 도구와 문서를 제공합니다. S3 버킷을 중간 매개체로 설정하고 Zilliz Cloud에 액세스 권한을 부여하면, Data Import API가 S3 버킷에서 벡터 데이터베이스로 데이터를 원활하게 로드합니다.
이 통합을 실행하기 전에 Databricks Cluster에 jar 파일을 추가하여 Spark 런타임을 로드해야 합니다. 라이브러리를 설치하는 방법에는 여러 가지가 있습니다. 아래 스크린샷은 로컬에서 클러스터로 jar를 업로드하는 것을 보여줍니다.
Databricks workspace에서 라이브러리를 설치하는 방법에 대한 자세한 내용은 Databricks의 공식 문서를 참조하여 더 알아보세요.
대량 삽입에는 Zilliz Cloud가 데이터를 일괄로 가져올 수 있도록 임시 버킷에 데이터를 저장해야 합니다. S3 버킷을 만들고 Databricks의 외부 위치로 구성할 수 있습니다. 자세한 내용은 이 문서를 참조하세요. Zilliz Cloud 자격 증명의 보안 위험을 줄이기 위해 Databricks 지침에 따라 Databricks에서 이를 안전하게 관리할 수 있습니다.
다음은 일괄 데이터 마이그레이션 프로세스를 보여주는 코드 스니펫입니다. 위의 Milvus 예제와 유사하게 자격 증명과 S3 버킷 주소만 교체하면 됩니다.
// 데이터를 일괄적으로 Milvus 버킷 스토리지에 씁니다.
val outputPath = "s3://my-temp-bucket/result"
df.write
.mode("overwrite")
.format("mjson")
.save(outputPath)
// Milvus 옵션을 지정합니다.
val targetProperties = Map(
MilvusOptions.MILVUS_URI -> zilliz_uri,
MilvusOptions.MILVUS_TOKEN -> zilliz_token,
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))
// Spark 출력 파일을 Milvus에 대량 삽입
MilvusUtils.bulkInsertFromSpark(spark, targetMilvusOptions, outputPath, "mjson")
모두 함께 살펴보기: 전체 과정을 안내하는 노트북 예제
빠르게 시작할 수 있도록, Milvus 및 Zilliz Cloud를 사용한 스트리밍 및 배치 데이터 전송 과정을 안내하는 노트북 예제를 준비했습니다.
결론
Spark와 Milvus의 통합은 AI 기반 애플리케이션에 흥미로운 가능성을 제공합니다. 데이터 이동성을 위한 간소화된 접근 방식을 통해 개발자는 실시간이든 배치 모드든 Spark/Databricks에서 Milvus/Zilliz Cloud로 데이터를 손쉽게 전송할 수 있습니다. 이 통합을 통해 효율적이고 확장 가능한 AI 솔루션을 구축하고, 이러한 강력한 기술의 잠재력을 최대한 활용할 수 있습니다.
AI 여정을 시작할 준비가 되셨나요? 설치 번거로움 없이, 신용카드가 필요하지 않은 Zilliz Cloud를 오늘 무료로 시작하세요.
계속 읽기

We spent 8 years making vector databases faster. Then we stopped.
Rarely queried embeddings still need to stay searchable. See how Vector Lakebase enables on-demand vector search without always-on compute costs.

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

DeepSeek Always Busy? Deploy It Locally with Milvus in Just 10 Minutes—No More Waiting!
Learn how to set up DeepSeek-R1 on your local machine using Ollama, AnythingLLM, and Milvus in just 10 minutes. Bypass busy servers and enhance AI responses with custom data.



