HDFS INotify и аутентификация Kerberos в Java-клиенте

Я использую этот пример из Интернета: hdfs-inotify-example, сборка завершается с нет ошибки, но выполнение заканчивается ошибкой:

Exception in thread "main" org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): SIMPLE authentication is not enabled.  Available:[TOKEN, KERBEROS]

Система Kerberos работает, и у меня есть новый билет Kerberos, который работает отлично. Так что я не уверен, что это проблема с Kerberos. Я также установил эту env var:

export HADOOP_CONF_DIR=/etc/hadoop/conf  

которые указывают на core-site.xml, где настройки безопасности, насколько мне известно, верны:

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

Что происходит не так? Каждое предложение ценится (много).

Я использую Hadoop 2.6.0-cdh5.10.1


person ozw1z5rd    schedule 06.06.2018    source источник


Ответы (2)


Наконец, я нашел, как решить проблему:

Это патч, который я добавил в hdfs-inotify-example.

diff --git a/src/main/java/com/onefoursix/HdfsINotifyExample.java b/src/main/java/com/onefoursix/HdfsINotifyExample.java
index 97ac409..32321b1 100644
--- a/src/main/java/com/onefoursix/HdfsINotifyExample.java
+++ b/src/main/java/com/onefoursix/HdfsINotifyExample.java
@@ -11,6 +11,7 @@ import org.apache.hadoop.hdfs.inotify.Event.CreateEvent;
 import org.apache.hadoop.hdfs.inotify.Event.UnlinkEvent;
 import org.apache.hadoop.hdfs.inotify.EventBatch;
 import org.apache.hadoop.hdfs.inotify.MissingEventsException;
+import org.apache.hadoop.security.UserGroupInformation;

 public class HdfsINotifyExample {

@@ -21,10 +22,20 @@ public class HdfsINotifyExample {
                if (args.length > 1) {
                        lastReadTxid = Long.parseLong(args[1]);
                }
-
+        
+                System.out.println("com.onefoursix.HdfsINotifyExample.main()");
                System.out.println("lastReadTxid = " + lastReadTxid);
-
-               HdfsAdmin admin = new HdfsAdmin(URI.create(args[0]), new Configuration());
+                Configuration config = new Configuration();
+                
+                config.set("hadoop.security.authentication", "kerberos");
+                config.set("hadoop.security.authorization", "true");
+                config.set("dfs.namenode.kerberos.principal", "hdfs/[email protected]");
+                config.set("dfs.namenode.kerberos.principal.pattern", "hdfs/*@AD.XXXXX.COM");
+                
+                UserGroupInformation.setConfiguration(config);
+                System.out.println("Security enabled " + UserGroupInformation.isSecurityEnabled());
+                
+               HdfsAdmin admin = new HdfsAdmin(URI.create(args[0]), config);

                DFSInotifyEventInputStream eventStream = admin.getInotifyEventStream(lastReadTxid);

Аутентификация работала нормально. Наконец я получил:

Exception in thread "main" org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Access denied for user xxxxxxxx. Superuser privilege is required

это говорит мне, что текущий пользователь не может видеть, что происходит в узле данных, но это другая история.

person ozw1z5rd    schedule 11.06.2018

Добавление к ответу ozw1z5rd:

Пожалуйста, войдите в систему как суперпользователь (hdfs) и запустите программу там.

$ sudo -i -u hdfs
$ cp shaded-fat-jar.jar /home/hdfs

и запустите программу из файла jar, скопированного в hdfs home.

person Anurag Anand    schedule 16.04.2020
comment
каковы его цели? - person ozw1z5rd; 17.04.2020
comment
Я столкнулся с тем же исключением, попробовал этот способ, и проблема была решена. - person Anurag Anand; 20.05.2020
comment
Я вижу... счастье в мелочах. В вашей системе все именно так, как вы сказали. - person ozw1z5rd; 20.05.2020
comment
Это произошло потому, что у пользователя, от которого я запускал задание, не было достаточных разрешений. Итак, запустив программу от пользователя hdfs, проблема была решена. Как говорится в вопросе, здесь требуется разрешение суперпользователя, а hdfs является суперпользователем. - person Anurag Anand; 22.05.2020