如何在一个sparksql程序中使用两个不同的keytab进行读写

odopli94  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(430)

我有一个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目录
需要帮忙谢谢。

cu6pst1q

cu6pst1q1#

选项1:更改集群的安全设置,以便您有一个具有足够权限的用户。
选项2:将csv文件转储到一个本地linux文件系统上,使用一个用户;然后与用户b一起上传到hdfs。这是低效的,打破了所有血统跟踪,但这是跛脚的安全设置成本。

相关问题