2012-06-14 15 views
25

Me gustaría enviar trabajos de MapReduce desde una aplicación web java a un clúster Hadoop remoto, pero no puedo especificar para qué usuario se debe enviar el trabajo. Me gustaría configurar y usar un usuario del sistema que se debe usar para todos los trabajos de MapReduce.Establecer el usuario del sistema hadoop para el cliente integrado en la aplicación Java

Actualmente no puedo especificar ningún usuario y no importa lo que ejecute el trabajo de hadoop con el nombre de usuario del usuario actualmente conectado del sistema cliente. Esto causa un error con el mensaje

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

... donde "alice" es el usuario local que ha iniciado sesión en la máquina del cliente.

He tratado

  1. varias combinaciones de crear UserGroupInformation casos (ambos proxies y usuario normal) y
  2. establecer la propiedad de sistema Java con -Duser.name=hduser, cambiando el envar USER y como System.setProperty("user.name", "hduser") llamada codificada duro.

... en vano. En cuanto a 1), confieso que no tengo ni idea de cómo se supone que se utilizarán estas clases. También tenga en cuenta que cambiar la propiedad del sistema Java obviamente no es una solución real para usar en la aplicación web.

¿Alguien sabe cómo se especifica qué usuario usa Hadoop para conectarse a un sistema remoto?

PS/Hadoop usa la configuración predeterminada, lo que significa que no se usa autenticación al conectarse al clúster y que Kerberos no se usa para comunicarse con las máquinas remotas.

Respuesta

37

Finalmente me encontré con la constante

static final String HADOOP_USER_NAME = "HADOOP_USER_NAME";` 

en el UserGroupInformation class.

Configurar esto como una variable de entorno, como una propiedad del sistema Java al inicio (usando -D) o programáticamente con System.setProperty("HADOOP_USER_NAME", "hduser"); hace que Hadoop use el nombre de usuario que desee para conectarse al clúster Hadoop remoto.

+0

Al tratar de resolver el problema, descubrí cómo debe usarse 'UserGroupInformation'. Podría ser interesante que sea posible ejecutar trabajos de Hadoop como cualquier usuario sobre un usuario de sistema común. Esto se llama * suplantación * en el lenguaje de Hadoop. Tenga en cuenta que esto requiere [configuración adicional del clúster hadoop] (http://hadoop.apache.org/common/docs/stable/Secure_Impersonation.html).También tenga en cuenta que aún no he logrado obtener este trabajo ... :-) –

+7

También puede simplemente establecer la variable de entorno HADOOP_USER_NAME. Eso también es suficiente :) –

+0

Funcionó para mí hoy y me ahorró muchas horas de trabajo. Gracias amigo – Mr37037

1

soy capaz de resolver problema similar usando la función segura suplantación http://hadoop.apache.org/docs/stable1/Secure_Impersonation.html

siguiente es el fragmento de código

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; 
} }); 

El mando a distancia (ventanas central de sobremesa en mi caso) de inicio de sesión ID de usuario debe añadir en el núcleo -site.xml como se menciona en el URL mencionado anteriormente

4

el siguiente código funciona para mí lo mismo 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; 
    } 
}); 
Cuestiones relacionadas