LanceDB Integration
LanceDB connects to the SeaweedFS Lance Catalog over the Lance Namespace REST protocol, so a SeaweedFS table bucket works as a LanceDB catalog with no other service in the way.
Verified against lancedb 0.37.1, lance-namespace 0.8.6 and pylance 10.0.0 by the integration suite in test/s3tables/catalog_lancedb/.
1. Start SeaweedFS
weed server -dir=/data -s3 -s3.port.lance=9101
2. Create a Lance table bucket
weed shell
> s3tables.bucket -create -name vectors -format LANCE -account 000000000000
Or pre-create it at startup, which is one line instead of two:
weed mini -tableBucket=vectors:LANCE
3. Connect
import lancedb
db = lancedb.connect_namespace(
"rest",
{"uri": "http://localhost:9101"},
storage_options={
"aws_endpoint": "http://localhost:8333",
"allow_http": "true",
"aws_access_key_id": "...",
"aws_secret_access_key": "...",
"aws_region": "us-east-1",
},
)
connect_namespace takes the properties dict as Dict[str, str]; storage_options is a separate keyword argument, and passing it inside the properties fails with 'dict' object is not an instance of 'str'.
4. Use it
A table bucket is the first level of the namespace path, so namespace_path is [bucket, namespace]:
# create - LanceDB declares the table through the catalog and writes the data
table = db.create_table(
"embeddings", data=rows, namespace_path=["vectors", "ml"])
# list
db.table_names(namespace_path=["vectors", "ml"])
# -> ['vectors$ml$embeddings']
# open and query
table = db.open_table("embeddings", namespace_path=["vectors", "ml"])
table.count_rows()
table.search([0.1] * 8).limit(5).to_list()
table.search().where("id < 5").limit(10).to_list()
# index
table.create_index(metric="l2", vector_column_name="vector",
index_type="IVF_PQ", num_partitions=1, num_sub_vectors=4)
Credentials
This is the one that catches people. A gateway without STS configured vends storage_options carrying an endpoint and a region but no credentials, and LanceDB uses what the namespace vends on some paths — so a client configured only through connect_namespace(storage_options=...) can still end up with none, failing inside lance with:
Failed to get AWS credentials: CredentialsNotLoaded(... "no providers in chain provided credentials")
Two ways out, and you can use both:
-
Configure credential vending so the namespace hands out real, scoped, expiring credentials:
weed server -s3 -s3.port.lance=9101 -s3.iceberg.credentialRole=arn:aws:iam::…:role/… -
Give the client credentials the ordinary way, in the environment, so lance's provider chain finds them whichever path is taken:
export AWS_ACCESS_KEY_ID=… AWS_SECRET_ACCESS_KEY=… export AWS_ENDPOINT_URL=http://localhost:8333 export AWS_ALLOW_HTTP=true
What is not served
create_table works because LanceDB declares through the catalog and writes the data itself. Asking LanceDB to push the operation to the server instead —
lancedb.connect_namespace(..., namespace_client_pushdown_operations=["CreateTable"])
— calls the namespace's own CreateTable, which carries Arrow data and is not implemented here; see SeaweedFS Lance Catalog for the full list. The client falls back to declare-and-write, so the table still lands.
Without the catalog
The same dataset opens by URI, which is worth knowing before you build anything that assumes the catalog is always reachable:
import lance
lance.dataset("s3://vectors/ml/embeddings", storage_options=opts)
See also
- SeaweedFS Lance Catalog
- Spark Lance Integration
- DuckDB Lance Integration
- Lance Maintenance Worker — compaction, index optimization, version cleanup
Introduction
- Quick Start with weed mini
- Simplest S3 Bucket and User Setup
- Components
- Blob Store Architecture
- Getting Started
- Production Setup
- A typical step‐by‐step example
- Benchmarks
- FAQ
- Applications
API
Configuration
- Replication
- Store file with a Time To Live
- Failover Master Server
- Erasure coding for warm storage
- EC Bitrot Detection
- Server Startup via Systemd
- Environment Variables
Filer
- Filer Setup
- Directories and Files
- File Operations Quick Reference
- Data Structure for Large Files
- Filer Data Encryption
- Filer Commands and Operations
- Filer JWT Use
- TUS Resumable Uploads
Filer Stores
- Filer Cassandra Setup
- Filer Redis Setup
- Super Large Directories
- Path-Specific Filer Store
- Choosing a Filer Store
- Customize Filer Store
Management
Advanced Filer Configurations
- Migrate to Filer Store
- Add New Filer Store
- Filer Store Replication
- Filer Active Active cross cluster continuous synchronization
- Filer as a Key-Large-Value Store
- Path Specific Configuration
- Filer Change Data Capture
- Filer Operation Serialization
FUSE Mount
- Mount on Windows
- FIO benchmark
- fstab and systemd mount
- POSIX Compliance
- Distributed POSIX Locks
- P2P reading in weed mount
- Mount over the Internet
WebDAV
SFTP Server
Cloud Drive
- Cloud Drive Benefits
- Cloud Drive Architecture
- Configure Remote Storage
- Azure Blob Storage Authentication
- Mount Remote Storage
- Cache Remote Storage
- Cloud Drive Quick Setup
- Gateway to Remote Object Storage
AWS S3 API
- Amazon S3 API
- Supported APIs vs Minio
- S3 Lifecycle
- S3 Lifecycle vs Volume TTL
- S3 Conditional Operations
- S3 CORS
- S3 Object Lock and Retention
- S3 Object Versioning
- S3 RenameObject
- S3 API Benchmark
- S3 API FAQ
- S3 Bucket Quota
- S3 Rate Limiting
- S3 API Audit log
- S3 Nginx Proxy
- Docker Compose for S3
S3 Table Bucket
- S3 Table Bucket
- S3 Table Bucket Commands
- S3 Tables Security
- SeaweedFS Iceberg Catalog
- Iceberg REST Catalog API
- Iceberg Table Maintenance
- SeaweedFS Lance Catalog
- Lance Maintenance Worker
Iceberg Integrations
- Spark Iceberg Integration
- Trino Iceberg Integration
- Dremio Iceberg Integration
- DuckDB Iceberg Integration
- Doris Iceberg Integration
- RisingWave Iceberg Integration
- Lakekeeper Iceberg Integration
Lance Integrations
S3 Authentication & IAM
- S3 Configuration - Start Here
- S3 Credentials (
-s3.config) - OIDC Integration (
-s3.iam.config) - Kubernetes ServiceAccount Authentication (IRSA-style)
- S3 Policy Variables
- S3 Policy Conditions
- S3 Bucket Policies
- Amazon IAM API
- AWS IAM CLI
- weed shell - Shell IAM Commands
Server-Side Encryption
S3 Client Tools
- AWS CLI with SeaweedFS
- s3cmd with SeaweedFS
- rclone with SeaweedFS
- restic with SeaweedFS
- nodejs with Seaweed S3
Machine Learning
HDFS
- Hadoop Compatible File System
- run Spark on SeaweedFS
- run HBase on SeaweedFS
- Run Trino on SeaweedFS
- Hadoop Benchmark
- HDFS via S3 connector
Replication and Backup
- Async Replication to another Filer [Deprecated]
- Async Backup
- Async Filer Metadata Backup
- Async Replication to Cloud [Deprecated]
- Kubernetes Backups and Recovery with K8up
Metadata Change Events
Messaging
- Structured Data Lake with SMQ and SQL
- Seaweed Message Queue
- SQL Queries on Message Queue
- SQL Quick Reference
- PostgreSQL-compatible Server weed db
- Pub-Sub to SMQ to SQL
- Kafka to Kafka Gateway to SMQ to SQL
Use Cases
Operations
- System Metrics
- weed shell
- Data Backup
- Deployment to Kubernetes and Minikube
- Helm Chart Recipes
- Deployment with seaweed-up
Rust Volume Server
Advanced
- Large File Handling
- Optimization
- Optimization for Many Small Buckets
- Volume Management
- Tiered Storage
- Cloud Tier
- Cloud Monitoring
- Load Command Line Options from a file
- SRV Service Discovery
- Volume Files Structure
Security
- Security Overview
- Security Configuration
- Cryptography and FIPS Compliance
- Run Blob Storage on Public Internet