Spark Streaming写入Iceberg至MinIO时S3 301错误排查求助
问题分析与解决方案
核心问题定位
报错是S3 301重定向,说明Spark/Iceberg访问MinIO时使用的Endpoint地址不正确,导致请求被MinIO要求重定向到正确端点。虽然你能在MinIO中看到元数据,但流式写入阶段的存储路径配置未正确指向MinIO专属Endpoint。
缺失的关键配置
你的Spark提交命令仅配置了Rest Catalog地址,未指定Iceberg底层存储(MinIO)的连接参数,需补充以下MinIO相关配置:
1. 添加MinIO存储连接参数
在spark-submit的--conf列表中加入:
--conf spark.sql.catalog.rest.s3.endpoint=http://minio:9000 \ --conf spark.sql.catalog.rest.s3.path-style-access=true \ --conf spark.sql.catalog.rest.s3.access-key=你的MinIO访问密钥 \ --conf spark.sql.catalog.rest.s3.secret-key=你的MinIO秘密密钥
s3.endpoint:Docker环境下填写MinIO容器名+默认端口(如http://minio:9000),确保Spark容器能通过该地址访问MinIOpath-style-access=true:MinIO默认使用路径式访问,必须开启,否则会因虚拟主机格式不匹配触发301错误access-key/secret-key:替换为你MinIO实例的实际密钥
2. 修复重复配置
你的命令中重复写了--conf spark.sql.catalog.rest=org.apache.iceberg.spark.SparkCatalog,删除其中一条即可,避免配置冲突。
修正后的完整Spark提交命令
spark-submit \ --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.7.1,org.apache.spark:spark-sql-kafka-0-10_2.12:3.5.4 \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.rest=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.rest.type=rest \ --conf spark.sql.catalog.rest.uri=http://rest:8181 \ --conf spark.sql.catalog.rest.s3.endpoint=http://minio:9000 \ --conf spark.sql.catalog.rest.s3.path-style-access=true \ --conf spark.sql.catalog.rest.s3.access-key=MINIO_ACCESS_KEY \ --conf spark.sql.catalog.rest.s3.secret-key=MINIO_SECRET_KEY \ --conf spark.sql.defaultCatalog=rest \ test.py
额外检查项
- 确认Docker网络连通性:Spark容器能通过
http://minio:9000访问到MinIO服务 - 检查表存储路径:若提前创建了
db.crypto_metrics5表,需确认其Location配置为MinIO路径(如s3://iceberg-bucket/db/crypto_metrics5)
内容的提问来源于stack exchange,提问作者Rohit Anil
相关产品推荐
相关产品推荐

