Scala 无法使用spark sftp api将数据帧写入目标sftp服务器
我正在尝试执行sftp,并将数据帧从spark集群写入目标sftp服务器 该代码在spark shell上运行良好,但当我尝试使用scala代码部署我的jar时,它失败了,出现以下错误:Scala 无法使用spark sftp api将数据帧写入目标sftp服务器,scala,apache-spark,spark-sftp,Scala,Apache Spark,Spark Sftp,我正在尝试执行sftp,并将数据帧从spark集群写入目标sftp服务器 该代码在spark shell上运行良好,但当我尝试使用scala代码部署我的jar时,它失败了,出现以下错误: *Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=abcuser, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x* 我尝试在spa
*Caused by: org.apache.hadoop.security.AccessControlException: Permission denied: user=abcuser, access=WRITE, inode="/":hdfs:supergroup:drwxr-xr-x*
我尝试在spark shell中使用以下工具及其工作原理:
spark2-shell --queue xyz --packages com.springml:spark-sftp_2.11:1.1.3
val df = sparksession.sql(s"select * from db.table")
df.write.format("com.springml.spark.sftp").option("host", "hostname").option("username", "username").option("password", "abc").option("port","22").option("fileType", "csv").option("delimiter", "|").option("header","true").save("/Download/file.txt")
但是在我的scala代码中失败了。以下是我的节目:
import com.springml.spark.sftp._
val df = sparksession.sql(s"select * from db.table")
df.write.format("com.springml.spark.sftp")
.option("host", "hostname")
.option("username", "username")
.option("password", "abc")
.option("port","22")
.option("fileType", "csv")
.option("delimiter", "|")
.option("header","false")
.save("sftp_directory")
有人能告诉我错误或者我遗漏了什么吗
下面是我的sparksubmit命令,我在其中添加了所有必需的jar
以下spark文档: 注意:在群集模式下,在纱线上运行Spark时,环境 变量需要使用 应用程序中的spark.Thread.appMasterEnv.[EnvironmentVariableName]属性 conf/spark-defaults.conf文件。在中设置的环境变量 spark-env.sh不会反映在纱线应用程序主控中 进程处于群集模式。有关详细信息,请参阅与纱线相关的火花特性 更多信息 因此,要么修改spark-defaults.conf,要么将其作为spark-submit的配置传递 由于这是权限错误,您可以将其添加到spark submit配置中:
/bin/spark提交
--名称“我的应用程序”
--主本地[4]
--conf spark.warn.appMasterEnv.HADOOP\u USER\u NAME=hdfs
myApp.jar
以下spark文档:
注意:在群集模式下,在纱线上运行Spark时,环境
变量需要使用
应用程序中的spark.Thread.appMasterEnv.[EnvironmentVariableName]属性
conf/spark-defaults.conf文件。在中设置的环境变量
spark-env.sh不会反映在纱线应用程序主控中
进程处于群集模式。有关详细信息,请参阅与纱线相关的火花特性
更多信息
因此,要么修改spark-defaults.conf,要么将其作为spark-submit的配置传递
由于这是权限错误,您可以将其添加到spark submit配置中:
/bin/spark提交
--名称“我的应用程序”
--主本地[4]
--conf spark.warn.appMasterEnv.HADOOP\u USER\u NAME=hdfs
myApp.jar
您必须在HDFS中创建与用于提交作业的UNIX用户名对应的用户目录
for UNAME in abcuser; do
hdfs dfs -test -e /user/$UNAME
if [ ! $? -eq 0 ]
then
hdfs dfs -mkdir /user/$UNAME || error=0
hdfs dfs -chmod 777 /user/$UNAME || error=0
hdfs dfs -chown $UNAME /user/$UNAME || error=0
fi
done
您还可以通过传递参数,使用不同的用户名进行spark提交:
--conf spark.yarn.appMasterEnv.HADOOP_USER_NAME=hadoop
您必须在HDFS中创建与用于提交作业的UNIX用户名对应的用户目录
for UNAME in abcuser; do
hdfs dfs -test -e /user/$UNAME
if [ ! $? -eq 0 ]
then
hdfs dfs -mkdir /user/$UNAME || error=0
hdfs dfs -chmod 777 /user/$UNAME || error=0
hdfs dfs -chown $UNAME /user/$UNAME || error=0
fi
done
您还可以通过传递参数,使用不同的用户名进行spark提交:
--conf spark.yarn.appMasterEnv.HADOOP_USER_NAME=hadoop
我尝试了下面的conf参数,但仍然给出了相同的错误--conf spark.spirn.appMasterEnv.HADOOP_USER_NAME=hdfs我已经附加了我在代码中使用的spark submit命令。请提出建议。您可以添加一些日志,并记录:
sparksession.sparkContext.getConf.getAll
,以查看是否考虑了配置参数?您可以尝试以下操作:sparksession.sparkContext.conf.set(“spark.warn.appMasterEnv.HADOOP_USER_NAME”,“hdfs”)
是的,我在设置conf属性后检查了打印日志。我可以看到此属性已成功设置。但是错误仍然是一样的。请在conf/spark-defaults.conf中显示HADOOP\u USER\u NAME
的值好吗?我尝试了下面的conf参数,但仍然给出了相同的错误--conf spark.spirn.appMasterEnv.HADOOP_USER_NAME=hdfs我已经附加了我在代码中使用的spark submit命令。请提出建议。您可以添加一些日志,并记录:sparksession.sparkContext.getConf.getAll
,以查看是否考虑了配置参数?您可以尝试以下操作:sparksession.sparkContext.conf.set(“spark.warn.appMasterEnv.HADOOP_USER_NAME”,“hdfs”)
是的,我在设置conf属性后检查了打印日志。我可以看到此属性已成功设置。但是错误仍然是一样的。请在conf/spark-defaults.conf中显示HADOOP\u USER\u NAME
的值好吗?