2016-04-27 27 views
0

我正在使用Spark 1.3,我試圖從一個RDD生成一個表。這是僞代碼:當使用SPARK數據框的方法「saveAsTable」時,權限被拒絕

val sc = new org.apache.spark.SparkContext(conf) 
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc) 
import sqlContext.implicits._ 

val rdd1=sc.textFile(path_1).map(........) // RDD[(string,Double)] 
val rdd2=sc.textFile(path_2).map(........) // RDD[(string,Double)] 
val rdd_join=rdd1.fullOuterJoin(rdd2)  // RDD[String,(Option(Double),Option(Double))) 
val rdd_get = rdd_join.map(....}   // RDD[(String,Double,Double)] 
rdd_get.toDF().saveAsTable("database.tablename") 

運行此代碼I'm獲取權限錯誤:

org.apache.hadoop.security.AccessControlException:權限被拒絕:用戶= XXXXXXXX,訪問=寫,inode =「/ user/hive/warehouse」:hive:hive:drwxrwx -x:user:hive:rwx,group :: ---,group:hive:rwx

如果我創建表爲:

rdd_get.toDF().registerTempTable("rdd_get_temp") 
    sqlContext.sql("CREATE TABLE database.tablename AS SELECT * FROM rdd_get_temp") 

那麼它的工作原理和創意測試表格。它看起來像saveAsTable()試圖用我的用戶寫入「/用戶/配置/倉庫」(這是通過Kerberization禁止),而sqlContext.sql使用正確的用戶「配置單元」來做到這一點。

我對嗎?這是一個錯誤?它在更新的火花版本中工作嗎?

謝謝大家。

+2

不是一個錯誤。如果您想要「乾淨」的授權設置,您可以將HiveServer2設置爲使用您的實際用戶帳戶而不是'hive'服務帳戶。但是,您必須管理Hive表使用的每個HDFS目錄上的ACL - 就像您對網絡驅動器(每個用戶,每個組等)所做的一樣。這個通用的「蜂巢」帳戶是一件非常蹩腳的事情 - 哨兵/遊俠只是荒謬的樂隊援助給公司吸盤的安全錯覺。 –

+1

無論如何,如果你可以獲得管理員權限(例如獲得一個Kerberos票證爲'hdfs'),那麼你可以在你想要Spark創建文件的目錄上創建一個ACL,這樣*你的用戶就可以獲得寫權限。 sthg like'hdfs dfs -setfacl -m user:johndoe:rx/user/hive/warehouse /'then'hdfs dfs -setfacl -m user:johndoe:rwx/user/hive/warehouse/sometable /' –

+0

... plus一個「默認」ACL,如果你需要創建partitiions即子目錄。 –

回答

0

SaveAsTable創建物理表,而registerTempTable在內存中創建(臨時)表。 你說得對,用戶需要適當的權限來創建物理表。