Отказано в разрешении при использовании метода saveAsTable фреймов данных SPARK

Я использую Spark 1.3 и пытаюсь создать таблицу из одного RDD. Это псевдокод:

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: Permission denied: user = XXXXXXXX, access = WRITE, inode = "/ user / hive / inventory": hive: hive: drwxrwx - x: user: hive: rwx, group :: ---, группа: улей: rwx

Если я создам таблицу как:

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

Затем он работает и создает таблицу. Похоже, что saveAsTable () пытается использовать моего пользователя для записи в "/ user / hive / inventory" (это запрещено керберизацией), в то время как sqlContext.sql правильно использует для этого пользовательский "hive".

Я прав?? Это ошибка ?? Работает ли в более новых версиях Spark?

Спасибо всем.


person Luis    schedule 27.04.2016    source источник
comment
Не ошибка. Если вам нужны чистые настройки авторизации, вы можете настроить HiveServer2 для использования вашей фактической учетной записи вместо hive учетной записи службы. Но тогда вам нужно управлять ACL в каждом каталоге HDFS, используемом таблицей Hive - точно так же, как вы это делаете для сетевого диска (для каждого пользователя, для каждой группы и т. Д.). Этот общий аккаунт hive - очень хромая вещь, а Sentry / Ranger - просто нелепые повязки, создающие иллюзию безопасности для корпоративных лохов.   -  person Samson Scharfrichter    schedule 29.04.2016
comment
В любом случае, если вы можете получить права администратора (например, получить билет Kerberos как hdfs), вы можете создать ACL в каталоге, в который вы хотите, чтобы Spark создавал файлы, чтобы ваш пользователь получил права записи. Sthg нравится hdfs dfs -setfacl -m user:johndoe:r-x /user/hive/warehouse/, затем hdfs dfs -setfacl -m user:johndoe:rwx /user/hive/warehouse/sometable/   -  person Samson Scharfrichter    schedule 29.04.2016
comment
... плюс ACL по умолчанию, если вам нужно создать разделы, то есть подкаталоги.   -  person Samson Scharfrichter    schedule 29.04.2016


Ответы (1)


SaveAsTable создает физическую таблицу, а registerTempTable создает (временную) таблицу в памяти. Вы правы, пользователю нужны соответствующие разрешения для создания физических таблиц.

person Rashid Ali    schedule 27.04.2016