Аутентификация Hadoop с ошибкой Kerberos - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать файлы в HDFS, используя:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

Для этого я добавляю конфиги вот так:

Configuration configuration = new Configuration();

configuration.set("fs.hdfs.impl",
        org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
);
configuration.set("fs.file.impl",
        org.apache.hadoop.fs.LocalFileSystem.class.getName()
);

OutputStream fileout1 = new FileOutputStream("CONF_before.XML");
configuration.writeXml(fileout1);

configuration.addResource(new Path("/etc/hive/conf.cloudera.hive/hdfs-site.xml"));
configuration.addResource(new Path("/etc/hive/conf.cloudera.hive/core-site.xml"));
OutputStream fileout = new FileOutputStream("CONF_after.XML");
configuration.writeXml(fileout);
FileSystem hdfs = FileSystem.get(configuration);

Path out_path = new Path(hdfs.getWorkingDirectory() + "/OD.xml");
OutputStream os = hdfs.create(out_path);

Когда я запускаю этот код, я получаю сообщение об ошибке в OutputStream os = hdfs.create(out_path):

Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): SIMPLE authentication is not enabled.  Available:[TOKEN,KERBEROS]

, но если добавить core-site.xml к артефакту проекта и запустить его на сервере, ошибок не будет.

Выходные конфигурации в обоих случаях одинаковы. Соответствующая часть core-site.xml:

 <property>
    <name>hadoop.security.authentication</name>
    <value>kerberos</value>
  </property>
  <property>
    <name>hadoop.security.authorization</name>
    <value>false</value>
  </property>
  <property>
    <name>hadoop.rpc.protection</name>
    <value>authentication</value>
  </property>

Есть идеи, почему это произошло? Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

В соответствии с данным сообщением об ошибке RemoteException ... AccessControlException) ... SIMPLE authentication is not enabled. Available:[TOKEN,KERBEROS] и свойством конфигурации hadoop.security.authentication = kerberos создается впечатление, что вы используете защищенный кластер Kerberos, в результате чего ваш клиент для доступа к HDFS не использует эту конфигурацию и пытается выполнить простую аутентификацию.

0 голосов
/ 25 апреля 2019

попробуйте добавить это в hdfs-site.xml

<property>
  <name>ipc.client.fallback-to-simple-auth-allowed</name>
  <value>true</value>
</property>
0 голосов
/ 26 апреля 2018

Я тоже столкнулся с этой проблемой, и оказалось, что:

configuration.addResource(new Path("..."))

не загружал файл.

Я не проследил причину, но я знаю, что переключение на перегруженный метод, принимающий InputStream, сработало:

configuration.addResource(new FileInputStream(new File("...")))

Вы написали, что если вы добавляете XML-файлы к своим ресурсам JAR, это решает проблему - это потому, что по умолчанию класс Configuration ищет два XML-файла в вашем пути к классам и пытается загрузить их. Для быстрого ознакомления фрагмент реализации класса Configuration:

addDefaultResource("core-default.xml");
addDefaultResource("core-site.xml");
...