Apache spark 如何在一个spark sql程序中使用两个不同的键表进行读写

Apache spark 如何在一个spark sql程序中使用两个不同的键表进行读写,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个spark SQL程序,其中user1有权从配置单元表读取数据,user2有权将数据写入HDFS目录。我正在使用user2键表提交一个spark作业,因为user2可以访问HDFS目录,并且在读取配置单元表之前也可以使用user1执行kinit操作,但是user1不能访问HDFS目录,因此我的作业因AccessControlException而失败 下面是示例代码 Spark submit命令-Spark submit-class className-deploy mode client

我有一个spark SQL程序,其中user1有权从配置单元表读取数据,user2有权将数据写入HDFS目录。我正在使用user2键表提交一个spark作业,因为user2可以访问HDFS目录,并且在读取配置单元表之前也可以使用user1执行kinit操作,但是user1不能访问HDFS目录,因此我的作业因AccessControlException而失败

下面是示例代码

Spark submit命令-Spark submit-class className-deploy mode client-principaluser2@principal-键表user2@Domain-driver memory 2g-executor memory 4g-num executors 4-executor cores 2 className.jar

当我提交此作业时,由于kinit代码,它与user1一起提交。因此,我能够读取数据,因为user1有权限,但无法写入,因为user1没有/app/logs/output HDFS目录的权限

需要帮忙吗
谢谢。

选项1:更改群集的安全设置,使您拥有一个具有足够权限的用户


选项2:使用用户a将CSV文件转储到本地Linux文件系统上;然后将它们与用户B一起上传到HDFS。这效率很低,会破坏所有沿袭跟踪,但这是蹩脚的安全设置的代价。

您要做的是,要么是安全漏洞,要么是证明集群中的角色定义不正确。从技术上讲,编辑其中一个角色和添加权限要容易得多。-甚至创建一个新角色和可选的新用户。在某些时候,管理者/架构师必须自食其果。试着检查Knox网关url中的配置单元。管理2个不同的UserGroupInformation对象,并针对第一个对象运行代码,然后针对第二个对象运行代码——从技术上讲,这在hadoop auth中的低级Java API中是可能的。但这需要修补整个Spark代码库。@SamsonScharfrichter,那么我需要提供对user1 for HDFS目录的访问权限吗?我认为选项1会很好,因为将CSV转储到本地然后再转储到HDFS会导致性能下降。
// start spark session
SparkSession spark = SparkSession.builder()
                            .appName("Spark Hive Example")
                            .master("yarn")
                            .enableHiveSupport()
                            .getOrCreate();
                            
// kinit logics for user1
---
---
                            
// read data from hive table
Dataset<Row> dataSet = spark.sql("select * from USER_DB.customer").cache(); // user1 has access

// write as CSV into HDFS
dataSet.write()
        .format("csv")
        .option("sep", ",")
        .option("quote", "\"")
        .option("charToEscapeQuoteEscaping", ",")
        .option("inferSchema", "true")
        .option("header", "true")
        .option("timestampFormat", "yyyy-MM-dd HH:mm:ss.SSS")
        .save("/app/logs/output"); // user2 has access