You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Spark SFTP库在EMR环境中无法从SFTP服务器下载文件求助

问题分析与解决方案

你的问题核心是:EMR环境下Spark没有正确识别com.springml.spark.sftp数据源,导致默认用HDFS文件系统解析你指定的路径。本地运行正常是因为你的开发环境已经把SFTP依赖包放到了Spark的classpath里,但EMR集群默认没有这个第三方数据源,或者配置上存在冲突。

下面是具体的解决步骤:

1. 确保SFTP依赖包被正确引入到EMR任务中

本地运行时你可能已经把spark-sftp的依赖打包进了自己的spark.jar,或者本地仓库里有这个包,但EMR集群是独立环境,默认没有这个第三方数据源。所以提交任务时必须明确引入依赖:

spark-submit--packages参数指定依赖(注意匹配你的Scala和Spark版本,比如Spark 3.x对应Scala 2.12,Spark 2.x对应Scala 2.11):

spark-submit --packages com.springml:spark-sftp_2.12:1.2.0 --class com.example.App spark.jar

你可以根据自己的Spark版本调整依赖版本,比如Spark 2.4.x用com.springml:spark-sftp_2.11:1.1.1

2. 明确指定SFTP路径格式(可选但推荐)

在EMR中,HDFS是默认文件系统,Spark会优先把无协议前缀的路径解析成HDFS路径。你可以在load()的路径前加上sftp://前缀,强制Spark使用SFTP数据源解析路径:

val sftpDF = spark.read
  .schema(my_schema)
  .format("com.springml.spark.sftp")
  .option("host", "myhost.test.com")
  .option("username", "myusername")
  .option("password", "mypassword")
  .option("inferSchema", "false")
  .option("fileType", "csv")
  .option("delimiter", ",")
  .option("codec", "org.apache.hadoop.io.compress.GzipCodec")
  .load("sftp:///data/test.csv.gz") // 增加sftp://前缀

这里的sftp:///后面的部分就是SFTP服务器上的绝对路径,三个斜杠是协议+绝对路径的标准格式

3. 排查EMR的Spark默认数据源配置(极端情况)

如果上面两步都不行,可能是EMR的Spark配置里强制设置了默认数据源,覆盖了你指定的com.springml.spark.sftp。可以在提交任务时临时覆盖这个配置:

spark-submit --conf spark.sql.dataSources.default=com.springml.spark.sftp --packages com.springml:spark-sftp_2.12:1.2.0 --class com.example.App spark.jar

额外验证小技巧

  • 提交任务时加--verbose参数,查看控制台输出的classpath信息,确认spark-sftp的jar包已经被加载。
  • 检查EMR的Spark版本和你本地开发的版本是否一致,版本不兼容会导致数据源类无法正常加载。

内容的提问来源于stack exchange,提问作者yyuankm

火山引擎 最新活动