首页 / 资讯中心 / 文章详情

把 RustFS 当 Spark 的数据湖底座:S3A 连接器从官方 demo 接到生产集群

把 RustFS 当 Spark 的数据湖底座:S3A 连接器从官方 demo 接到生产集群 ★ FEATURED ARTICLE
数据团队大多已经有一套 Spark 集群让它读写 RustFS 不用换计算引擎。RustFS 是 100% 兼容 S3 的对象存储Spark 通过 Hadoop 的 S3A 连接器就能把它当数据湖底座Parquet、Iceberg 这些表格式原地可用。官方集成指南docs.rustfs.com/zh/developer/integration/big-data/spark已经给了一套能跑通的接线本文把它从单机 demo 推进到生产集群该注意的几处。官方 demo 给了什么官方指南用 Docker Compose 把 RustFS、建桶初始化、Spark 三个服务拉起来跑通「写 Parquet 到桶、读回来、在桶里列对象」的完整链路。它验证的版本组合是apache/spark:3.5.6Hadoop 3.3.4经hadoop-aws、RustFS 镜像rustfs/rustfs-x86-musl:v2.3.1。frompyspark.sqlimportSparkSession sparkSparkSession.builder.appName(rustfs-spark-demo).getOrCreate()spark.range(1000).withColumnRenamed(id,num)\.write.mode(overwrite).parquet(s3a://my-bucket/spark-demo/events)backspark.read.parquet(s3a://my-bucket/spark-demo/events)print(ROWS_READ_BACK:,back.count())spark.stop()这个 demo 的价值是先验证「能不能通」但它本身定位就是本地集成测试不是生产部署真上集群要补的东西在下面几节。六个配置项是核心Spark 通过spark.hadoop.fs.s3a.*这组属性把请求发到 RustFS。关键的四个端点、path-style、是否上 TLS、用哪个文件系统实现外加一对凭据官方 compose 里一共六条--confspark.hadoop.fs.s3a.endpointhttp://rustfs-host:9000 spark.hadoop.fs.s3a.access.keyyour-access-key spark.hadoop.fs.s3a.secret.keyyour-secret-key spark.hadoop.fs.s3a.path.style.accesstrue spark.hadoop.fs.s3a.connection.ssl.enabledfalse spark.hadoop.fs.s3a.implorg.apache.hadoop.fs.s3a.S3AFileSystempath.style.accesstrue是必须开的RustFS 用 path-style 寻址connection.ssl.enabledfalse在内网里关掉 TLS 能少一层握手开销是否上 TLS 由你自己的网络边界决定。--packages org.apache.hadoop:hadoop-aws:3.3.4在提交时把 S3 连接器拉进来版本必须和 Spark 镜像里的 Hadoop 版本对上。官方 demo 的镜像已自带hadoop-aws这种情况不必加自裁镜像或离线环境走不了 Maven 下载要提前把 jar 预置进镜像。接到已有的集群要补版本对齐单机 docker 只适合起步公司环境里的 Spark 多半跑在 YARN 或 Kubernetes 上。提交作业时把上面那组spark.hadoop.fs.s3a.*作为--conf传进去即可RustFS 这一侧不需要为 Spark 做任何特殊配置。最容易踩的坑是 Hadoop 版本错配这是官方故障排除清单里的第一条hadoop-aws的版本要和 Spark 镜像内置的 Hadoop 一致官方指南钉死apache/spark:3.5.6配hadoop-aws:3.3.4并写明Spark 4.x 镜像需要hadoop-aws3.4.x版本错配的典型症状就是NumberFormatException: For input string: 60s这类连接器解析错误。把版本钉死再提交比事后查日志省事。为什么把数据湖底座从 HDFS 挪到对象存储传统数据湖架在 HDFS 上计算和存储绑在同一批机器扩容要一起扩闲置时两边都浪费。把数据放在 RustFS 这种 S3 对象存储上计算集群可以按需起停存储独立伸缩Spark 作业跑完释放计算资源、数据留在原地成本模型清楚很多。RustFS 单节点起步、多节点横向扩展恰好覆盖「先小集群验证、再扩到生产」的节奏。Spark 读写对象存储也有自己的坑小文件太多会让 S3A 的列举和任务切分爆炸Parquet 数据集要按合理分区按日期、按租户控制单目录下文件数大文件走 multipartfs.s3a.multipart.size默认 64MB可按单文件大小调大减少请求数S3 协议本身只要求除最后一片外每片不小于 5MiB。这些和 S3 通用的调优手段在 RustFS 上同样适用。RustFS 官方 README 把定位写成原话 optimized for data lakes, AI, and big data workloads存储内核用 Rust 实现没有 GC 停顿这一类抖动源不过 README 的性能对比小节只给了压测环境表和视频公开渠道没有 S3A 路径的端到端数字小文件场景的收益有多大按你自己的 Parquet 行组和小文件分布压一轮才算数如果全是 GB 级大文件小对象优化带来的收益也会收窄。在 Kubernetes 上提交时怎么带这些配置如果你用 Spark on K8s上面的spark.hadoop.fs.s3a.*一样作为--conf传区别只是 executor pod 也要能解析到 RustFS 的 endpoint。RustFS 和 Spark 在同一个集群内网时直接用 Service 名或 ClusterIP 即可跨集群则要确认网络策略和防火墙放行了 9000 端口。提交镜像里要包含hadoop-aws依赖或者用--packages在启动时拉后者更省镜像体积但首次启动会多等下载。RustFS 在集群内网读写不走公网也就没有对象存储常见的出网流量计费分析作业扫全表时这笔开销能省下不少。一个常见疏忽executor 侧的日志和临时目录不要写到 RustFS 桶里那是计算中间产物留在本地或挂空卷只有真正的业务数据Parquet、Iceberg 文件才落对象存储避免桶被无关文件撑爆、也减少读取干扰。生产凭据走专用 Access Keydemo 里把密钥写进.env只是为了跑通生产不能这么干。RustFS 的 Access Key 管理docs.rustfs.com/zh/security-compliance/iam/access-token支持给 Spark 建专用凭据只授权它要读写的那个桶别用管理员密钥。.env不要提交进源码库凭据通过调度系统注入。IAM 侧还可以按桶、按前缀收紧权限Spark 作业通常只需要某个数据湖桶的读写把权限卡到这个桶泄露面就小。RustFS 的 IAM 用的是 AWS 策略语言熟悉 S3 的人上手没有新概念。一个最小权限策略长这样{Version:2012-10-17,Statement:[{Effect:Allow,Action:[s3:GetObject,s3:PutObject,s3:DeleteObject],Resource:arn:aws:s3:::my-bucket/datalake/*},{Effect:Allow,Action:[s3:ListBucket],Resource:arn:aws:s3:::my-bucket,Condition:{StringLike:{s3:prefix:[datalake/*]}}}]}把Resource换成你的桶和前缀Spark 的 Access Key 就只够动这一块。上面这份已经卡到前缀一级对象操作的Resource收成datalake/*ListBucket加了s3:prefix条件。少了这个条件凭这个 key 仍能列出全桶的对象名前缀隔离就漏了。进阶把桶当 Iceberg warehouse如果要做托管表而不是裸 ParquetRustFS 的 S3 Tables 提供内置的 Apache Iceberg REST CatalogSpark 可以把表桶当成 Iceberg warehouse数据仍落在 RustFS 里。spark.sql.catalog.rustfs.typerest spark.sql.catalog.rustfs.urihttp://rustfs-host:9000/iceberg spark.sql.catalog.rustfs.warehousemy-bucket spark.sql.catalog.rustfs.s3.path-style-accesstrue官方 S3 Tables 文档把对接要求钉得很细catalog URI 是http://host:9000/iceberg客户端会在 URI 后自动加/v1别自己拼REST 签名走 AWS Signature V4签名名s3、区域按us-east-1文件访问走 path-style——这些和 S3A 那六个配置是两套独立的请求通道都要各自配对漏掉文件访问那一项就会出现 catalog 能连、数据读不到的情况。生产采用这条路径前要对照 S3 Tables 的支持矩阵把你部署的 Spark 与 Iceberg 版本先校验一遍。落地顺序先排这三步先在单机 demo 把读写 Parquet 跑通确认 endpoint 和 path-style 配置对上再按你 Spark 镜像的 Hadoop 版本把hadoop-aws钉死绕开版本错配最后把生产凭据换成专用 Access Key权限收到具体桶。demo 的 compose 不能直接搬上生产还有两处镜像层面的细节建桶服务用的rustfs/rc:latest是浮动标签生产要钉死版本避免某次拉新镜像悄悄改了行为你却没察觉RustFS 镜像按节点架构选demo 里的rustfs-x86-musl只适用 x86集群里有 ARM 节点Graviton 之类时这个镜像拉都拉不起来。想照官方一步步接线Spark 集成指南 给了完整 Compose 文件与排错清单CI 里反复起停时记住docker compose down --volumes才会连数据一起清RustFS 的 S3 Tables 能力在 docs.rustfs.com/zh/administration/data/s3-tables 有详细说明。存储引擎仓库在 rustfs/rustfsApache 2.0。
阅读完成 · 觉得有帮助?
咨询建站