Невозможно записать данные в Hive, используя sparksql - PullRequest
1 голос
/ 17 марта 2020

Я загружаю данные из одной таблицы Hive в другую, используя spark Sql. Я создал sparksession с помощью enableHiveSupport, и я могу создать таблицу в кусте, используя spark sql, но когда я загружаю данные из одной таблицы улья в другую таблицу улья, используя spark sql, я получаю разрешение:

В доступе отказано: user = anonymous, access = WRITE, path = "hivepath".

Я запускаю это с использованием пользователя spark, но не могу понять, почему его взятие Аноним как пользователь вместо искры. Кто-нибудь может подсказать, как мне решить эту проблему?

Я использую приведенный ниже код.

    sparksession.sql("insert overwrite into table dbname.tablename" select * from dbname.tablename").

Ответы [ 3 ]

0 голосов
/ 17 марта 2020

Чтобы проверить, с каким пользователем вы работаете, выполните следующую команду: -

    sc.sparkUser

Это покажет вам текущего пользователя, а затем вы можете попробовать установить нового пользователя в соответствии с кодом ниже

А в scala вы можете установить имя пользователя по

    System.setProperty("HADOOP_USER_NAME","newUserName")
0 голосов
/ 17 марта 2020

Прежде всего, вы можете попробовать это для анонимного пользователя

root@host:~# su - hdfs
hdfs@host:~$ hadoop fs -mkdir /user/anonymous
hdfs@host:~$ hadoop fs -chown anonymous /user/anonymous

В общем

экспорт HADOOP_USER_NAME=youruser до того, как spark-submit будет работать. наряду с настройкой spark-submit, как показано ниже.

--conf "spark.yarn.appMasterEnv.HADOOP_USER_NAME=${HADDOP_USER_NAME}" \

в качестве альтернативы вы можете попробовать использовать sudo -su username spark-submit --class ваш класс

см. this

Примечание : эта настройка имени пользователя должна быть идеальной частью вашей первоначальной настройки кластера, если она завершена, то нет необходимости делать все это выше, и это кажется бесполезным.

Лично я не предпочитаю жесткое кодирование имени пользователя в коде, которое должно быть за пределами искровой работы.

0 голосов
/ 17 марта 2020

Если вы используете искру, вам нужно установить имя пользователя в контексте вашей искры.

  System.setProperty("HADOOP_USER_NAME","newUserName")
  val spark = SparkSession
    .builder()
    .appName("SparkSessionApp")
    .master("local[*]")
    .getOrCreate()

  println(spark.sparkContext.sparkUser)
...