在Dataproc中使用Spark Java写入GCS报错,求解决方案
问题解决:Spark写入GCS时的路径与文件名错误
报错原因分析
从报错信息看,存在两个核心问题:
- 路径格式错误:Spark默认将输出路径解析为HDFS路径(
hdfs://dm-service-metanome-m/user/root/gs/...),而非GCS路径,说明你指定的location变量未使用GCS标准路径格式。 - 文件名含非法字符:生成的时间字符串包含空格(
2022-12-27 12:08:48),HDFS/GCS均不允许文件名包含空格,触发IllegalArgumentException。
解决方案
1. 修正GCS路径格式
确保location变量使用GCS官方路径格式:gs://<你的存储桶名称>/<自定义路径>,例如:
String location = "gs://my-gcs-bucket/spark-output";
这样Spark会调用GCS连接器处理输出,而非默认的HDFS。
2. 修改时间格式,移除空格
将日期格式化规则中的空格替换为下划线或其他合法字符,例如把DATE_FORMAT的格式从yyyy-MM-dd HH:mm:ss改为yyyy-MM-dd_HH-mm-ss:
SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
修正后的完整写入代码示例
String location = "gs://your-bucket-name/your-output-path"; SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); javaRDDString.coalesce(1).saveAsTextFile(location + "/" + DATE_FORMAT.format(new Date(System.currentTimeMillis())));
额外验证提示
- 确认Dataproc集群已启用GCS访问权限(默认Dataproc集群已配置GCS连接器权限,无需额外操作)。
- 确保GCS存储桶名称正确,且你的服务账号具备该存储桶的写入权限。
内容的提问来源于stack exchange,提问作者Faisal Khan
相关产品推荐
相关产品推荐

