2016-04-27 5 views
0

Spark 1.3を使用していますが、1つの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") 

権限のエラーを取得して、このコードを実行している - 私:

org.apache.hadoop.security.AccessControlException:アクセス許可が拒否されました:ユーザー= XXXXXXXX、アクセス= WRITEを、inode = "/ user/hive/warehouse":ハイブ:ハイブ:drwxrwx - x:ユーザー:ハイブ:rwx、グループ:: ---、グループ:ハイブ:rwx

テーブルを次のように作成すると、

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

次に動作し、creaテーブルを調べる。 saveAsTable()はユーザーを "/ user/hive/warehouse"に書き込もうとしているようですが(これはKerberizationによって禁止されています)、sqlContext.sqlは適切にユーザー "hive"を使用します。

私は正しいですか?これはバグですか?より新しいスパークバージョンで動作しますか?

ありがとうございます。

+2

バグではありません。 「クリーン」な認証設定が必要な場合は、HiveServer2を設定して、「ハイブ」サービスアカウントの代わりに実際のユーザーアカウントを使用することができます。しかし、ネットワークドライブ(ユーザー、グループごとなど)と同じように、Hiveテーブルで使用される各HDFSディレクトリでACLを管理する必要があります。この一般的な「ハイブ」アカウントは非常に不自由なものです.Sentry/Rangerは企業の吸盤にセキュリティの錯覚を与えるばかげたバンドエイドです。 –

+1

とにかく、管理者特権を得ることができれば(例えば、Kerberosチケットを 'hdfs 'として取得する)、Sparkにファイルを作成させたいディレクトリにACLを作成することができるので、あなたの*ユーザは書き込み権限を得ることができます。 'hdfs dfs -setfacl -m user:johndoe:rx/user/hive/warehouse /'と '' hdfs dfs -setfacl -m user:johndoe:rwx/user/hive/warehouse/sometable/'のようなSthg –

+0

... plusあなたがサブサイト、すなわちサブディレクトリを作成する必要がある場合は、「デフォルト」のACL。 –

答えて

0

SaveAsTableは物理テーブルを作成し、registerTempTableはメモリに(一時的な)テーブルを作成します。 本当に、物理テーブルを作成するための適切な権限が必要です。

関連する問題