我有一个sparksql程序,其中user1有权从hive表读取数据,user2有权将数据写入hdfs目录。我提交了一个spark作业,使用user2keytab,因为user2有权访问hdfs目录,并且在读取配置单元表之前还与user1进行kinit操作,但是user1没有访问hdfs目录的权限,因此我的作业失败了 AccessControlException
.
下面是示例代码,
// 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
spark submit命令-spark submit--class classname--deploy mode client--principaluser2@principal --键表user2@domain --驱动程序内存2g——执行器内存4g——num executors 4——executor cores 2 classname.jar
当我提交此作业时,由于kinit代码,它与user1一起提交。因此,我可以读取数据,因为user1有权限,但不能写入,因为user1没有权限 /app/logs/output
hdfs目录
需要帮忙谢谢。
1条答案
按热度按时间cu6pst1q1#
选项1:更改集群的安全设置,以便您有一个具有足够权限的用户。
选项2:将csv文件转储到一个本地linux文件系统上,使用一个用户;然后与用户b一起上传到hdfs。这是低效的,打破了所有血统跟踪,但这是跛脚的安全设置成本。