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

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

我有一个sparksql程序,其中user1有权从hive表读取数据,user2有权将数据写入hdfs目录。我提交了一个spark作业,使用user2keytab,因为user2有权访问hdfs目录,并且在读取配置单元表之前还与user1进行kinit操作,但是user1没有访问hdfs目录的权限,因此我的作业失败了 AccessControlException .
下面是示例代码,

  1. // start spark session
  2. SparkSession spark = SparkSession.builder()
  3. .appName("Spark Hive Example")
  4. .master("yarn")
  5. .enableHiveSupport()
  6. .getOrCreate();
  7. // kinit logics for user1
  8. ---
  9. ---
  10. // read data from hive table
  11. Dataset<Row> dataSet = spark.sql("select * from USER_DB.customer").cache(); // user1 has access
  12. // write as CSV into HDFS
  13. dataSet.write()
  14. .format("csv")
  15. .option("sep", ",")
  16. .option("quote", "\"")
  17. .option("charToEscapeQuoteEscaping", ",")
  18. .option("inferSchema", "true")
  19. .option("header", "true")
  20. .option("timestampFormat", "yyyy-MM-dd HH:mm:ss.SSS")
  21. .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。这是低效的,打破了所有血统跟踪,但这是跛脚的安全设置成本。

相关问题