Définir l'utilisateur système hadoop pour le client intégré dans Java webapp


Je voudrais soumettre des travaux MapReduce à partir d'une application Web java vers un cluster Hadoop distant, mais je ne peux pas spécifier pour quel utilisateur le travail doit être soumis. Je voudrais configurer et utiliser un utilisateur système qui devrait être utilisé pour tous les travaux MapReduce.

Actuellement, je ne peux spécifier aucun utilisateur et quel que soit le travail hadoop exécuté sous le nom d'utilisateur de l'utilisateur actuellement connecté du système client. Cela provoque une erreur avec le message

Permission denied: user=alice, access=WRITE, inode="staging":hduser:supergroup:rwxr-xr-x

... où "alice" est l'utilisateur local connecté sur la machine cliente.

J'ai essayé

  1. diverses combinaisons de création d'instances UserGroupInformation (proxies et utilisateur normal) et
  2. définir la propriété système Java avec -Duser.name=hduser, changer le USER envar et comme un appel codé en dur System.setProperty("user.name", "hduser").

... en vain. En ce qui concerne 1) j'avoue n'avoir aucune idée de la façon dont ces classes sont censées être utilisées. Veuillez également noter que la modification de la propriété Système Java n'est évidemment pas un véritable solution pour une utilisation dans l'application Web.

Est-ce qu'un corps sait comment vous spécifiez quel utilisateur Hadoop utilise pour se connecter à un système distant?

PS/ Hadoop utilise la configuration par défaut, ce qui signifie qu'aucune authentification n'est utilisée lors de la connexion au cluster et que Kerberos n'est pas utilisé pour communiquer avec les machines distantes.

Author: Christoffer Soop, 2012-06-15

3 answers

Enfin, je suis tombé sur la constante

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";`

Dans le UserGroupInformation class.

La définition de cette variable d'environnement, en tant que propriété système Java au démarrage (en utilisant -D) ou par programmation avec System.setProperty("HADOOP_USER_NAME", "hduser"); permet à Hadoop d'utiliser le nom d'utilisateur souhaité pour la connexion au cluster Hadoop distant.

 39
Author: Christoffer Soop, 2012-06-16 10:08:24

Le code ci-dessous fonctionne pour moi de la même manière que

System.setProperty("HADOOP_USER_NAME", "hduser")
UserGroupInformation ugi = UserGroupInformation.createRemoteUser("hduser"); 
ugi.doAs(new PrivilegedExceptionAction<Void>() {
    public Void run() throws Exception {
        Configuration configuration = new Configuration(); 
        configuration.set("hadoop.job.ugi", "hduser");
        int res = ToolRunner.run(configuration, new YourTool(), args);
        return null; 
    }
});
 5
Author: volhv, 2013-03-21 12:27:44

Je suis en mesure de résoudre un problème similaire en utilisant la fonctionnalité d'usurpation d'identité sécurisée http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html

Voici un extrait de code

UserGroupInformation ugi = UserGroupInformation.createProxyUser("hduser", UserGroupInformation.getLoginUser()); 

ugi.doAs(new PrivilegedExceptionAction() { 
public Void run() throws Exception { 
  Configuration jobconf = new Configuration(); 
  jobconf.set("fs.default.name", "hdfs://server:hdfsport"); 
  jobconf.set("hadoop.job.ugi", "hduser"); 
  jobconf.set("mapred.job.tracker", "server:jobtracker port"); 
  String[] args = new String[] { "data/input", "data/output" }; 
  ToolRunner.run(jobconf, WordCount.class.newInstance(), args); 
  return null; 
} });

L'id utilisateur de connexion distant (hôte de bureau Windows dans mon cas) doit être ajouté dans core-site.xml comme mentionné dans l'URL mentionnée ci-dessus

 1
Author: kiran, 2014-01-30 16:38:41