Apache spark 如何在一个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-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目录的权限 需要帮忙吗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
谢谢。选项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