SparkSql寫hdfs報權限錯誤BUG解決

今天在往hive中寫數據時,使用的save方法直接把數據寫入到hdfs目錄,結果報錯。
場景:在本地使用IDEA開發進行遠程提交,把結果數據寫入到HIVE。

寫入的方法:

df.write.mode(SaveMode.Append).save("hdfs://apps/hive/warehouse/info_test.db/result")

出現的錯誤:

org.apache.hadoop.security.AccessControlException: Permission denied: user=Admin, access=WRITE, 
inode="/apps/hive/warehouse/info_test.db/result":hive:hdfs:drwxrwxr-x

BUG原因:

遠程提交的情況下如果沒有hadoop 的系統環境變量,就會讀取當前主機的用戶名,所以Hadoop集羣的節點中沒有該用戶名的權限,所以出現的異常。

在網上查詢了很多資料,大部分說需要修改集羣的配置。而我們不能因爲一個錯誤就去動集羣的配置,這顯然是不可取的。

解決辦法:

def main(args: Array[String]): Unit = {
  //在這裏加上HADOOP_USER_NAME用戶配置,解決報錯問題。
    System.getProperties.setProperty("HADOOP_USER_NAME", "hive")

    val conf = new SparkConf().setAppName("sparksqloutzjarea").setMaster("local[*]")
    conf.set("spark.sql.shuffle.partitions","100")//sql的shuffle分區設置,默認200

    //構建sparksql入口上下文環境
    val session: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

    import session.implicits._
    //連接pg庫的方法
    val reader: DataFrame = session.read.format("jdbc")
      .option("url", "")
      .option("dbtable", "")
      .option("user", "postgres")
      .option("password", "postgres").load()
    reader.createTempView("taskry")

    //查詢hive源表數據庫,使用info庫
    session.sql(useDataBase(HIVE_DATABASE))
    //查詢實名人員軌跡表
    val smryFrame = session.sql(distinctSmryDateSql(HIVE_TABLE_SMRYGJ))
    //創建臨時表
    smryFrame.createTempView("snrygj")

    //查詢省外實名人員軌跡表
    val swryFrame = session.sql(distinctSmryDateSql(HIVE_TABLE_SMRYGJ_SW))
    //創建臨時表
    swryFrame.createTempView("swrygj")

    session.sql(querySmrySwitchStatusSql("taskry","snrygj","swrygj","NOT","NOT","0"))
    df.write.mode(SaveMode.Append).save("hdfs://apps/hive/warehouse/info_test.db/result")
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章